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 .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.
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.
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.
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.
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. Dazu auch noch die .hex-Datei.
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.
Ü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.
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.
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.
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.
2020-10-12:
Frequenzzähler mit 8-Bittern gibt es viele, die für die meisten Anforderungen
ausreichen. Geht es jedoch darum höhere Auflösungen oder besonders hohe Messraten
zu erreichen, stößt man damit schnell an Grenzen. Nachfolgende Schaltung/Programm
zeigen einen reziproken Frequenzzähler mit einem schnellen µC, der ohne große
ext. Beschaltung 8-stellige Messwerte/s im Bereich 0,1 Hz – 100 MHz liefert.
Wird diese hohe Auflösung nicht benötigt, ermöglicht die hohe Rechengeschwindigkeit
auch 'locker' 1000 Messungen/s mit 5-stell. Auflösung. Das alles mit gerigem
Aufwand, zu geringen Kosten.
Hardware:
Die gezeigte Schaltung ist auf die Funktionen/Bauteile reduziert, die notwendig
sind, um eine beispielhafte Messung über den Eingang F2 zu zeigen. Von oben
nach unten sieht man den Spannungsregler 5 -> 3,3 V. Weiterhin den SWD-Steckverbinder
zur Programmierung und den RS232 Treiber für die ser. Schnittstelle USART3.
Das Eingangssignal geht über den Inverter IC13 an das D-FF IC3, welches zur
Synchronisierung der Auswertung mit den Eingangsimpulsen benötigt wird.
Abschließend erzeugt ein TCXO die 10 MHz Referenzfrequenz für den µC. Ein genauer
Abgleich ist mit einem VCTCXO und 10-Gang Trimmer möglich. Dazu werden R9 und
R11 mit je 10 kOhm bestückt. Das Trimmpoti wird an +3.3 und GND angeschlossen.
Die Spannung vom Schleifkontakt wird über einen weiteren 10 kOhm Widerstand
an Pin1 des VCTCXO eingespeist.Das gekappte Sinussignal wird über einen Inverter
aufbereitet und dann auf den Takteingang PH0 des µCs geführt. Der gezeigte Multiplexer
IC14 wird nicht benötigt und kann durch Verbinden von Pin3 und Pin4 überbrückt
werden.
Abweichend von der Beschriftung im Schaltplan (STM32H750) ist das nachfolgende Programm für STM32F7xx geschrieben, wobei als Minimalversion ein STM32F730 reicht. Andere Controller der F7xx-Reihe sind pin- und funktionskompatibel. Nach Programmanpassung können auch µCs der H75x-Reihe verwendet werden, die pinkompatibel sind.
Software:
Die Software mißt die Frequenz an Eingang F2 reziprok und lückenlos mit einer
Auflösung von 8 Stellen/s. Die Ausgabe der Ergebnisse erfolgt per RS232 mit
115200 Baud. Die angehängte "Fmeter_F730_V1.zip"
zeigt ein Projekt mit einer IAR-IDE V8.xx für ARM Controller. Mit der kostenlosen
Demoversion sollte sich das Projekt direkt aufrufen und bearbeiten lassen. Die
Codebeschränkung auf 32 kB stellt hier kein Hindernis dar. Aktuell werden ca.
12 kB benötigt. Andere IDEs/Compiler sollten kein Problem sein, wobei darauf
geachtet werden muß, die Dateien "main.c", "F2_messung.c" und "usart3.c" nebst
einigen .h-Files für den STM32F730 einzubinden.
Das Projekt baut auf der von STM32CubeMX erzeugten "main.c" auf. Die Hauptaufgabe
von "main.c" besteht darin, Caches und Interrupts zu konfigurieren und die Taktfrequenz
des Systems von ext. 10 MHz auf 216 MHz (SystemCoreClock) einzustellen. Das
HAL-Zeugs ist ohne Belang und wird im weiteren Programmablauf ignoriert. In
main() wird einmalig die Frequenzmessung mit F2_messung(1) gestartet und in
einer Dauerschleife mit Aufruf von F2_messung(0) fortgeführt.
In "F2_messung.c" werden ca. 1,5 Messungen/s mit 8-stelliger Auflösung gemacht.
Die benötigte Hardware (IO-Ports, Timer) wird mit direkten Registerzugriffen
initialisiert und die notwendigen Konstanten sind am Anfang der Quelldatei definiert.
Die Beschreibung nebst Kommentaren im Programm sollten die Funktion verdeutlichen.
"usart3.c" erledigt die ser. Ausgabe der Messwerte über USART3 und muß nicht
weiter beachtet werden.
Wie gesagt, wird hier nur ein Teil einer bestehenden Schaltung gezeigt. Prinzipiell wäre auch ein Demoboard (STM32 Nucleo) verwendbar, um den mechanischen Aufbau einfach zu halten. Es müßten jedoch ext. Lösungen für den TCXO und das D-FF gefunden werden. Alternativ ist für Interessierte eine unbestückte Leiterplatte verfügbar. Damit wären direkte Erweiterungen möglich wie LC-Anzeige, EEPROM zur Speicherung der internen Konstanten, ein weiterer Eingangskanal mit Eingangskomparator, Anschluß einer ext. Referenzfrequenz, Taster + LEDs.
Die STM32F7xx sind recht schnell, sodaß bei höheren Eingangsfrequenzen einige 100000 Messungen/s möglich sind. Das kann man dazu nutzen, per statistischer Berechnung die Auflösung um zwei weitere Stellen auf zehn zu erhöhen.
2020-10-19:
Erweiterte Version "Fmeter_F730_V2.zip".
Bei dem Programm "F2_messung_reg.c" werden bis zu 500000 Einzelintervalle/s
erfasst und somit die Auflösung je nach Eingangsfrequenz um 1 - 3 Stellen
erhöht.
Bei 1 s Messzeit sind folgende Auflösungen zu erwarten:
0,1 Hz - 50 Hz: | 8-stellig |
50 Hz - 5 kHz: | 9-stellig |
5 kHz - 500 kHz: | 10-stellig |
>= 500 kHz: | 11-stellig |
Erhöht man die Messzeit auf 10 s erhält man eine weitere Stelle Auflösung hinzu. Zu beachten ist, daß für derartige Ergebnisse äußerst stabile Signale für Eingangs- und Referenzfrequenz benötigt werden.
Mit dem Programmteil "Fmeter_F730_LCD.c" wird ein LCD-Modul 16x2 angesteuert. Es muß allerdings nicht angeschlossen sein.
2020-10-21:
Für STM32F4xx und STM32H7xx gibt es angepaßte Versionen: "Fmeter_F407_V2.zip"
und "Fmeter_H750_V2.zip".
Beim STM32H750 werden im Programm "F2_messung_reg.c" bis zu 1E6 Einzelmessungen/s
durchgeführt.
Musteraufbau mit STM32H750 mit minimaler Bestückung:
unbestückte Leiterplatte:
Für eigene Aufbauten ist eine unbestückte
Leiterplatte verfügbar, die ursprünglich für eine Schaltung
mit STM32F407 nun auf STM32F7xx und STM32H75x angepaßt wurde. Die Bestückung
ist bis auf den µC identisch.
Bei Bedarf bitte die Verfügbarkeit anfragen.
2021-02-27:
Dieser Frequenzzähler vereint das reziproke Messverfahren und die zuvor
gezeigte statistische Auswertung vieler Einzelmessungen (lineare Regression)
in einem fertigen Modul. Schaltung und Programm sind dahingehend optimiert,
daß ein großer Einsatzbereich abgedeckt werden kann - ohne spezielle
Signalaufbereitung oder Berücksichtigung sehr niedriger Frequenzen. Die
Bedienung kann manuell oder per ser. Schnittstelle (RS232) vorgenommen werden.
Eine LC-Anzeige (>= 2 x 16) kann verwendet werden aber auch entfallen, falls
die Steuerung und Messwertausgabe nur per RS232 erfolgen soll. Ob als einfaches
Panelmeter mit wenigen Stellen Auflösung, mobiles Messgerät mit Stromversorgung
aus Akku/Powerbank oder als hochgenaues, fertiges Tischgerät mit externer
10 MHz Referenz und ergänzter Signalaufbereitung/Vorteiler, der Anwendungsbereich
ist vielfälltig.
Optimierungen/Kompromisse:
Das reziproke Messverfahren ist besonders für niedrige Eingangsfrequenzen
geeignet. Hier wurde der Messbereich auf eine Eingangsfrequenz >= 0,1 Hz
begrenzt, weshalb die internen Berechnungen mit 32 Bit Variablen auskommen,
was die Berechnungen bei der Auswertung beschleunigt. Ebenfalls wurde auf höchste
Auflösung im niederigen Frequenzbereich durch Zeitinterpolation verzichtet.
Viele Anwender benötigen dies nicht, dafür aber eine höhere Auflösung
bei höheren Frequenzen im MHz Bereich. Diese ergibt sich durch die statistische
Bewertung von bis zu 200000 Einzelmessungen/s.
Bei der Hardware ist die Eingangsstufe auf einfache Signalformen (sinusförmig,
rechteckig) ausgelegt. Da niedrigste Eingangsfrequenzen nicht berücksichtigt
werden müssen reicht eine einfache AC-gekoppelte Verstärkerstufe mit
nachfolgendem Schmitttrigger. Ein separater 2:1 Vorteiler ist Bestandteil des
Ereigniszählers. Dadurch wird zum einen der Eingangsfrequenzbereich verdoppelt
und zum anderen dem Zählereingang vom µC ein Signal mit für
ihn optimalem 50 % Tastverhältnis angeboten. So lassen sich selbst kurze
Eingangsimpulse von 2 - 3 ns erfassen.
technische Daten:
0,1 Hz - 50 Hz @ 1 s: | 8-stellig |
50 Hz - 5 kHz @ 1 s: | 9-stellig |
>= 5 kHz @ 1 s: | 10-stellig |
>= 5 kHz @ 10 s: | 11-stellig |
Die Beschreibung / User
Manual / Circuit Desciption
im .pdf-Format enthält detailierte Funktions- und Bedienungshinweise. Das
Programm (aktuell V1.4,
2021-05-13) kann sich im Laufe der Zeit noch ändern. Das Projekt kann mit
IAR EWARM direkt bearbeitet werden. Die Codegröße liegt bei derzeit
ca. 26 kB, weshalb noch die (kostenfreie) Demo-Version (max. Codegröße
32 kB) für eigene Erweiterungen benutzt werden kann.
Zum Nachbau finden sich hier die Fertigungsdateien
/ Materialliste
für Platinen.
Das Programmieren des Controllers kann über die serielle Schnittstelle erfolgen. Ist beim Anlegen der Versorgungsspannung BOOT gebrückt, wird der interne Bootloader im G431 gestartet. Anschließend kann die Datei Fmeter_G431_V1.hex beispielsweise mit den Programmen "STM32 ST-LINK Utility" oder "STM32CubeProgrammer" in den Speicher des Controllers geschrieben werden.
Schaltbild mit voller Bestückung;
Bestückung und externe Anschlüsse:
Musteraufbau:
Eingang F1: An diesen Eingang wird das Messsignal angelegt. C18 trennt
den Gleichspannungsanteil vom Signal ab und bestimmt in Verbindung mit R26 die
untere Grenzfrequenz. C17 dient als Hochpass für höhere Frequenzen.
Zum Schutz des Eingangs vom Inverter IC8 dienen die Schutzdiode D1(BAV99, niedrige
Kapazität) und R25, der in gewissem Maße für eine Strombegrenzung
sorgt. IC8 verstärkt das Eingangssignal und liefert am Ausgang einen Ruhepegel
von VCC/2 (ca. 1,65 V) und damit die sinnvolle Vorspannung für den folgenden
Schmitttrigger IC9, an dessen Ausgang steilflankige Rechtecksignale das nachfolgende
D-FF treiben. Das Flipflop IC10 synchronisiert auf Anforderung von "TRIGGER"
die Zeitmessung mit den Eingangsimpulsen; das Signal "CAPT1" speichert
die momentanen Zählerstände (µC-interne Capture-Register für
Ereignisse und Zeit).
D-FF IC11 dient als 2:1 Vorteiler für die Ereignismessung und IC12 als
zugehöriger Zwischenspeicher zum Auslesen des niederwertigen Bits "Q0".
Der Vorteiler kann entfallen, wenn die Lötbrücke J3 aktiviert und
dies im Auswerteprogramm berücksichtigt wird.
Eingang F2: Dieser Hilfseingang ist vorzugsweise für Rechtecksignale
(1 pps vom GPS-Empfänger, Sensoren mit TTL/CMOS Ausgangspegel) vorgesehen.
Die Signalamplitude sollte 3,3 V betragen. Der Pullup-Widerstand R22 (10 k)
kann je nach Signalquelle angepaßt oder auch weggelassen werden. Gegen
einfache Überspannung am Eingang dient R23. Sofern dieser Eingang für
andere Signale als GPS genutzt werden soll, kann dieser Eingang nur bis 5 kHz
genutzt werden (wird intern vom Programm begrenzt).
Derzeit werden die Meßwerte von F2 nur auf einem 4-zeiligen Display in
den Zeilen 3 und 4 angezeigt und wenn eingestellt per RS232 ausgegeben. Entgegen
den Einstellmöglichkeiten zum Eingang F1 beträgt die typ. Meßzeit
an F2 0,666 Sekunde bei einem Timeout nach 5 Sekunden. Die Anzeige erfolgt 8-stellig.
interne Referenzfrequenz: Der lokale VCTCXO (typ. 10 MHz) liefert den Basistakt für den µC. Mit einer Grundgenauigkeit von ca. 1 ppm eignet sich diese Taktfrequenz nur für geringere Ansprüche mit Auflösung von <= 8 Stellen, wenn regelmäßig ein Abgleich vorgenommen wird. Sofern der manuelle Abgleich mit Trimmpoti nicht benötigt wird, kann auch ein TCXO verwendet werden.
externe Referenzfrequenz: Für hochgenaue Messungen muß an diesem Eingang ein externes Referenzsignal (typ. 10 MHz) angelegt werden, wie es von ext. Zeitbasen erzeugt wird. Für maximale Genauigkeit sollte die Frequenz stabiler als 0,1 ppb (1 x 10e-10) sein. Die Amplitude sollte im Bereich 1 - 3 Vss liegen. Als Signalformen eignen sich sinus- oder rechteckförmige Signale. Per Lötbrücke J4 kann ein 50 Ohm Leitungsabschluß bestehend aus R16 || R17 zugeschaltet werden. Der nachfolgende CMOS-Inverter IC7 puffert und verstärkt das Eingangssignal. Der µC erkennt das externe Referenzsignal und verwendet es bevorzugt vor dem internen (VC)TCXO-Takt (automatische Umschaltung mit IC6).
RS232: Zur automatischen Weiterverarbeitung der Meßwerte kann jeweils ein Ergebnis per RS232 ausgegeben werden. Zur Auswahl stehen: Frequenz, Periodendauer und Drehzahl von F1 und Frequenz F2. Darüber hinaus können per RS232 diverse Parameter eingestellt werden, sofern keine manuelle Bedienung vorgesehen ist oder die Einstellungen fernbedient erfolgen sollen.
manuelle Bedienung: Parallel zum LCD können drei Eingabetaster für die manuelle Bedienung abgefragt werden. Zur Anzeige fertiger Messung und eingeschwungenem 1 pps Mittelwert dienen "RDY-LED" und "GPS-LED".
Abgleich:
Mechanisch: Sind ein VCTCXO nebst Trimmpoti bestückt kann die Referenzfrequenz
direkt abgeglichen werden. Eine Drehung im Uhrzeigersinn erhöht den angezeigten
Wert. Dies reicht für eine Auflösung von 7 Stellen.
Per Software: Interne und externe Referenzfrequenz werden separat abgeglichen.
Die Einstellung bezieht sich auf die jeweils angewählte Frequenz (intern/extern).
Sinnvollerweise wählt man beim Abgleich eine möglichst lange Meßzeit
>= 1s. Damit bei einer 10-stelligen Messung die letzte Stelle noch fein abgeglichen
werden kann, liegt die Abstufung des zugehörigen Offsets bei 0,01 ppb (1 x 10e-11).
Eine zu niedrige anzeigte Frequenz wird durch einen positiven Offset (.nnnnO)
und eine zu hohe Frequenz mit einem negativen Offset (.-nnnnO) korrigiert. Dabei
ist "nnn" ein relativer Wert zum bereits eingestellten Wert. Dadurch
wird der Feinabgleich vereinfacht. Einzig die Eingabe von .0O setzt den eingestellten
Offset auf 0.
Beispiel: das Eingangssignal an F1 beträgt exakt 10.00000000 MHz und als
externer Taktgeber dient ein OCXO. Der angezeigte Wert beträgt 9.999999989
MHz. Man sieht, daß der anzeigte Wert um ___11 zu niedrig angezeigt wird.
Bei der 10-stelligen Anzeige liefert die letzte Stelle die Auflösung von
0,1 ppb. Da der Korrekturwert (Offset) Faktor 10 höher aufgelöst wird,
muß dieser mit 110 eingegeben werden. Eingabe: .110O
Anschließend ist der angezeigte Wert erneut zu prüfen und ggf. zu
korrigieren, was mit kleinen Schritten von zum Beispiel 5 geschehen kann: .5O
zum Erhöhen oder .-5O zum Vermindern des Offsets. Der Abgleich ist dann
perfekt, wenn gleichzeitig "10.00000000 MHz" und "100.0000000
ns" angezeigt werden.
Die Einstellungen werden erstmals nur im RAM zwischengespeichert, sodaß die letzte Einstellung zunächst nicht 'zerstört' wird. Um beim nächsten Einschalten diesen Wert wieder zu verwenden, muß er nach fertigem Abgleich mit '.<Strg-S>' bzw. '.<Ctrl-S>' ins EEPROM geschrieben werden.
experimentelle Erhöhung der Eingangsfrequenz:
Die maximale Eingangsfrequenz hängt direkt von der Taktfrequenz der µC-internen
Timer ab. Sofern der max. Messbereich mit 150 MHz nicht reichen sollte, läßt
er sich optional auf ca. 200 MHz erhöhen. Die interne Taktfrequenz wird dabei
von ca. 170 MHz auf 235 MHz erhöht, was zwar außerhalb der Spezifikation liegt,
aber, sofern es funktioniert, bei Bedarf hilfreich sein kann.
Zur Aktivierung wird ein Widerstand von 3,3 kOhm zwischen die LCD-Leitungen
RS (Pin 4) und R/W (Pin 5) geschaltet. Dieser wird beim Einschalten einmalig
auf Vorhandensein überprüft und ggf. die erhöhte Taktfrequenz verwendet. Durch
die höhere Taktfrequenz steigt die Stromaufnahme um ca. 10 mA, was nicht zu
einer überhöhten Erwärmung des µC führt. Wenn dies nicht benötigt wird, belässt
man es bei der Grundeinstellung.
2021-05-13: Automatische Umschaltung der Referenzfrequenz
Für die F1-Messung kann für die Auflösung zwischen den fünf Modi "normal",
"hoch: 500/3", "hoch: 510/3", "hoch: 515/3" und ", "hoch: auto" gewählt werden.
normal: | 8-stell. Ergebnisse ohne Regressionsbewertung |
hoch: 500/3 | hohe Auflösung mit fester Referenzfrequenz von 166,7... MHz @ 10 MHz |
hoch: 510/3 | hohe Auflösung mit fester Referenzfrequenz von 170,0... MHz @ 10 MHz |
hoch: 515/3 | hohe Auflösung mit fester Referenzfrequenz von 171,7... MHz @ 10 MHz |
hoch: auto | automatische Umschaltung der Referenzfrequenz zur Vermeidung geradzahliger, phasenstarrer Teilerverhältnisse Fref/Fin bei Fin >= 10 kHz. Das ergibt die beste Auflösung bei variabler Eingangsfrequenz. |
Bei jeder Umschaltung wird funktionsbedingt das aktuelle Ergebnis von Kanal F2 verworfen. Der automatische Abgleich per 1pps-Signal wird dadurch aber nicht beeinflußt.
2022-05-13:
Anbei der vorläufige Entwurf für einen reziproken Frequenzzähler auf Basis
des RP2040 Pico-Boards, was für wenige Euro erhältlich ist. Im einfachsten Fall
wird nur ein Eingangssignal an Fin angelegt und die Ergebnisse an TxD ausgegeben.
Als Versorgungsspannung werden 5 V (per USB oder Powerbank) benötigt. Die Stromaufnahme
ohne LCD-Beleuchtung beträgt ca. 25 - 50 mA.
Optional kann die genaue Frequenzanzeige per Poti um +/- 20 ppm justiert, eine
10 MHz Referenz verwendet oder der TxD-Pegel so eingestellt werden, daß er direkt
an einen RS232->USB-Converter angeschlossen werden kann. Diese kommen in der
Regel mit 3 V Signalen klar.
Reicht der Eingangsfrequenzbereich nicht ganz aus, kann er per Option auf 32 MHz erweitert werden. Dabei wird die interne Taktfrequenz verdoppelt, was experimentell gut funktioniert aber nicht garantiert werden kann.
vorläufige Daten:
Die drei eingezeichneten Lötrücken/Jumper werden beim Programmstart eingelesen und danach nicht mehr beachtet.
Funktionsbeschreibung:
Das Eingangssignal an FIN wird mit SystemCoreClock/4 abgetastet und die
Zyklen mit dem PIO0-SM0-X-Register gezählt. Bei einer fallenden Flanke
wird der Inhalt des X-Registers auf RXF0 ausgegeben und per DMA in die Variable
'F1_time_stamp' geschrieben. Die Anzahl der Zeitstempel wird mit dem Register
DMA_TRANS_COUNT gezählt.
Nach Ablauf des vorgegebenen Messintervalls (DEF_F1_MESSZEIT) werden der Zeitpunkt
(F1_time_stamp) und die Anzahl der Ereignisse (DMA_TRANS_COUNT) ausgelesen und
die Differenz zu den zuvor ausgelesen Werten gebildet. Die Zeit ist dabei synchron
zu den Ereignissen: dies ist die entscheidende Voraussetzung für eine reziproke
Messung.
Die Frequenz ergibt sich als: Ereignisse/Zeit * Abtastrate. Die Abtastrate
beträgt mit SystemCoreClock/4 typisch 37,5 MHz. Bei dem vorgegebenen Messintervall
von 3 Messungen/s ist jede Messung auf <= 1*10^-7 (3 / 3,75*10^7) aufgelöst,
was eine 7-stellige Anzeige erlaubt.
Die absolute Genauigkeit hängt von der Genauigkeit und Stabilität vom internen
Takt 'SystemCoreClock' ab, der per PLL aus einem extenen Takt (Quarz/TCXO) erzeugt
wird. Zur Korrektur dieser Frequenz dient die Variable 'f_ref_korrektur', die
mit einem Trimmpoti am ADC0-Eingang eingestellt werden kann.
Die übrigen Funktionen sollten aus den Kommentaren erkennbar sein.
Das Projekt gibt es in deutscher
und englischer Version. Es
wurde mit einer Demo-Version von IAR EWARM Version 9.20 erstellt und kann damit
direkt verwendet werden. Bei Verwendung anderer Compiler sind die Dateien 'cstart_rp2040.c'
und 'boot.s' anzupassen.
Die erzeugte Datei 'pico_fm.bin' ist für den Bereich ab 0x10000000 gelinkt,
wobei der 1. Block den Bootloader enthält. Die Datei 'pico_fmeter.uf2' ist direkt
auf das Pico-Board per USB aufspielbar und bleibt im FLASH-ROM gespeichert.
Um aus einer eigenen .bin-Datei eine ladbare Version zu erhalten dient das Programm
'bin2uf2.exe'.
Der Aufruf dazu ist: bin2uf2 -squelldatei -duf2-datei.
2023-11-11: Es gibt Projekt-Dateien für die Segger IDE: Pico_Fmeter_Segger.zip.
Sofern kleinere Änderungen an den vorgegebenen Einstellungen/Funktionen benötigt werden, bitte anfragen.
2022-06-03:
In Entwicklung ist eine Schaltungs-/Programerweiterung, die höhere
Eingangsfrequenzen erfaßt und mit einer externen Referenzfrequenz
von 1 Hz, 10 kHz oder 10 MHz den lokalen 12 MHz Quarzoszillator optional korrigiert.
Dazu das vorläufige Schaltbild und die fertige .UF2-Datei.
Die Eingangsstufe mit IC3 bereitet kleinere Sinussignale auf. Obwohl IC3 ein Inverter ist, hat er eine kleine Eingangshysterese von etwa 100 mV. Die Schaltschwelle bei 3,3 V Versorgungsspannung liegt bei etwa 1,4 V. Zur Anpassung auf maximale Empfindlichkeit kann R4 variiert werden.
Der nachfolgende asynchrone 4:1 Vorteiler (74AUP2G80) arbeitet bis >= 500
MHz. Damit wird zum einen die max. Eingangsfrequenz erhöht und zum anderen
werden auch kleine Tastverhältnisse des Eingangssignals sicher erkannt.
Ausgangsseitig liefert er ein 50% Tastverhältnis, sodaß der µC-interne
Vorteiler optimal angesteuert wird. Natürlich können nach Bedarf auch
andere Teiler/D-FlipFlops (z.B. 74HC4040, 74HC393 oder 74HC74) als Vorteiler
verwendet werden, wenn die max. Eingangsfrequenz niedriger sein darf oder auf
SMD-Bauteile verzichtet werden soll.
Das Teilungsverhältnis von externem und internem Vorteiler beträgt
zusammen 32:1.
Der 1:1 Eingang Fin arbeitet parallel zum Vorteiler und wird bis zu 32 kHz verwendet. Oberhalb wird das Ergebnis des Vorteilerkanals ausgewertet. Wird Fin (Pin 4 vom Pico-Board) nicht angeschlossen, wird immer der Vorteilerkanal ausgewertet, was allerdings bei niedrigen Eingangsfrequenzen zu längerer Messzeit führt, da >= 32 Perioden/Messung abgewartet werden müssen. Bei Bedarf können die Signale für den direkten 1:1 Eingang und den mit Vorteiler auch separat aufbereitet werden.
Der Abgleich der lokalen Referenzfrequenz kann wie zuvor per Trimmpoti erfolgen. Sofern jedoch ein externes Referenzsignal im Bereich +/- 100 ppm zu 1Hz, 10 kHz oder 10 MHz erkannt wird, wird dieses zur Frequenzkorrektur verwendet.
2022-11-29:
Die Schaltung wurde angepaßt, um die Anschluß der LC-Anzeige
auf der Basispaltine einfacher zu gestalten. Die Eingangsstufe wurde mit einer
separaten Signalaufbereitung für HF-Signale versehen. Einstellen der Parameter
und Optionen werden vom Programm per Bedientaster oder über die serielle
Datenverbindung eingestellt.
2023-03-01:
Ab Version 2.2 werden die statistische Auswertung, Anzeige und Ausgabe von Anzahl,
Fmean, Fmax, Fmin und S-dev angeboten.
technische Daten:
Schaltbild:
2023-01-07 Änderungen:
Der Schaltregler auf dem Pico-Board rauscht relativ stark, sodaß es sich empfiehlt,
diesen abzuschalten und durch einen low-drop Linearregler mit 3,3 V Ausgangsspannung
zu ersetzen. Dazu ist der Eingang 3V3_EN auf GND zu legen (Pin37 und Pin38 verbinden)
und den externen Regler auf der Platinenunterseite zu ergänzen. Für bessere
Empfindlichkeit an den Eingängen F-IN und F-REF können R2 und R6 auf 82 oder
91 kOhm erhöht werden.
Schaltung und Bedienung sind in einer .pdf-Datei
in deutscher und englischer
Version ausführlich beschrieben, sodaß es nicht noch einmal neu
ausgeführt werden muß. Zum Verständnis der Messfunktion des
Zählers gibt es hier noch weitere
Hinweise in deutscher und in englischer
Version.
Die Bilder vom Musteraufbau geben einen direkten Eindruck.
Oberseite:
Unterseite:
Das aktuelle Programm wird als
.uf2-Datei per USB-Verbindung ab 0x10000000 in den Flash-Speicher geladen.
Der Quellcode kann unter
der EWARM-IDE angepaßt werden.
2023-11-11: Es gibt Projekt-Dateien für die Segger IDE: Pico_Fmeter2_segger.zip.
2024-02-26: Die Programmversionen vom Pico_Fmeter2 wurden um englische Bedientexte erweitert und an einigen Stellen korrigiert. Ferner gibt es auch eine Version Pico_Fmeter2_Arduino.zip, die unter der aktuellen Arduino-IDE V2.3.0 läuft. Im Prinzip können Arduino-typische Befehle ergänzt werden, wegen der Einstellungen der PLL_SYS muß das Timing überprüft werden. Die aktivierte USB-Schnittstelle arbeitet parallel zur ser. Ausgabe per UART und hat ein eigenes Timing.
Zum Nachbau gibt es die Fertigungsdateien, wie sie von günstigen Anbietern aus Fernost benötigt werden.
14b. hohe Auflösung: 12 digits/s mit TDC-Baustein AS6501
2023-04-12:
Das zuvor gezeigte Projekt 'Pico-Fmeter2a' kann für viele Anwendungen
eine einfache Lösung bieten. Wird jedoch eine noch höhere Auflösung
benötigt, kommt man nicht umhin, die Auflösung der Zeitmessung deutlich
zu verbessern. An der Taktfrequenz des RP2040 Controllers oder dessen Timerfunktion
kann man außer der Übertaktung nicht viel ändern. Hier bietet
sich ein zusätzlicher 'Time-to-Digital Converter' (TDC) an. Weit verbreitet
und günstig ist beispielsweise ein TDC7200. Dieser bietet eine Zeitauflöung
von rund 100 ps im Bereich 12 ns bis einige ms. Zusätzlich wird noch Logik
zur Synchronisierung und ein weiterer Zähler für längere Zeiten
benötigt.
Bessere Auflösung erhält man mit einem AS6501 TDC, der eine feinere
Auflösung und einen Zählerumfang bis in den Sekundenbereich bietet.
Zur Synchronisierung reicht ein 74er DFF. Diesem wurde bei der folgenden Schaltung
der Vorzug gegeben.
Zum Anschluß eines TDC-Bausteins wird eine serielle Schnittstelle (hier SPI1) zum Initialisieren und Auslesen der Zähler benötigt. Ferner muß das DFF gezielt aktiviert und das Fertigsignal (INTN) des TDC gelesen werden können. Ordnet man die GPIO-Anschlüsse am Pico-Board ein wenig um, erhält man die benötigten Steuerleitungen und auch noch die Signale zum Umschalten eines Vorteilers oder der verwendeten Referenzfrequenz intern/extern, wie es im Schaltbild gezeigt wird.
Programm und Schaltung sind eine Weiterentwicklung aus dem Projekt 'Pico-Fmeter2a',
weshalb hier keine neue Beschreibung vorhanden ist, sondern nur auf die groben
Unterschiede hingewiesen wird.
Es entfällt der 2. Eingangskanal, mit Hilfe dessen der 12 MHz Takt des
Pico-Boards korrigiert werden konnte. Dieser würde sich nicht annähernd
dafür eignen, eine solide Referenzfrequenz für 12-stellige Messergebnisse
zur Verfügung zu stellen. Stattdessen ist für die Grundfunktion ein
10 MHz TCXO mit ca. 1 ppm Stabilität vorhanden. Für volle Auflösung
muß ein hochstabiles 10 MHz Referenzsignal angelegt werden, auf welches
bei Anliegen automatisch umgeschaltet wird. Das Pico-Board läuft weiterhin
mit seinem lokalen 12 MHz Takt.
Die Bedienung des 2. Kanals entfällt ebenso und die Befehle zur Paramtereingabe
des 2. Kanals werden ignoriert.
Es gibt nach wie vor die Möglichkeit, einen Frequenz-Offset separat für
lokalen 10 MHz TCXO und externe 10 MHz einzustellen. Bei der erhöhten Auflösung
beträgt der kleinste Schritt nun 1 x 10^-12. Bei einem Einstellbereich
von +/- 5 ppm liegt der Wertebereich für den Offset bei +/- 5000000.
Per Trimmpoti läßt sich bei Bedarf nur der Offset für den lokalen
TCXO zusätzlich einstellen. Sofern man den Abgleich durch Anpassen des
Offsets per RS232 vornehmen kann, sollte das Trimmpoti nicht bestückt werden:
es stört mehr als es nutzen kann.
Anstelle der 3 x 10 Ohm Widerstände (R7, R26, R27) sind kleine Drosseln 47 µH ca. 10 Ohm im 0603-Gehäuse eine Alternative, um die Filterung der Versorgungsspannungen zu verbessern. Für den Eingangsüberspannungsschutz wird die Zenerdiode ZD3V3 empfohlen. Alternativ geht auch ein BC801 (o.ä.). Als Eingangsinverter können auch 74 LVC1GU04 verwendet werden, die höhere Versorgungs- bzw. Eingangsspannungen zulassen.
ergänzende technische Daten:
0,6 Hz - 50 Hz @ 1 s: | 10-stellig |
50 Hz - 5 kHz @ 1 s: | 11-stellig |
>= 5 kHz @ 1 s: | 12-stellig |
Die Grundauflösung bei Frequenzen im Hz-Bereich ergibt sich aus der TDC-Auflöung mit < 100 ps. Bei höheren Frequenzen ergibt sich eine höhere Auflösung wegen der Bewertung der Einzelintervalle um den Faktor: Wurzel aus Fin. Intern wird mit ca. 50 kHz Abtastrate gearbeitet. Bis zu dieser Frequenz wird jede Periode des Eingangssignals einzeln erfaßt. Darüber hinaus werden dann innerhalb von 20 µs mehrere Perioden zusammengefaßt.
Bei dieser hohen Auflösung fallen bereits kleinste Störungen des Signals auf. Rauschen und Jitter der Bauteile und Übersprechen auf der Leiterplatte begründen, daß eine höhere Auflösung kaum (oder direkter gesagt: nicht) erreicht werden kann. Und letztlich ist die mögliche Auflösung nur die notwendige Voraussetzung, eine hohe Genauigkeit zu erhalten. Die Genauigkeit der Messergebnisse kann niemals besser sein als die der Referenzfrequenz. Besser sieht es aus, wenn man schnelle Messungen im ms-Bereich durchführt, da hier Referenzfrequenzen mit 1 x 10^-10 Genauigkeit für die erreichten 9-stell. Anzeige ausreichend sind.
Ein paar Bilder zeigen die Stabilität (Eigenrauschen) bei Einspeisen eines 10 MHz Signal als Fin und Fref. Einmal als Allan Deviation und noch als absolute Frequenzabweichung. Zu 'besserer' Demonstration wurde der RP2040 mit 300 MHz betrieben und die Abtastrate auf 100 kS/s eingestellt. Bei Bedarf kann man sich das Programm (siehe unten) anpassen.
Dann noch eine Kurve, die die Signale zweier um 0,2 Hz verstimmter OCXOs anzeigt. Dabei kann man die Arbeitsweise des TDC bei wechselnden Phasenlagen bewerten. Die Messintervalle sind 10 ms lang: 100 Messungen/s
Zum Schluß noch Bilder eines Musteraufbaus, die zum Nachbau annimieren sollen:
Das Programm ist mit einer IAR IDE EWARM V9.20 erstellt. Als Debugger dient ein Segger J-Link EDU mini. Das Projekt liegt im Grundverzeichnis auf Laufwerk C:. Die zum Nachbau erforderlichen Fertigungsdaten und Bestückungspläne können hier geladen werden.
2023-11-11: Es gibt Projekt-Dateien für die Segger IDE: Pico-FM-AS65_segger.zip.
2023-04-29 neue Programmversion:
Aktuell ist nun die Programmversion V1.2. Schon beim Schaltungsentwurf wurde
das Signal 'Fin' bewußt an GPIO21 gelegt, um auch den Eingang PWM2B nutzen
zu können. PWM_CH2_CTR wird jetzt als Ereigniszähler verwendet und mit PIO0_SM0
eine Capture-Funktion umgesetzt. Da der Ereigniszähler hinreichend schnell ausgelesen
wird, reicht der 16 Bit breite Zähler aus.
Für Vergleichsmessungen läßt sich die Regressionsberechnung am Ende eines Messintervalls nun auch abschalten, indem nur die Gesamtereignisse und Gesamtzeit für die Berechnung verwendet werden (Variable: F1_reg_modus). Die Berechnung entfällt auch bei niedrigen Frequenzen, wenn im Messintervall nur ein einzelner Eingangsimpuls erkannt wird.
Die Regressionsberechnung läßt sich manuell unter: Einstellungen
Eingang1 -> lin. Regression -> aus/aktiv einstellen.
Der ser. Befehl dafür sieht so aus: ".1Z" zum Aktivieren und
".0Z" zum Abschalten der Berechnung.
Wie es zu erwarten ist, ergibt sich ohne Regressionsberechnung eine Adev-Kurve
mit geradem Verlauf, .
Eine neue Option "INT128" aktiviert die Erfassung/Vorverarbeitung
der Einzelintervalle mit 64 bzw. 128 Bit breiten Integer-Zahlen. Im Gegensatz
zu den bislang verwendeten 'double'-Variablen ist die Auflösung bis zur
abschließenden Auswertung bis auf das letzte Bit genau und es drohen auch
bei längeren Messzeiten keine Überläufe.
Zusätzlich ist eine Option vorgesehen, mit "CORE1_AKTIV" die Erfassung und Vorverarbeitung
für die Regressionsberechnung auf dem 2. Kern laufen zu lassen.
Beide Optionen werden bei der Übersetzung des Quellcodes beachtet und bleiben
anschließend unverändert.
Die nachfolgenden Adev-Kurven zeigen die Ergebnisse mit INT128-Berechnungen
einmal mit 50 kS/s (blau) und einmal mit dem aktivierten 2. Prozessorkern mit
200 kS/s (rot). Als Messintervall wurden 10 s eingestellt.
Interessanterweise sind die Ergebnisse mit der langsameren Abtastrate scheinbar
besser als die mit höchstmöglicher.
2024-03-05: neue Programmversionen mit Doppelfunktion ohne und mit AS6501
Das Board "pico-fmeter-AS65" ist nun auch ohne AS6501 verwendbar. Die Software meldet sich dann mit "mino PicoFmeter3". Diese Version funktioniert sehr ähnlich der Vorgängerversion "Pico-Fmeter2a", auf deren Beschreibung verwiesen wird.
Mit nachträglich bestücktem TDC AS6501 wird die Version "mino PicoFM-AS65" angezeigt. Bei Bedarf lässt sich wieder auf die Version ohne TDC umschalten, wozu ein Neustart des Programmes notwendig ist: Aus- und Einschalten.
Wegen der Änderungen bitte die Hinweise am Anfang des Programmteils "mess_fm_as65.c" lesen.
2024-06-09: Aktuelle Programmversionen V2.4
Version für IAR-IDE
Version für
Segger-IDE
Version für Arduino-IDE
Soweit.
Kontakt: