Forum: Mikrocontroller und Digitale Elektronik Frage zur Frequenzmessung und zum Reziprokverfahren


von Joern DK7JB .. (moin)


Lesenswert?

Ich habe Fragen zum Frequenzzähler mit dem Reziprokverfahren und bitte 
euch um die Überprüfung von meinem Gedankengang.

Vorweg aber mein Messproblem.
Ich möchte die Frequenz von einem 50MHz Signal messen (Pegel 5V TTL). Es 
kann nur um rund +-100ppm schwanken. Als Hardware steht mir ein ATmega + 
Vorteiler mit einem 20MHz TCXO zur Verfügung. Es kommt mir auf möglichst 
kurze Messzeit bei möglichst genauer Messung an. Mit „genau“ meine ich 
hauptsächlich die relative Genauigkeit.
Die Software möchte ich selber schreiben, damit ich sie verstanden habe 
und sie später in mein Hauptprogramm integrieren kann.
Um die Diskussion zu vereinfachen nehme ich im ersten Ansatz einmal an, 
dass der 20MHz TCXO genau ist und keine Schwankungen aufweist ;-).

„Normale Impulszählung“: Die 50MHz werden durch 8 geteilt (6,25MHz) und 
dann die Impulse in einem festen Intervall von z.B. 1s gezählt. Einen 
kleinen Vorteil könnte es noch bringen, wenn durch 6 und nicht durch 8 
geteilt wird. Mir ist bekannt, dass nur Frequenzen direkt gemessen 
werden können, die kleiner als Takt/2 sind.
(Im ATmega werden ein Timer als Timer und ein zweiter Timer als Zähler 
benötigt)
Das normale Impulszählverfahren hat den Nachteil, dass der letzte 
gemessene Impuls nicht genau mit dem Ende des Zählintervalls 
übereinstimmt.

Frage 1: Kann überhaupt das reziproke Frequenzmessverfahren mir einen 
Vorteil verschaffen, wenn meine zu messende Frequenz in der Nähe der für 
den Mikrocontroller zu messenden Frequenz liegt? Ich gehe davon aus, 
dass auch ein Capture-Eingang vom ATmega eine gewisse Zeit zur Erkennung 
des Impulses benötigt.

Frage 2: Habe ich das reziproke Zählverfahren überhaupt richtig 
verstanden?

Reziprokes Zählverfahren (so wie ich es verstanden habe)
Wie bei einem normalen Impulszähler werden die Impulse in einem 
bestimmten Intervall gezählt. Am Ende von diesem Intervall wird noch die 
Zeit bis zum nächsten Impuls gemessen. Aus der Anzahl der Impulse und 
der neuen Gesamtzeit kann nun die Frequenz genauer berechnet werden.

Umsetzung mit dem ATmega: Das Signal muss stärker geteilt werden und 
liegt am Capture-Eingang vom Timer1 an. Der Timer1 wird als Timer mit 
dem Systemtakt betrieben. Immer wenn ein Impuls eintrifft, wird der 
Capture-Interrupt ausgelöst. Innerhalb des Interrupts wird für jeden 
Impuls eine Zählvariable erhöht und gleichzeitig überprüft, ob das Ende 
des Messintervalls erreicht ist. In diesem Fall würde alles beendet und 
der Capture-Wert übernommen werden. Aus der Gesamtzahl der Zählimpulse 
und der Gesamtzeit kann nun die Frequenz errechnet werden.
Bei diesem Verfahren führt ein Vorteiler nicht zu einem Verlust an 
Genauigkeit.
Im Timer1-Überlauf-Interrupt muss noch der 16-bit Überlauf verarbeitet 
werden.
(Es wird nur der Timer1 als Timer benötigt)
Habe ich hierbei einen Gedankenfehler gemacht?

von m.n. (Gast)


Lesenswert?

Du kannst ja gerne selber programmieren, aber hier ist die Funktion 
beschrieben: http://www.mino-elektronik.de/fmeter/fmeter.htm
Und dann noch eine Beschreibung mit Bildern, die schon etwas angegilbt 
sind:
http://www.mino-elektronik.de/Archiv/Elektronik25_1984.pdf

Die reziproke Frequenzmessung eignet sich bestens für niedrige 
Frequenzen, ist aber nicht darauf beschränkt und bietet immer die beste 
Auflösung bei lückenloser Messung. Auch mit einem hochfrequenten 
Vorteiler bleibt die hohe Auflösung/Genauigkeit erhalten!

von Wolfgang (Gast)


Lesenswert?

