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,005 Hz - 200 MHz
11. 5-stell. Zähler, 10mm 7-Segment multiplex, Einbaumodul, Batteriebetrieb
12. 8-/10-stelliger reziproker Frequenzzähler mit STM32F407/F730/H750 (experimentel)
13. Fmeter-G431: optimierter reziproker Frequenzzähler 0,1 Hz - 150 MHz
 
14. Projekt: Fmeter mit RP2040 Pico-Board
14a. fertige Version Programm/Leiterplatte
14b. 10/12 digits/s mit AS6501 TDC
14c. Doppelversion ohne und mit AS6501 TDC, IAR, Segger, Arduino
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

 

12. 8-/10-stelliger reziproker Frequenzzähler mit STM32F7xx

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.

nach oben

 

13. Fmeter-G431: optimierter reziproker Frequenzzähler 0,1 Hz - 150 MHz

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:

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:

 

Erläuterungen zur Schaltung

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.

nach oben

 

14. Projekt: Fmeter mit RP2040 Pico-Board

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.

nach oben

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.

nach oben

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:

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.

nach oben

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.

nach oben

Kontakt:

zurück zur Übersicht