Beispiel-Software für reziproke Frequenzzähler etc.

Diverse Programmbeispiele mit reziprokem Meßverfahren

 

 
1. aktuelles Programmbeispiel für ATmega88 0,005Hz - 200 MHz
2. reziproker Frequenzzähler GPS-stabilisiert ATmega162
3. Drehzahlmessung
4. 4-Kanal Drehzahlmessung
5. altes Programmbeispiel für AT90S2313
6. Start-Stopp, Geschwindigkeit, Pulsweite
7. Frequenz-Periode-Drehzahl angepaßt für Arduino UNO R3
8. Frequenz-Spannungs-Wandler, ATmega48
9. Frequenz-Spannungs(PWM)-Wandler, ATtiny44
10. ATmega48 mit BASCOM-AVR 0,005Hz - 200 MHz
11. 5-stell. Zähler, 10mm 7-Segment multiplex, Einbaumodul, Batteriebetrieb
 
xx. weitere Frequenzzähler mit LED-Anzeige ff.
zurück zur Übersicht

 

Allgemein:

Die Programme wurden zumeist unter AVR-Studio 4.18 entwickelt. Zum Einrichten eines eigenen Projektes reicht die angehängte .c-Datei sowie die Einstellungen F_CPU = 2000000 sowie CPU = ATmega88. Die 'fuses' werden für max. Taktfrequenz und ext. Quarz gewählt; BOD auf 4,3V gesetzt.

 

1. aktuelles Beispielprogramm für ATmega88 erstellt mit AVR-Studio 4.18:

In der Datei AVR_FMETER.zip findet sich ein Projekt für das AVR-Studio 4.18 mit einem Programmbeispiel für einen ATmega88. Das Schaltbild dazu ist eine abgemagerte Version vom FMETER48, da einige Komponenten nicht berücksichtigt werden. Die Platine für FMETER48 kann aber verwendet und bei Bedarf nachgerüstet werden. Die .hex-Datei zum direkten Zugriff.

Die Eckpunkte des Programms sind:

Die prinzipielle Funktion von Schaltung und Programm ist hier bereits ausführlich beschrieben.
Wer es nicht so 'dicke' braucht, kann auch einen 74HC393 als Vorteiler ./. 256 verwenden und die Konstante im Programm entsprechend anpassen; für anspruchsvollere Anforderungen wird auf die neuen Versionen der Frequenzzähler verwiesen.

nach oben

2. reziproker Frequenzzähler GPS-stabilisiert, ATmega162 erstellt mit IAR-KickStart:

Alle hier beschriebenen Schaltungen haben als Taktquelle einen Quarz/TCXO/OCXO, die einmal abgeglichen für die Genauigkeit der Messungen maßgeblich sind. Bei der hier gezeigten Schaltung ist dies auch so, ein zusätzliches 1pps-GPS-Signal sorgt aber für einen automatischen, kontinuierlichen Abgleich im Sekundentakt. Zudem wird alle 10 Minuten der Korrekturwert zur Sollfrequenz im EEPROM gespeichert, sodaß auch ohne anliegendes GPS-Signal oder beim nächsten Einschalten eine abgeglichene Taktfrequenz vorliegt.

Die wesentlichen Eigenschaften der Schaltung sind:

Der Quellcode besteht aus einer einzigen .c-Datei. Die fertige .hex-Datei ist <4000 Bytes groß, sodaß mit dem kostenlosen, auf 4KB beschränkten KickStart-Paket noch ein wenig 'Luft' für eigene Programmanpassungen bleibt. Das Foto zeigt den Versuchsaufbau mit Messung der Quarzfrequenz im "TEST_LAUF".

Ein fertiges Programm (+ unbestückte Leiterplatte) für STM32F407 mit besserer Leistung und permanenter GPS-Stabilisierung wird hier beschrieben.

nach oben

3. Drehzahlmessung, ATmega88 erstellt mit AVR-Studio 4.18:

Anbei eine Schaltung und ein Programm für einen einfachen Drehzahlmesser sowie die .hex-Datei.

Die Schaltung ist einfach: sie besteht aus einem ATmega88, einer LC-Anzeige 2x16 und wenigen passiven Bauteilen.
Das Programm ist einfach: eine einzige .c-Datei wird mit den Grundeinstellungen des AVR-Studio übersetzt wird.

Gemessen wird im Grunde die Eingangsfrequenz; angezeigt werden Drehzahl ("D") und Zeit_pro_Umdrehung ("T") als 6-stellige Werte (gerundet). Die Berechnungen werden mit den 'float'-Routinen des AVR-GCC durchgeführt; das Programm benötigt ca. 5,4KB Programmspeicher. Gemessen wird lückenlos - jede Sekunde ein neuer Wert bei 60 rpm - und angezeigt werden drei Ergebnisse/s; eine LED signalisiert eine fertige Messung.

Zur Schaltung:
Der Prozessor ist mit der Anzeige wie gezeigt verdrahtet; die Pinbelegung ist 'historisch' gewachsen (beruht auf einem abgemagerten Frequenzzähler). Das Eingangssignal wird über den analogen Komparator dem ICP des Timer1 zugeführt. Das hat den Vorteil, dass die Eingangsbeschaltung variabel ausgelegt und bei Bedarf die Eingangsempfindlichkeit auf einige 10mV erhöht werden kann. So lassen sich z.B. R4 und C3 als Widerstände 2M2 bestücken und D1 gegen einen Kondensator 100nF austauschen, wenn sehr kleine Drehzahlen nicht erwartet werden.

2013-08-12:
Das Programm ist um die Funktion "automatischer Abgleich" erweitert worden. Mit Hife eines Referenzsignals von 1Hz - am besten von einem GPS-Empfänger - wird intern ein Korrekturwert errechnet und im EEPROM gespeichert. Bei anliegendem Referenzsignal werden rund 60Upm und 1s angezeigt. Schaltet man nun den Eingang PORTC.2 gegen GND werden nach der aktuellen Messung Soll- und Istwert miteinander verglichen. Da das Referenzsignal eine Messdauer von genau 1s vorgibt, muß die intern gemessene Zeit (bei typ. 20MHz F_CLOCK) genau 20000000 ergeben. Die Abweichung zu diesem Wert ist der Korrekturwert.
2013-09-16:
Der 'Fangbereich' für die Quarzfrequenz wird von +/-100ppm auf +/-1000ppm erhöht.

Möchte man den Abgleich mit einem anderen Referenzsignal durchführen, kann man dazu den Korrekturwert selbst errechnen und direkt im EEPROM an Adr. 2-3 (low-high) als 'int16_t' ablegen.

nach oben

4. 4-Kanal Drehzahlmessung, ATmega88 erstellt mit AVR-Studio 4.18:

Die vorliegende Schaltung nebst Programm eignet sich speziell für tiefere Drehzahlen (Frequenzen) und wertet diese lückenlos aus.
Anstatt ein einzelnes Signal zu messen, werden hier 4 Kanäle mit je 5-stell. Auflösung gleichzeitig gemessen. Die .c-Datei wurde unter AVR-Studio 4.18 erstellt. Benutzt werden die float-Routinen, die AVR-GCC zur Verfügung stellt. Es findet keinerlei Programmierung in Assembler statt. Mit 5,5KB Code läßt ein Atmega88 noch genug Platz für eigene Anpassungen. Damit die angezeigten Werte auf eine Anzeige 2 x 16 passen, wird ein Startbildschirm mit der Kanalzuordnung (einmalig zum Programmstart) und ein Ergebnisbildschirm mit den Messwerten angezeigt.

typ. Daten:

zur Schaltung:
Die Schaltung benötig nur wenige Bauteile: Atmega88 + LCD 16x2 + Kleinteile. Die Signale werden an den Eingängen PC.2 - PC.5 (1.Kanal - 4.Kanal) erwartet. Pullups sind aktiviert, sodaß Hallsensoren oder prellfreie Signalquellen direkt angeschlossen werden können. Die LC-Anzeige nebst Programmierstecker werden lt. Schaltbild angeschlossen.