Joern D. schrieb:
> Es kommt mir auf möglichst kurze Messzeit bei möglichst genauer
> Messung an. Mit „genau“ meine ich hauptsächlich die relative Genauigkeit.

Was meinst du mit "relativer Genauigkeit"? Relativ bezogen auf eine 
vorhergehenden Messung?
"... möglichst kurze Messzeit" und Auflösung hängen direkt miteinander 
zusammen. Du solltest dir also über die erforderliche Auflösung Klarheit 
verschaffen.

> Die 50MHz werden durch 8 geteilt (6,25MHz) und
> dann die Impulse in einem festen Intervall von z.B. 1s gezählt.

Wenn du deine Meßfrequenz vorher durch 8 teilst, verlängerst du die 
erforderliche Messzeit bei fester Auflösung um einen Faktor acht. Das 
passt nicht mit "möglichst kurze Messzeit" zusammen, es sei denn, du 
gibst die Torzeit auch nach draußen zum Vorteiler und kannst den 
auslesen.

von m.n. (Gast)


Lesenswert?

Wolfgang schrieb:
> Wenn du deine Meßfrequenz vorher durch 8 teilst, verlängerst du die
> erforderliche Messzeit bei fester Auflösung um einen Faktor acht. Das
> passt nicht mit "möglichst kurze Messzeit" zusammen, es sei denn, du
> gibst die Torzeit auch nach draußen zum Vorteiler und kannst den
> auslesen.

Bei reziproker Messung reicht ein Intervall zur Messung, selbst wenn er 
zuvor durch 1000 teilt und den Vorteiler eben nicht ausliest!
Wenn +/- 100 ppm reichen, dann braucht man bei 20 MHz CPU-Takt rund 1 ms 
Messzeit, das heißt: 1000 Messungen/s 4-stellig. Für 5-stellige 
Ergebnisse kommt man auf 200 Messungen/s - ohne lila Pause zwischendurch 
;-)

Wenn es Faktor 10 schneller gehen soll, kann man einen STM32F4.. nehmen.

von W.S. (Gast)


Lesenswert?

Joern D. schrieb:
> Ich habe Fragen zum Frequenzzähler mit dem Reziprokverfahren und bitte
> euch um die Überprüfung von meinem Gedankengang.

Ich mach's mal ein bissel prinzipiell:

Ob reziprok oder geradeaus, in jedem Falle muß man zwei Dinge zählen: 
die Eingangsimpulse und die Referenzimpulse. Das sind zwei Integerzahlen 
und je nach gewünschter Auflösung muß man eine gewisse Zeit lang 
("Torzeit") diese Impulse zählen, damit die zwei Zahlen groß genug 
werden für die angezielte Auflösung.

Die erzielbare Auflösung wird dabei von der kleineren der beiden Zahlen 
bestimmt, wenn.. JA WENN die Torzeit nicht GENAU dieser kleineren Zahl 
entspricht.

Beim "Geradeauszähler" wird die Torzeit vom Referenztakt bestimmt. Also 
ist die Torzeit ein exaktes Vielfaches eben dieser Referenztakt-Periode. 
Die Anzahl der gezählten Eingangsimpulse ist hingegen kein exaktes 
Vielfaches der tatsächlichen Eingangs-Perioden. Die Unbestimmtheit ist 
dabei eben 1 Periode des Eingangs-Signales.

Beim "Reziprokzähler" läßt man das Tor, was sie Meßzeit bestimmt, jedoch 
vom Eingangssignal auf- und wieder zu machen. Deshalb ist dort die 
Torzeit ein exaktes Vielfaches der Eingangssignal-Periode. Folglich ist 
die Anzahl der gezählten Referenztakte kein exaktes Vielfaches der 
tatsächlichen Referenztakt-Periode. Die Unbestimmtheit ist also 1 
Periode des Referenztaktes.

Du siehst, daß es für niedrige Eingangsfrequenzen vorteilhaft ist, das 
Reziprokverfahren zu wählen, da man damit für die kleinere Zahl der 
Eingansimpulse die Torzeit als ein exaktes Vielfaches davon erhält. Die 
(viel) höhere Referenzfrequenz hingegen führt zu einer (viel) größeren 
Zahl gezählter Referenzimpulse und damit hat man als Unsicherheit nur 
die eine Periode des Referenzsignales.

Für Eingangsfrequenzen größer als die Referenzfrequenz hingegen ist es 
vorteilhafter, die Geradeausvariante zu wählen, weil dies zu höherer 
Auflösung führt. Die Unsicherheit ist ja mit einer Eingangsperiode ja 
kleiner als die Referenzperiode. --> ABER NUR unter der Voraussetzung, 
daß man das Tor auch tatsächlich auf der Eingangsfrequenz ansiedelt und 
NICHT zuvor einen Vorteiler benutzt.

