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?
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!
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.
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.
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.
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.
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.
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 ;-)
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.