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.
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.
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".
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.
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.
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
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.
Kontakt:
![]()