Beispiel-Software für reziproke Frequenzzähler

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
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 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".

nach oben

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

Anbei eine Schaltung und ein Programm für einen einfachen Drehzahlmesser.

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.

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.

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.

nach oben

Kontakt:

zurück zur Übersicht