Bei deinem Vorhaben, einfach nur irgendwelche Timer und 
Capture-Einheiten in einem µC zu benutzen, kommt eine dezente weitere 
Schwierigkeit hinzu: Alle Vorgänge in einem µC werden vom zuständigen 
Systemtakt bestimmt. Deshalb hast du - genau genommen - die Torzeit 
IMMER als ein Vielfaches des Systemtaktes. Auch dann, wenn du meinst, 
das Reziprokverfahren angewendet zu haben. Du hast dann in der 
Endkonsequenz die Meßunsicherheit zweifach. Einmal eine 
Systemtakt-Periode am Beginn der Torzeit und noch einmal dasselbe am 
Ende der Torzeit.

W.S.

von Joern DK7JB .. (moin)


Lesenswert?

Danke für eure Antworten.

@m.n.: Deine Seite habe ich mir schon angesehen und auch versucht dein 
Programm zu verstehen. Habe ich das reziproke Zählverfahren überhaupt 
richtig verstanden und die Umsetzung für den ATmega richtig beschrieben?

@Wolfgang: Da muss ich wohl etwas genauer werden, da ich mich ungenau 
ausgedrückt habe. Wenn ich als Takt einen TCXO verwende, hat dieser auch 
nur eine begrenze Genauigkeit. Auch wenn die absolute Genauigkeit 
begrenzt ist die relative Genauigkeit gegenüber anderen Messungen 
deutlich genauer.
Was die Messdauer betrifft, ist es vielleicht einfacher, wenn ich sie 
auf ungefähr 1 Sekunde festlege. Vielleicht sollte ich Frage lieber so 
stellen:

Wie kann ich bei einer Torzeit von ca. 1s möglichst genau eine Frequenz 
von 50MHz messen, wenn ich einen ATmega mit einem 20MHz TCXO verwende?



Wie genau wird eigentlich ein Impuls am Capture-Eingang erkannt? Welche 
zeitliche Unsicherheiten gibt es hierbei? Für den Zähler benötige ich 
immer zwei Takte zur Signalerkennung. Kann ich mit dem Capture-Eingang 
bis auf die Taktrate des MC herankommen (was die Genauigkeit der 
Erkennung betrifft)?

So langsam bekomme ich das Gefühl, dass das einfache Impulszählverfahren 
(trotz Vorteiler durch 6 oder 8)in meinem speziellen Fall doch der beste 
Weg ist.

von Wolfgang (Gast)


Lesenswert?

m.n. schrieb:
> Bei reziproker Messung reicht ein Intervall zur Messung, selbst wenn er
> zuvor durch 1000 teilt

Wenn die Eingangsfrequenz schon höher als die µC-Taktfrequenz ist, wird 
auch bei Vorteiler und reziprokem Messverfahren keine Verkürzung der 
Messzeit möglich.

Welchen Vorteil sollte die reziproke Messung hier bringen?

Die direkt vom µC auswertbare maximale Frequenz erreicht man, wenn man 
das Signal als externen Takt auf einen der Zähler gibt und dazu vorher 
das Eingangssignal so weit herunterteilt, dass der µC damit klar kommt.
Sonst s.o.

von m.n. (Gast)


Lesenswert?

W.S. schrieb:
> Deshalb hast du - genau genommen - die Torzeit
> IMMER als ein Vielfaches des Systemtaktes. Auch dann, wenn du meinst,
> das Reziprokverfahren angewendet zu haben. Du hast dann in der
> Endkonsequenz die Meßunsicherheit zweifach.

Nur, um es erwähnt zu haben:
Wenn man es richtig anstellt, gibt es beim reziproken Verfahren keine 
Torzeit und die Unsicherheit ist max. ein Intervall des Referenztaktes.
@W.S. jetzt kannste mich wieder beschimpfen ;-)

von W.S. (Gast)


Lesenswert?

m.n. schrieb:
> Wenn man es richtig anstellt,...

Eben. Eben NUR dann, wenn man es richtig anstellt.

Und dein Haß auf das Wort "Torzeit" ist albern. Nenn es von mir aus 
"Bewertungszeitraum" oder "die Zeit, die man so zum Zählen braucht".

Aber hier gibt es verdammt viele, die es eben falsch anstellen und dies 
dann auch noch mit Vehemenz wider alle Vernunft verteidigen - unter 
Ignorierung aller Sachargumente.