zum Programm:
Die Eingangsimpulse lösen den PCINT1-Interrupt aus, welcher nur die negativen Flanken wertet. Fortlaufend erfaßt werden die Anzahl der Impulse und der Zeitpunkt des letzten Impulses. Gleichzeitig wird grob ermittelt, wie lange die laufende Messung andauert. Hierfür werden die Überläufe von T1 im 3,3ms Raster genutzt. Dies geschieht für alle vier Kanäle gleichzeitig.
Die Auswertung erfolgt mit den Differenzen der Anzahl der Impulse und der Zeit (Endwert - Startwert). Abschließend werden die aktuellen Endwerte als Startwert für die nächste Messung abgelegt. Auf diese Weise geht kein Eingangsimpuls verloren. Der Zähler der Messdauer wird gelöscht und die neue Mindestzeit abgewartet. Dazu die .hex-Datei.

Auswertung und Anzeige eines Signals erfolgen hier asynchron zu den Eingangsimpulsen; daher müssen folgende Bedingungen eingehalten werden:
1. eine Mindestzeit von 0,33 Sekunden ist seit der letzen Auswertung verstrichen
2. mindestens ein Eingangsimpuls ist aufgetreten
3. zwischen Beginn der Messung und letztem Impuls ist eine Mindestzeit abgelaufen.

zu 1.
Für eine 5-stellige Auflösung bei 330ms (Mindest-)Messdauer muß die Zeit auf 3,3µs genau erfaßt werden. Die PCINT1-Routine 'schafft' dies, wobei die Dauer des Interrupts auch vom gleichzeitigen Auftreten der Eingangsimpulse abhängt. Selbst wenn die 3,3µs überschritten werden, ist dies kaum nachteilig, da eine Anzeige immer mit +/- 1 Digit gewertet werden sollte.

zu 2.
Ohne Eingangsimpuls kann natürlich nichts gemessen werden. Nach 60 Sekunden ohne Eingangsimpuls (timeout), wird die Anzeige des Kanals gelöscht (Anzeige von "-.-").

zu 3.
Gleich zu Beginn einer neuen Messung kann zum Beispiel nach 1ms ein Impuls eintreffen und danach kein weiterer. Bedingungen 1. und 2. wären erfüllt, das eff. Meßintervall aber zu kurz, um daraus fünf gültige Stellen abzuleiten. Im Programm wird daher ein Mindestintervall von 250ms vorgegeben (F_CLOCK/4).

Angezeigt werden die vier Kanäle auf einem 'üblichen' 16x2 Display, was aber wenig Raum für formatierte Ausgaben bietet. Drehzahlen von 1.0000 - 99999 werden dimensionslos mit korrekter Auflösung gerundet angezeigt. Um Werte von 100000 - 5000000 (max. bei nur einem Kanal) unverstümmelt auszugeben, werden die 6. oder ggf. 7. Stelle als '0' angezeigt. Wem dies nicht gefällt kann eine andere Anzeige verwenden (beispielsweise 4 x 20) und das Ausgabeformat optimieren.

nach oben

5. ursprüngliches Programmbeispiel für AT90S2313 mit IAR-Compiler:

Das Quellprogramm 'fm.c' zeigt ein Programmbeispiel für das Meßverfahren beim reziproken Frequenzzähler. Der erzeugte HEX-Code ist auf der beschriebenen Schaltung zum Frequenzzähler lauffähig, wobei feste Vorgaben bestehen: maximal drei Messungen/Sek., 7-stellige Anzeige, kein Vorteiler, keine zusätzlichen Schalter oder Optionen, keine Ausgabe über TxD-Leitung. Das Eingangssignal wird an PB0/AIN0 erwartet. Der Eingangsfrequenzbereich umfaßt 0,0025Hz bis ca. 140kHz. Angezeigt werden Frequenz und Periodendauer.

2003-10-02 Programmänderung:
Es ist nun ein /256 Vorteiler manuell zuschaltbar (wie im Schaltplan gezeigt), sodaß die max. Eingangsfrequenz jetzt 35MHz beträgt. Dazu muß PORTD.3 auf GND geschaltet werden; andernfalls wird ohne Vorteiler gemessen - wichtig bei sehr tiefen Frequenzen.

Die Anzeige der Ergebnisse wurde auf 6-stellig reduziert !
2010-12-11 Vollversion ohne Quellcode für ATtiny2313 mit 20MHz: fmeter20.zip

nach oben

6. Start-Stopp, Geschwindigkeit, Pulsweite; ATmega88 erstellt mit AVR-Studio 4.18:

Stoppuhr:
Die gezeigte Schaltung misst die Zeit zwischen zwei Flanken an INT0 und INT1 und bringt sie zur Anzeige. Es werden die negativen Flanken gewertet; die Pullpus an den Eingängen sind aktiviert. Wird einer (oder beide) der Eingänge zur Flankenwahl gegen GND geschaltet, wird die betreffende positive Flanke ausgewertet. Sofern sich die Impulse nicht überlappen kann man mechanische Taster anschließen; ein Prellen stört nicht, da nur die allererste Flanke die Messung startet oder stoppt.

Geschwindigkeit:
Zudem wird die Geschwindigkeit aus der Zeit errechnet, in welcher ein Körper eine Distanz von 0,1 m (100 mm) zurücklegt. Für einen einfachen Messaufbau reichen zwei Lichtschranken im Abstand von 100 mm, durch die sich das Objekt bewegt. Da offene Lichtschranken mit Fototransistor einen low-Pegel liefern, wird die hintere Kante des Objektes beim Austritt aus der Lichtschranke gemessen.

Pulsweite:
Wird ein Signal gleichzeitig an beide Eingänge gegeben, so ergibt sich als Messwert bei gleicher Flankenauswertung die Dauer eine einzelnen Periode. Durch Umschalten einer Flanke wird entweder die positive oder negative Pulsweite des Signals gemessen - bezogen auf die Flanke an INT0.

angezeigt wird auf einem LCD 2 x 16:
"t:   3.7355 ms  "
"v:   26.770 m/s "

Die Ergebnisse werden 5-stellig mit max. 50 ns Auflösung und einem max. abs. Fehler von 1µs angezeigt; die angezeigten Werte sind entsprechend zu bewerten. Bei schneller Impulsfolge werden max. 100 Messungen/s erreicht. Hier ist noch das Programm zur Schaltung. Dazu auch noch die .hex-Datei.

nach oben

7. Frequenz-Periode-Drehzahl, angepaßte Version für Arduino UNO R3

Basierend auf dem hier verwendeten Programm ist das Programm Fmeter_UNOR3.ino für die direkte Verwendung auf dem genannten Board angepaßt. Der Vorteiler und die LED-Anzeige entfallen. Die Datenausgabe erfolgt über die RS232-Schnittstelle, die direkt von einen PC über einen USB-Port zur Verfügung steht.

Das Eingangssignal wird an IO7 (PD7/AIN1) erwartet und kann im Bereich 0,016Hz - ca. 250kHz liegen.
Gemessen werden Frequenz, Periode oder Drehzahl in Abhängigkeit des Signals an A0 (ADC0).

'1' oder offener Eingang: Frequenz
'0' oder Brücke nach GND: Periode
Vcc/2 oder 10-47k nach GND: Drehzahl

Die Ergebnisse werden 6-stellig mit entsprechender Angabe der Dimension per RS232 (IO1 bzw. TXD/PD1) ausgegeben oder per USB-Anschluß, wie es der Arduino UNO R3 mit seinem 'Serial Monitor' bietet.

automatischer Abgleich mit 1Hz-Referenzsignal / GPS per Eingangs A1 (ADC1):
Für diesen Abgleich wird das 1Hz Signal an den Signaleingang gelegt und über Tools/Serial Monitor die Datenausgabe verfolgt. Die angezeigte Frequenz muß um 1Hz mit +/-1000ppm liegen, was 0,999 Hz - 1.001 Hz entspricht. Der Eingang A1 wird nun gegen 0V/GND geschaltet und damit der automatische Abgleich gestartet. Die Meldung "Abgleich fertig" zeigt an, dass der Korrkturwert berechnet und abgespeichert wurde. Anschließend werden die Ergebnisse mit "1.00000 Hz" angezeigt.

Der Aduino UNO R3 ist mit einem kermischen Resonator 16MHz bestückt, der keine sonderlich genaue oder stabile Taktfrequenz bietet. Die Frequenz ändert sich mit schwankender Temperatur sehr deutlich. Um dies zu verbessern, kann man den keram. Resonator entfernen und den 16MHz Takt des ATmega16U2 verwenden, der mit einem 16 MHz Quarz erzeugt wird. Dazu werden die beiden Anschlüsse XTAL1 auf der Platinenunterseite mit einer kurzen Leitung verbunden: Pin1 des ATmega16U2 an Pin9 des ATmega328. Ein Bild macht dies deutlich.
Diese Lösung ist technisch nicht ganz perfekt, funktioniert aber und liefert deutlich bessere Stabilität. Ein separater Quarz nebst 2 x 22pF Kondensatoren wäre eine bessere Lösung.

