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]

[Photo of the Author]

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:
  1. Wie man die Linux AVR Entwicklungsumgebung installiert und benutzt und wie man einen Programmierer baut:
    M�rz 2002, Den AVR Microcontroller mit GCC programmieren
  2. 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]

[Illustration]

ArticleBody:[The article body]

Einf�hrung

lcd from tuxgraphics
shop.tuxgraphics.org verkauft sehr gute und günstige LCD Anzeigen.
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:
  1. Entfernen eines m�glichen Gleichspannungsanteils aus dem Signal und dann das Signal mit einem Komparator in ein Rechtecksignal verwandeln.
  2. 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:
[Schematic]

Die Platine, mit einem Klick auf das Bild erh�lt man eine gr��ere Ansicht:
[board]


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

[final case, open] [wooden frame] 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

[circuit] 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:
  1. L�te erst die Teile f�r die Spannungsversorgung (7805 etc...) auf die Platine und teste dann, ob sie funktioniert.
  2. L�te alle Teile auf die Platine, aber stecke nur den Microcontroller in den Sockel.
  3. 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.
  4. 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:
  1. Kontinuierlich hochz�hlen
  2. Frequenzz�hlen mit einer Gatterfrequenz von 1Hz. In diesem "mode" kann man Frequenzen bis 16bit messen (65535Hz) oder 6553500Hz mit dem 1/100 Teiler.
  3. 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]
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:
[the frequency counter]

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