Frequenzz�hler 1Hz-100Mhz mit LCD Display und RS232
Interface
ArticleCategory: [Choose a category, do not translate
this]
Hardware
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author + translation history. mailto: or
http://homepage]
original in en Guido
Socher
en to de Guido
Socher
AboutTheAuthor:[A small biography about the author]
Guido mag Linux nicht nur, weil es Spa� macht, die
gro�artigen M�glichkeiten, die dieses System bietet zu
entdecken, sondern auch wegen der Leute, die an seiner Entwicklung
beteiligt sind.
Abstract:[Here you write a little summary]
Dieser Artikel setzt unsere AT90S4433 Microcontroller Serie fort.
Ich schlage vor, die vorangegangenen Artikel �ber Atmel
Microcontroller im Hinblick auf folgende Punkte zu lesen, um diesen
Artikel besser verstehen zu k�nnen:
- Wie man die Linux AVR Entwicklungsumgebung installiert und
benutzt und wie man einen Programmierer baut:
M�rz 2002, Den AVR
Microcontroller mit GCC programmieren
- Wie man eine gedruckte Schaltung selbst herstellt:
Mai 2002, Eine LCD Anzeige
und Steuertasten f�r den Linux Server
Dieses Mal entwickeln wir einen Frequenzz�hler, der Frequenzen
im Bereich von 1Hz bis 100MHz messen kann. Alternativ kann man mit
dem Z�hler auch einfach Ereignisse z�hlen, wie z.B
wieviele Leute die Stra�e �berquert haben (oder was
immer auch in der Form eines digitalen Pulses verf�gbar ist).
Der Z�hler hat eine LCD Anzeige sowie einen RS232
Anschlu�, um die Z�hlerwerte mit Linux auszulesen.
ArticleIllustration:[This is the title picture for your
article]
ArticleBody:[The article body]
Einf�hrung
Die Frequenz eines Sinussignals oder Rechtecksignals wird
ausgedr�ckt durch die Anzahl der Schwingungen pro Sekunde. Um
die Frequenz zu ermitteln, mu� man also nur diese
Schwingungen z�hlen. Auf diese Art ermittelt man die Frequenz
der sogenannten ersten Harmonischen Schwingung eines
kontinuierlichen Signals. Um die Frequenzen, aus denen ein nicht
kontinuierliches "Ger�usch" besteht zu ermitteln, braucht man
einen Spectrumanalyser. Das ist jedoch ein ganz anderes St�ck
Hardware. Was wir hier bauen, ist ein Frequenzz�hler f�r
kontinuierlich oszillierende Signale. Wir nehmen an, da� sich
das Signal w�hrend eines Me�intervals nicht �ndert.
Der Frequenzz�hler arbeitet in zwei Schritten:
- Entfernen eines m�glichen Gleichspannungsanteils aus dem
Signal und dann das Signal mit einem Komparator in ein
Rechtecksignal verwandeln.
- Z�hlen der Pulse pro Zeiteinheit und dann den Wert durch
die Zeit teilen.
Was man braucht
Um den Frequenzz�hler zu bauen, braucht man folgende Teile:
1 x Atmel At90S4433 Microcontroller
1 x 28pin 7,25 mm IC Sockel
2 x 16pin IC Sockel
1 x 1pin IC Sockel
1 x 14pin IC Sockel
Keine IC Sockel f�r MAX903 und 74F74. Diese m�ssen
direkt auf die Platine gel�tet werden!
1 x MAX232
1 x 4,194304MHz Quarz
1 x LEDs (gr�n)
1 x BC557 PNP Transistor
4 x 1uF Kondensator (Elko)
2 x 27pF Keramikkondensator
4 x 10nF Mini- Keramikkondensator
3 x 100nF Mini- Keramikkondensator
1 x 200nF Mini- Keramikkondensator
1 x 0,47uF Mini- Keramikkondensator
2 x Widerstand 470 Ohm
1 x Widerstand 470K
2 x Widerstand 100 Ohm
3 x Widerstand 1k
5 x Widerstand 10k
3 x Widerstand 47K
1 x Widerstand 220 Ohm
3 x Widerstand 4K7
1 x Widerstand 3k3
1 x Widerstand 2k2
1 x Widerstand 47 Ohm
1 x 4K7 Potentiometer (so klein wie m�glich). Man kann das
Potentiometer auch durch zwei Widerst�nde ersetzen. Mit dem
Potentiometer stellt man den Kontrast des Displays ein. Bei meinem
LCD Display ergibt ein 100Ohm Widerstand zusammen mit einem 1K
Widerstand einen guten Kontrast.
1 x Z-Diode 4.3V
2 x kleine Taster
1 x 470uF Elko
1 x 4,7uF Elko
1 x 1N4001 Diode
1 x 74HC02 TTL IC
1 x 74F74 fast TTL IC
1 x 74HC390 TTL IC
1 x LM393 voltage Komparator
1 x MAX903 high speed voltage Komparator, 8 Pin plastic DIP
package, man kann dieses IC von www.maxim-ic.com bestellen, falls
der Laden vor Ort dieses IC nicht auf Lager hat.
1 x 7805 5V regulator
1 x 2 Zeilen 20 Zeichen LCD Display, HD44780 kompatibel mit oder
ohne Hintergrundbeleuchtung (16 Pin oder 14 Pin)
Alle LCD Displays mit 14 oder 16 Pins, die ich jemals gesehen habe,
waren HD44780 kompatibel. Man kann auch ein 3 oder 4 zeiliges
Display benutzen, aber dann mu� man die Software etwas
�ndern.
Zus�tzlich zu diesen Bauteilen braucht man noch einige
Dr�hte, Stecker (BCD, Stromversorgung, RS232) und einen 9V
Transformator oder ein anderes DC oder AC Netzteil mit 150mA.
Manchmal findet man sehr preiswerte Stromversorgungen, die sich
direkt in die Steckdose stecken lassen und f�r irgendwelche
Unterhaltungselektronik verwendet werden.
Schaltplan und Platine
Ich habe eagle f�r
Linux benutzt, um Schaltplan und Platine zu entwickeln. Das Programm
hat etwas Probleme, zu verstehen, da� all die
unterschiedlichen Stromversorgungsanschl�sse von den ICs immer
5V sind. Man erh�lt deshalb eine Fehlermeldung, wenn man den
"electrical rule check" benutzt. Der Entwurf ist jedoch
richtig.
Das Schaltbild, mit einem Klick auf das Bild erh�lt man einen
gr��eren Plan:
Die Platine, mit einem Klick auf das Bild erh�lt man eine
gr��ere Ansicht:
Die Platine ist speziell f�r Hobby Elektronik entwickelt. Die
blaue Lage soll in die Platine ge�tzt werden. Die roten Linien
sind Dr�hte. Es ist viel einfacher eine einseitige Platine
herzustellen, da die Genauigkeit nicht so gut sein mu�. Man
kann die roten Dr�hte so ziehen, da� m�glichst
kurze Wege entstehen. In Eagle konnte ich die roten Linien nicht so
ziehen.
Die Platine mit einem wei�en Hintergrund f�r einen
besseren Ausdruck: Platine mit
wei�em Hintergrund (Beachte: das ist nicht die
Datei, die man braucht um die gedruckte Schaltung herzustellen
)
Die Eagle Dateien sind zusammen mit der Software in dem Paket
linuxfreqcount-0.4 enthalten, das man am Ende des Artikels
herunterladen kann.
Wie es funktioniert
Der AT90S4433 Microcontroller hat zwei interne Z�hler. Einer
ist 16bit breit und der andere 8bit. Wir benutzen den 8bit
Z�hler, um eine genaue Zeitbasis aus der Frequenz des Quarzes
zu erzeugen. Zu diesem Zweck nehmen wir ein 4194304Hz Quarz und
schicken damit �ber einem internen 1/256 Vorteiler (siehe
AT90S4433 Datenblatt, herunterladbar am Ende des Artikels) Pulse an
den 8bit Z�hler. Der 8bit Z�hler ist so konfiguriert,
da� er bei einem �berlauf einen Interrupt erzeugt. Mit
anderen Worten, wir erhalten eine Zeitbasis von 4194304Hz / (256 *
256) = 64Hz. �ber eine Schleifenvariable k�nnen wir damit
Funktionsaufrufe in 1Hz oder 64Hz Intervallen erzeugen.
Nun haben wir eine Funktion, die in 1Hz oder 64Hz Intervallen
aufgerufen wird in Abh�ngigkeit von dem Modus, in dem der
Z�hler l�uft. Alles, was wir jetzt machen m�ssen, ist
den 16bit Z�hler in diesen Intervallen auszulesen und anzuzeigen.
Der 16bit Z�hler (Pin PD5 am Microcontroller) erh�lt
seine Pulse �ber das Signal, das wir messen wollen.
Der Microcontroller sampelt seine Eingangssignale, um sie mit dem
internen Takt zu synchronisieren. Gem�� des
Sampel-Theorems kann man damit Maximal- Frequenzen bis zur
H�lfte der Quarzfrequenz messen. Das ist die theoretische
Grenze. In der Praxis kann man Signale bis 1,5MHz mit dem
Microcontroller (bei einem 4Mhz Quarz) messen.
Um h�here Frequenzen zu messen, braucht man einen Vorteiler.
Dieser besteht in unserem Fall aus dem 74F74 und dem 74HC390 IC.
Der 74F74 wird als schneller 1/4 Teiler benutzt und der 74HC390 ist
ein 1/25 Teiler. Wir k�nnen den 74HC390 nicht direkt als 1/100
Teiler benutzen, weil er nur bis 25MHz geht.
Die Schaltung hat zwei Eing�nge. Einen �ber den 1/100
Teiler und einen direkten ungeteilten Eingang. In Abh�ngigkeit
der Frequenz, die du messen m�chtest, mu�t du einen der
beiden Eing�nge benutzen (einen, nicht beide).
Falls du nur Frequenzen bis 1.5Mhz messen m�chtest (z.B. um
den Frequenzgang des Verst�rkers deiner Stereoanlage zu
messen), kannst du auch eine vereinfachte Version bauen und
MAX903, 74F74 und den 74hc390 weglassen. Die Software bleibt die
gleiche, die Platine mu� man auch nicht unbedingt
�ndern.
Der Zweck der zwei voltage Komparatoren (MAX903 high speed, und
LM393) ist, die Signale zu verst�rken und Rechtecksignale zu
erzeugen (z.B. Rechteck aus einem Sinussignal).
Die Platine wurde mit gro�er Sorgfalt entworfen, um zu
vermeiden, da� die Komparatoren in der N�he des
Nulldurchgangs schwingen. Das kann besonders dann passieren, wenn
dem eigentlichen Eingangssignal noch ein leichtes Rauschen
�berlagert ist. Hat man z.B. ein 100KHz Signal dem ein
verrauschtes 1MHz Signal �berlagert ist (z.B. Radiowellen),
dann kann es passieren, da� einige 1MHz Pulse in der
N�he des Nulldurchgangs des 100KHz Signals mitgez�hlt
werden.
Der 220K Widerstand an dem MAX903 kann einen gewissen Anteil an
Rauschen unterdr�cken, indem er f�r positive
R�ckkopplung sorgt.
Der Microcontroller kann �ber RS232 und zwei Taster gesteuert
werden (ein "clear" Taster und ein "change counting mode" Taster).
Die zwei Eing�nge werden �ber ein Odergatter (74hc02)
kombiniert. Das Odergatter w�rde nat�rlich den Eingang
Blockieren, wenn man den Stecker aus dem 1/100 Eingang zieht,
w�hrend noch eine logisch "1" an dem Ausgang des 74hc390
liegt. Der 74hc390 wird daher gel�scht (pin 2), wenn man den
"counting mode" wechselt oder auf "clear" dr�ckt.
Die Software
Die Software f�r den Microcontroller konfiguriert zwei
Z�hler in Interruptmode. Wie das geht, ist in dem Datenblatt
des AT90S4433 beschrieben (siehe Referenzen). Man mu� dazu
einige Register setzen. Es ist ein wichtiger Teil, aber sehr
trocken. Ich werde es deshalb hier nicht wiederholen. Der
gr��te Teil der Frequenzz�hler-Logik ist in der
Datei linuxfreqcount.c
implementiert. Alle anderen Dateien sind "Bibliotheken" f�r
LCD UART, etc. ... Wenn man Software f�r den Microcontroller
schreibt, mu� man darauf achten, da� man nicht mehr als
128Bytes Ram benutzt. Das ist alles, was wir haben. Man sollte
geschachtelte Aufrufe vermeiden und wo sinnvoll, globale Variablen
benutzen.
Wenn die Z�hlerregister richtig gesetzt sind, dann wird die
Funktion SIGNAL(SIG_OVERFLOW0) im 64Hz Takt aufgerufen. Hier lesen
wir den 16bit Z�hler und setzen ein Flag (hflag), um
sp�ter das Ergebnis in der Funktion handlecounterresult()
weiter zu bearbeiten. Bei einer Gatterfrequenz von 1Hz kann man das
Ergebnis direkt anzeigen. Bei 64Hz mu� man mit 64
multiplizieren. Die Mathematikfunktionen, die man mit einem
Microcontroller ausf�hren kann, sind begrenzt (wir haben keine
sch�nen 32bit Register wie in einer Intel Pentium CPU).
Gl�cklicherweise ist ein "mal 64" nur ein Linksverschieben um
6 im Bin�rsystem. Wir speichern das Endergebnis in 3x 8bit
Variablen (counterval[3]).
Damit h�tten wir den richtigen Wert als eine 24bit Zahl. Um
sie anzuzeigen, m�ssen wir sie noch in dezimal ASCII
konvertieren. Printf w�rde das normalerweise machen, aber wir
haben kein printf. Wenn wir printf h�tten, w�rde es all
unseren Speicher aufbrauchen. Wir m�ssen deshalb unser eigenes
ganz spezielles printf schreiben. F�r die Bin�r- zu
Dezimal- Konvertierung teilen wir die 24Bit Zahl durch 10 mit Rest.
Der Rest ergibt unsere Dezimalzahlen. Unsere CPU kann keine 24bit
Mathematikoperationen ausf�hren. Deshalb m�ssen wir die
Zahl in 8bit St�cken verarbeiten (Funktion divby10()). Wenn
man am Ende zu jeder Zahl den ASCII Wert der Zahl "0" addiert,
erh�lt man schlie�lich eine ASCII Darstellung der Zahl
(Funktion longtoascii()).
Dieser ASCII String kann dann �ber die RS232 Schnittstelle
geschickt werden und im LCD angezeigt werden.
Erstellen einer gedruckten Schaltung
Das Softwarepaket enth�lt eine Postscriptdatei
(linuxfcount.ps) f�r die gedruckte Schaltung. Pers�nlich
finde ich, da� die L�taugen immer etwas zu klein sind.
Ich empfehle daher, alle L�taugen vor dem �tzen mit einem
Edding Paint Marker nachzuzeichnen. Wie man eine Platine erstellt,
ist in Mai 2002, Eine LCD
Anzeige und Steuertasten f�r den Linux Server beschrieben.
Einige Leser schrieben mir, da� sie Kontakt Pausklar-21 Spray
nicht kaufen k�nnen. Man kann statt diesem Spray auch einfach
Petroleum, wie es f�r Lampen benutzt wird, verwenden. Das
Petroleum mu� mit etwas Seife abgewaschen werden, bevor man
die Platine in den Entwickler steckt.
Wie man ein Geh�use f�r den Frequenzz�hler
baut
Ein
gro�es Problem f�r den Hobbyelektroniker ist oft das
Geh�use. Vorgefertigte Aluminiumgeh�use sind sehr teuer.
Ein genaues Biegen von Blechen ist mit den Mitteln der
Heimwerkstatt oft nicht m�glich. Ich habe eine, wie ich finde,
sehr gute L�sung dieses Problems gefunden. Ich benutze
Fichtenholz f�r die Seiten und Kanten. Man kann das Holz etwas
beizen, damit es "teuer" aussieht. Hier sollte man nur
wasserl�sliche Beizen benutzen. F�r die Front, oben und
unten, nimmt man gerade Aluminiumbleche und man braucht nichts zu
biegen. Einfach mit einer S�ge auf die richtige
Gr��e zuschneiden. Wie der Holzrahmen aussieht, kann man
auf der rechten Seite sehen. Links ist das fertige Geh�use
(die obere Abdeckung ist noch offen).
Zusammenl�ten der Platine
Beim
Zusammenl�ten sollte man den Hochfrequenzbauteilen etwas
Aufmerksamkeit schenken (MAX903, 74F74 mit Widerst�nden und
Kondensatoren). Ich empfehle normalerweise. Sockel zu benutzen, da
sie die Fehlersuche enorm erleichtern. In diesem Fall sollte man
die Bauteile aber direkt auf die Platine l�ten, um
parasit�re Kapazit�ten zu vermeiden. F�r die
Entkopplungskondensatoren zwischen Masse und Spannungsversorgung
sollte man kleine keramische Kondensatoren mit Werten zwischen 10nF
und 100nF benutzen.
Das ist die komplizierteste Schaltung, die wir bisher in LinuxFocus
gebaut haben. Ich empfehle, die Schaltung in Schritten aufzubauen
und dazwischen immer zu testen:
- L�te erst die Teile f�r die Spannungsversorgung (7805
etc...) auf die Platine und teste dann, ob sie funktioniert.
- L�te alle Teile auf die Platine, aber stecke nur den
Microcontroller in den Sockel.
- Das linuxfreqcount-0.4 Paket enth�lt ein Testprogramm,
avr_led_lcd_test.c, zum Testen des Microcontrollers, der LED und der
Anzeige. Verbinde die Schaltung mit dem Programmierkabel wie in dem
ersten AVR Artikel beschrieben (M�rz 2002, Den AVR
Microcontroller mit GCC programmieren) und tippe dann "make
testload", um die avr_led_lcd_test Software aus dem
linuxfreqcount-0.4 Paket zu laden. Die LED sollte blinken und auf
dem LCD sollte "Hello" zu sehen sein.
- Stecke nun alle ICs in die Sockel. Lade die endg�ltige
Software (make load) und teste erst den Niederfrequenzeingang. Man
braucht irgendeinen Frequenzgenerator (Sinus oder Rechteck
vorzugsweise).
Den Z�hler benutzen
Der Z�hler kann in verschiedenen "modes" arbeiten:
- Kontinuierlich hochz�hlen
- Frequenzz�hlen mit einer Gatterfrequenz von 1Hz. In diesem
"mode" kann man Frequenzen bis 16bit messen (65535Hz) oder
6553500Hz mit dem 1/100 Teiler.
- Frequenzz�hlen mit einer Gatterfrequenz von 64Hz. In
diesem "mode" kann man Frequenzen bis 1,5 MHz oder bis 100MHz mit
dem 1/100 Teiler messen.
![[ASCII commands via rs232]](../../common/images/article253/screenshoot_small.jpg) |
|
RS232 ASCII Kommandointerface. |
Man kann den "mode" �ber den Taster oder �ber RS232
�ndern. Die RS232 ASCII Befehle sind in README.commands
beschrieben. Wie man das RS232 ASCII Interface benutzt, ist in Mai 2002, Eine LCD Anzeige und
Steuertasten f�r den Linux Server beschrieben.
Die gr�ne Leuchtdiode zeigt an, da� das Gatter offen
ist. Das hei�t, jetzt k�nnen Pulse in den Z�hler
kommen.
Der zweite Taste ist gedacht, um den Z�hlerwert zu l�schen
(haupts�chlich, wenn der Z�hler zum kontinuierlichen
Z�hlen benutzt wird). Au�erdem kann man damit die
Anzeigendarstellung zwischen mit "100 multipliziert" und "normal"
wechseln. Damit erspart man sich kompliziertes Kopfrechnen, falls
man den 1/100 Teiler benutzt :-).
Wie genau?
Jeder digitale Z�hler hat eine maximale Genauigkeit von +/-1.
Die letzte Zahl wird sich immer etwas �ndern, selbst wenn das
Eingangssignal sehr stabil ist. Bei einer Gatterfrequenz von 64Hz
wird das Ergebnis intern mit 64 multipliziert. Damit ergibt sich
eine Genauigkeit von +/-64. Auf die gleiche Art hat der 1/100
Teiler Einflu� auf die Genauigkeit. Der Z�hler ist
jedoch sehr gut. Das Hauptproblem ist der Temperaturdrift des
4194304Hz Quarzes. Ein Quarz oszilliert langsamer, wenn es
w�rmer wird. Das ist Physik und man kann das nur �ber
eine Temeraturregelung in den Griff bekommen.
Es ist m�glich, den Z�hler zu kalibrieren, wenn man ein
gutes Referenzsignal hat. In der Software kann man kalibrieren,
indem man kleine Verz�gerungen in der Funktion
handlecounterresult() einbaut. Ich habe meinen Z�hler mit
einem Referenzsignal verglichen und er war fast 100% exakt. Der
Kalibrierungscode ist deshalb momentan auskommentiert. Man kann
auch die Frequenz des Quarzes etwas �ndern, indem man einen
der 27pF Kondensatoren �ndert (man mu� mit verschiedenen
Werten experimentieren 10pF, 50pF etc..).
F�r den normalen Hausgebrauch sehe ich jedoch keine Notwendigkeit,
etwas zu kalibrieren. Normale 4194304Hz Quarze sind schon sehr
genau.
Der Z�hler im Betrieb
Hier ist ein Foto des Z�hlers:
Weitere Projekte
In diesem Artikel wurde keine Auswertungssoftware geschrieben. Man
k�nnte sich z.B. vorstellen, da� man mit dem Z�hler
Windgeschwindigkeit oder andere Dinge an einem entfernten Ort
mi�t. Um Langzeitmessungen zu machen, kann man z.B die
Software aus Mai 2002, Eine
LCD Anzeige und Steuertasten f�r den Linux Server
�ndern. Wenn man die Daten jedoch einfach in eine Datei
schreiben m�chte, dann reichen folgende Befehle:
ttydevinit /dev/ttyS0
cat /dev/ttyS0 > your_logfile.txt
Hier wird angenommen, da� der Z�hler an COM1 (=ttyS0)
angeschlossen ist.
Wirklich einfach, nicht wahr:-)?
Referenzen