Wenn alle sechs Stellen über die Temperatur bzw. Zeit stabil bleiben sollen, ist ein TCXO als Taktgeber notwendig. Das ist die aufwendigste aber auch beste Lösung.

2015-09-03: Vorteiler bis ca. 7 MHz
Eine weitere Programmversion für den Arduino verwendet den Timer0 als Vorteiler 1/100, sodaß Frequenzen bis ca. 7,4 MHz gemessen werden können. Der Eingang des Vorteilers liegt an IO4 (PD4/T0) und der Ausgang an IO6 (PD6/OC0A) der per Drahtbrücke direkt auf IO7 geschaltet wird: Fmeter_UNOR3_mod.ino. Ferner ist der Meßablauf geändert, sodaß die Auswertung (nicht aber die Messung selbst!) nicht mehr synchron zum Eingangssignal passiert, sondern im vorgegebenen Zeitraster. Im Programm sind dies 100 ms, die gewartet werden, bis die bis dahin eingetroffenen Impulse ausgewertet werden. Da minimal ein Eingangsimpuls benötigt wird, wird dieses Zeitraster erst ab Frequenzen > 10 Hz wirksam; bei niedrigeren Frequenzen muß entsprechend länger (eine ganze Periode) gewartet werden. Hierdurch werden bei genügend hoher Eingangsfrequenz im Mittelwert immer 10 Messungen/s ausgeführt. Weiterhin wird bei fehlendem Eingangssignal der Wert "0.00000 <dim>" ausgegeben. Die Zeit wird durch den Wert von TIMOUT vorgegeben. Ein Wert von 1000 entspricht einer Sekunde und kann zum Beispiel bei der Drehzahlmessung den Stillstand (<= 60 U/min) anzeigen, der dann jede Sekunde erneut ausgegeben wird.

nach oben

8. Frequenz-Spannungs-Wandler, ATmega48

Übliche Frequenz-Spannungs-Wandler arbeiten mit der Integration von definierten Impulsen, die mit einer Flanke des Eingangssignals ausgelöst werden. Je höher die Eingangsfrequenz liegt, um so mehr Impulse werden erzeugt und die Ausgangsspannung des Integrators steigt entsprechend an. Bei niedrigen Frequenzen hat dieses Verfahren den Nachteil, eine lange Einschwingzeit zu benötigen.

Um diesen Nachteil zu vermeiden, wird im Programm F2U_konverter.c eine schnelle, reziproke Frequenzmessung durchgeführt und das Ergebnis passend skaliert über einen DA-Wandler ausgegeben. Als DA-Wandler wird hier ein MCP4821/22 mit 12-Bit Auflösung verwendet. Mit der internen Vref von 2,048V ergibt sich die max. Ausgangsspannung von 2,0475 V. Somit ist die gesamte Schaltung für 3V3-Versorgungsspannung geeignet. Hier wird die Ausgangsspannung mit 2-facher Verstärkung ausgegeben (per Software eingestellt), weshalb die gezeigte Schaltung mit 5 V betrieben werden sollte.

Im Grunde würde die Messung einer einzelnen Periode des Eingangssignals genügen, um eine möglichst hohe Meßrate zu erreichen. Allerdings muß bzw. sollte das Ergebnis der Periodendauer besser aufgelöst sein, als die Auflösung des DA-Wandlers. Die nominale Taktfrequenz im Beispielprogramm beträgt 10 MHz. Geteilt durch die Auflösung von 4096 (12-Bit des DACs) liegt die max. Meßrate bei rund 2,4 kHz.
Im vorliegenden Programm wird die Meßrate auf 1 kHz begrenzt, wofür die definierte MIN_MESSZEIT auf 1 ms gesetzt wird. Bei Frequenzen > 1 kHz werden daher mehrere Perioden gemessen und durch das Meßverfahren gemittelt. Bei Signalfrequenzen < 1 kHz entspricht die Meßrate der Eingangsfrequenz, wobei dann genau eine Periode des Eingangssignals gemessen wird.