Nochmal: Wer mit den Innereien eines µC Frequenzen messen will, hat als 
wirksamen Referenztakt nur den halben Systemtakt. Am Anfang und am Ende 
des "m.n.'schen Bewertungszeitraumes hat man jeweils einen Systemtakt an 
Zeitunsicherheit - und das kann man nur dadurch - relativ - veringern, 
daß man die doppelte oder dreifache oder m.n-fache Zeit lang mißt, womit 
der eine Systemtakt vom Ende nach noch weiter hinten verschoben wird...

W.S.

von Axel S. (a-za-z0-9)


Lesenswert?

Joern D. schrieb:

> Wie kann ich bei einer Torzeit von ca. 1s möglichst genau eine Frequenz
> von 50MHz messen, wenn ich einen ATmega mit einem 20MHz TCXO verwende?

Wenn du die Meßzeit auf 1 Sekunde festlegst, dann kannst du 50MHz mit 
schlechtestenfalls 1/50,000,000 = 0.02 ppm Fehler messen. Das setzt 
voraus, daß du die Torzeit von 1s mit höchstens diesem Fehler generieren 
kannst und die 50MHz direkt (also ohne Vorteiler) zählst.

Mit dem von dir bereits angedachten Vorteiler von 8 ändern sich obige 
Zahlen um den Faktor 8. Der systematische Fehler ist dann höchstens 
0.16ppm

> Wie genau wird eigentlich ein Impuls am Capture-Eingang erkannt? Welche
> zeitliche Unsicherheiten gibt es hierbei?

Steht im Datenblatt. Das Eingangssignal wird durch zwei D-Flipflop 
geführt die mit dem IO-Takt des µC getaktet sind. Je nach Phasenlage 
zwischen Takt und externem Signal gibt es eine Verzögerung um 2 oder 3 
Takte (also 1 Takt Unsicherheit).

> Für den Zähler benötige ich immer zwei Takte zur Signalerkennung.

Ich weiß nicht was du damit meinst.

> Kann ich mit dem Capture-Eingang
> bis auf die Taktrate des MC herankommen (was die Genauigkeit der
> Erkennung betrifft)?

Die zeitliche Auflösung des Capture-Eingangs ist eine Periode des 
Timer-Taktsignals (IO-Takt geteilt durch Vorteiler). Und es gibt eine 
Verzögerung bei der Erkennung des Capture-Events die zwischen 2 und 3 
IO-Taktperioden liegt.

> So langsam bekomme ich das Gefühl, dass das einfache Impulszählverfahren
> (trotz Vorteiler durch 6 oder 8)in meinem speziellen Fall doch der beste
> Weg ist.

Eine Genauigkeit von mehr als 1ppm ist bei Verwendung eines TCXO nicht 
zu erwarten. Insofern ist ein systematischer Fehler von 0.16ppm kein 
Problem.

Wenn du das ganze als Reziprokzähler aufbaust, hast du unabhängig von 
der Frequenz des Meßsignals einen systematischen Fehler von höchstens 
Meßzeit geteilt durch Referenzfrequenz. Mit 1 Sekunde und 20MHz also 
0.05ppm.

Ich nehme du hast den Artikel Frequenzzählermodul schon gelesen? Der 
sollte alle Fragen zum Reziprokzählerprinzip beantworten.

von Lurchi (Gast)


Lesenswert?

Die Unsicherheit am Anfang und Ende der Messzeit hat man so oder so - 
egal ob man es per µC, diskret oder im FPGA macht. Was man allerdings 
nicht machen sollte ist, ist eine getaktete Logic (µC oder FPGA) zu 
nutzen und dann noch einen dazu asynchronen Takt. Für die 
Reziprokmessung sollte als der Systemtakt vom Ref. Takt abgeleitet 
werden.

Für den Beschriebenen Fall wäre das Reziproke verfahren minimal 
günstiger, weil effektiv der 20 MHz Takt statt dem auf 6-8 MHz geteilten 
Takt gezählt wird.

Indem man mehr als nur die Zeit am Anfang und Ende der Messzeit 
bestimmt, sondern auch noch ein paar zusätzliche Zeiten zwischendurch 
ließe sich noch eine etwas bessere Auflösung erreichen. Dies gilt 
insbesondere wenn ein passender Teiler (hier also kein vielfaches von 5) 
gewählt wird, so dass man nicht mehrfach hintereinander genau an der 
Grenze ist.

Noch genauer könnte man über eine analoge Phasenmessung werden: Die 
Signal werden auf je 10 MHz nominell geteilt, und etwa per XOR gatter 
gemischt. Das gefilterte Signal spiegelt dann die kleine 
Differrenzfrequenz wieder.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.