Die .hex-Datei ist für einen ATmega48 übersetzt und läuft auch direkt auf einem ATmega88. Als DAC reicht ein einkanaliger MCP4821; dennoch kann ein MCP4822 mit zwei Ausgangskanälen verwendet werden. Die Spannung wird am Ausgang 'A' ausgegeben; Kanal 'B' bleibt unbenutzt. Der Widerstand R2 ist nur beim MCP4821 notwendig, da Pin 6 als /shutdown-Eingang verwendet wird.
Ein Beispielprogramm, welches aus einer Eingangsfrequenz eine frei skalierbare Ausgangsfrequenz erzeugt, findet sich hier.

nach oben

9. Frequenz-Spannungs(PWM)-Wandler, ATtiny44

Während der zuvor gezeigte Frequenz-Spannungs-Wandler seine Ausgangsspannung per separatem DAC sehr schnell ausgeben kann, wird bei dieser Schaltung mit dem ATtiny44 der DAC eingespart und die Ausgangsspannung per Tiefpassfilter aus einem erzeugten PWM-Signal gewonnen. Für die genaue reziproke Frequenzmessung und die PWM-Ausgabe wird allein der Timer1 des Prozessors benötigt. Die PWM-Frequenz beträgt ca. 11,7 kHz; der PWM-Wert ist mit 10 Bit (1/1024) abgestuft, was rund 0,1% entspricht. Das anschließende Tiefpassfilter kann je nach Anforderung mit 1. bzw. höherer Ordnung ausgelegt werden. Ein OPV zur Pufferung ist zu empfehlen. Das Programm F2U_Tiny44.c zeigt die Funktion. Die fertige Datei F2U_Tiny44.hex erwartet einen externen 12 MHz Quarz und eine Versorgungsspannung von Vcc=5.00 V, um einen Umsetzfaktor von 1 V/kHz zu erhalten.

Benötigt man nur eine grobe Abschätzung der Eingangsfrequenz, kann der interne 8 MHz Taktgeber (erreichbare Genauigkeit ca. 1%) verwendet und die Auflösung der PWM auf acht Bit (1/256) verringert werden. Für Anwendungen, bei denen die Ausgangsspannung per Multimeter angezeigt werden soll, könnte dies völlig ausreichend sein.

nach oben

10. Beispielprogramm mit BASCOM-AVR für ATmega48:

Für das Programmbeispiel ganz oben gibt es auch eine Version für BASCOM-AVR, die mit einer auf 4k-Code begrenzten Demoversion erstellt wurde. Das Schaltbild dazu ist identisch und eine abgemagerte Version vom FMETER48, da einige Komponenten nicht berücksichtigt werden. Die Platine für FMETER48 kann aber verwendet und bei Bedarf nachgerüstet werden. Es gibt zwei Versionen, von denen die erste komplett ohne Assembler Befehle erstellt ist, aber nicht so hohe Eigangsfrequenzen zuläßt. Bei beiden Versionen lassen sich auch einzelne oder alle Messwerte über die ser. Schnittstelle ausgeben.
Ein " PRINT ergebnis_str" sendet den zuletzt gewandelten Wert.
Die Eckpunkte des einfachen Programmes fm48_bas sind:

Wichtig: Bei dieser einfachen Programmversion sollte R4 im Schaltbild 47 kOhm betragen, um die obere Frequenz des Signals an AIN0 auf ca. 100 kHz zu begrenzen!

Wer es schneller braucht nimmt die erweiterte Programmversion, bei denen die Interruptroutinen in Assembler geschrieben sind. Damit ergeben sich deutlich verbesserte Daten, insbesondere, wenn man keinen Vorteiler verwenden möchte.
Bessere Daten der 2. Programmversion fm48_bas1:

Die prinzipielle Funktion von Schaltung und Programm ist hier bereits ausführlich beschrieben.
Wer es nicht so 'dicke' braucht, kann auch einen 74HC393 als Vorteiler ./. 256 verwenden und die Konstante im Programm entsprechend anpassen; für anspruchsvollere Anforderungen wird auf die neuen Versionen der Frequenzzähler verwiesen, für die allerdings kein Quellcode verfügbar ist.

nach oben

11. 5-stell. Zähler, 10mm 7-Segement multiplex, Einbaumodul, Batteriebetrieb

Während die weiter oben aufgeführten Schaltungen/Programme möglichst genaue Meßwerte mit vielen Stellen ermöglichen, geht es bei dieser Schaltung darum, ein Einbaumodul mit gut lesbarer 7-Segmentanzeige (10 mm rot) mit weitem Versorgungsspannungsbereich zu erhalten. Als Stromversorgung eignet sich eine LiIon Zelle mit nominell 3,6 bzw. 3,7 V. Die automatische Abschaltung bei fehlendem Eingangssignal kann die Stromaufnahme auf < 1 µA senken, sofern ein neuerer P-Typ µC eingesetzt wird: ATmega88PA zum Beispiel.
Bei den älteren Ausführungen kann der BOD im Programm nicht abgeschaltet werden, sodaß die Stromaufnahme bei einigen µA bleibt, wenn der BOD verwendet wird.

Die typischen Daten sind:

Die Schaltung:

Neben der Grundschaltung zur Ansteuerung der Anzeige und den Status-LEDs sind die Eingangsschaltung und die optionalen Vorteiler zu sehen. Die Stromversorgung erfolgt über den Signaleingang, bei dem abhängig von der Signalquelle unterschiedliche Bestückungsvarianten möglich sind. Für minimale Stromaufnahme bei autom. Abschaltung bleibt R10 unbestückt und der Eingang über R13 auf GND-Pegel gehalten. Dadurch bleibt T7 gesperrt und über den aktiven Pullup-Widerstand von PD7 fließt kein Strom. Es werden positive Eingangssimpulse in Höhe der Versorgungsspannung erwartet. Alternativ zu R13 kann R10 bestückt werden (typ. 3k3 - 100 kOhm), um als Pullup-Widerstand negative Eingangsimpulse eines Impulsgebers mit offenem Kollektor / Reedkontakt zu dienen. Bei offenem Eingang und fehlendem Eingangssignal bleibt eine Ruhestromaufnahme von <= 0,2 mA bei autom. Abschaltung.

R12 und T7 begrenzen die Eingangsfrequenz von PD7 auf rund 300 kHz, was bei 5 V Versorgungsspannung und einer Taktfrequenz des µC von 20 MHz ausreichend ist. Bei 3,3 V @ 12 MHz ist zusätzlich C1 erforderlich, um den µC vor zu hoher Eingangsfrequenz zu schützen. Da die Zählung der Eingangsimpulse per Interrupt erfolgt, würde eine zu hohe Eingangsfrequenz dem µC keine Zeitreserve zum Ansteuern der Multiplexanzeige zu lassen: sie würde flackern und ggf. stehen bleiben.

Für höhere Eingangsfrequenzen ist ein Vorteiler vorgesehen, der je nach Bedarf durch unterschiedlich schnelle Teiler ICs bestückt werden kann. Das jeweilige Datenblatt gibt darüber Auskunft, wie hoch die max. Arbeitsfrequenz in Abhängigkeit von der Versorgungsspannung sein kann. Der 74VHC4040 geht bis 200 MHz @ 5 V. Der Vorteiler ist permanent aktiv und liefert das /1024 geteilte Siganl an PB0 (VT-OUT). Die Frequenz an PB0 wird überwacht und als Eingang für die Frequenzmessung aktiviert, sobald die Eingangsfrequenz >= 50 kHz liegt. Sinkt die Eingangsfrequenz auf <= 25 kHz, wird PD7 wieder als Zählereingang aktiviert. Diese Umschaltung erledigt das Programm automatisch.

Funktionsanwahl:
Am Steckverbinder ST2 sind freie Eingänge des µC herausgeführt, mit denen sich die Messfunktionen auswählen lassen. Ein einpoliger Schalter EIN-MITTE-EIN reicht dafür aus.

Funktion: Eingang S-1 Eingang S-2 Eingang ADC7
Frequenz offen offen offen
Periode GND offen  
Drehzahl offen GND  
       
Spannungsanzeige GND GND  
1 Hz Abgleich (GPS) offen offen GND

S-1 und S-2 können nach Bedarf offen bleiben oder mit einer Steckbrücke gegen GND geschaltet werden. Die Spannungsanzeige wird aktiviert, sobald beide Eingänge auf GND liegen. Ein einpoliger Taster mit einer Doppeldiode BAT54C wäre eine Möglichkeit, die Kontrolle der Versorgungsspannung (Batterie) zu aktivieren.

Abgleich:
Die einfache Methode für einen schnellen und genauen Abgleich ist, ein hinreichend genaues 1 Hz Signal an den Signaleingang zu legen (1 pps GPS-Signal) und anschließend ADC7 auf GND zu schalten. Damit wird ein Korrekturwert errechnet, der ins EEPROM geschrieben auch nach Unterbrechung der Versorgungsspannung wieder zur Verfügung steht. Der Abgleich wird durch kurze Anzeige von "88888" inkl. aller Dezimalpunkte quittiert.

Eine weitere Möglichkeit wäre, diesen Korrekturwert nachträglich direkt ins interne EEPROM zu schreiben oder schon bei der Übersetzung des Programmes die Taktfrequenz entsprechend anzupassen. Da bei 5-stelliger Anzeige die kleinste Änderung in der letzten Stelle einer Abweichung von 10 ppm entspricht, können die Korrekturwerte recht grob angepaßt werden. Die Drift der Quarzfrequenz wirkt sich deutlich weniger stark aus als bei einer 6- oder 7-stelligen Auflösung der Messung.
Ganz ohne Programmierung läßt sich die Quarzfrequenz auch durch Änderung der Lastkondensatoren C4 und C5 abgleichen.

Bilder zum Aufbau der Schaltung:

 
Bestückungsplan der Leiterplatte   Ansicht auf die Anzeigen und den Vorteiler; R13 = 1 MOhm
     
 
bestückte Leiterplatte ohne R10   Anzeige mit Frontrahmen und Zuordnung der Status-LEDs

Anmerkung zur Helligkeit der Anzeige:
Empfehlenswert sind 7-Segmentanzeigen mit hoher Helligkeit. Die Abbildungen zeigen den Typ ELS432SURWA/S53 mit 29 mcd @ 20 mA. Ein weiterer handelsüblicher Typ ist SC39-11 RT mit 31 mcd @ 20 mA. Bei 5 V Versorgungsspannung beträgt der Spannungsabfall an den Widerständen R1 - R8 rund 1,7 V, woraus sich bei 82 Ohm ein Strom von ca. 21 mA ergibt. Durch das 6-fach Multiplexen (5 x Digits, 1 x LEDs) beträgt der eff. Segmentstrom rund 3,5 mA/Segment. Damit ist die Anzeige in Innenräumen recht hell unter Umständen sogar zu hell, was man durch größere Widerstandswerte nach Bedarf anpassen kann. Auf der anderen Seite sinkt die Helligkeit der Anzeige bei kleinerer Versorgungsspannung, ist bei 3,3 V dennoch völlig ausreichend. Kleinere Werte für R1 - R8 können die Helligkeit wieder erhöhen. Wichtig für gute Lesbarkeit ist immer ein guter Kontrast der Anzeige, wie er mit einer Farbfilterscheibe erreicht wird.

Da der µC die Segmentströme direkt liefern muß, ist der Spitzenwert für acht Segmente 168 mA (8 x 21 mA) bei 5 V. Dies liegt unter den maximalen Werten von 40 mA pro Portpin und von 200 mA für die max. Ströme durch VCC- bzw. GND-Anschlüsse.

Das Programm 'fmeter_5x7.c' kann den eigenen Bedürfnissen angepaßt werden, wobei darauf zu achten ist, daß eine zusätzliche Interruptquelle den globalen Interrupt sofort wieder frei geben muß: sei(); gleich am Anfang der ISR!
Der Programmcode 'fmeter_5x7.hex' ist für einen ATmega48P generiert und läuft damit direkt auch auf einem ATmega88P. Bei Programmieren sollten der BOD auf 2,7 V eingestellt und der Oszillator für ext. Quarz konfiguriert werden.

nach oben

 

spannungsgesteuerter Pulsgenerator: 10Hz -> 5kHz; 1µs -> 30µs: Beitrag wurde hierhin verschoben.
RS232 programmierbarer Impulsgenerator 0,01Hz - 50kHz, 5µs - 10s: Beitrag wurde hierhin verschoben.

nach oben

Kontakt:

zurück zur Übersicht