Hallo zusammen
Ich habe mir gestern kurzerhand einen Frequenzzähler aufgebaut.
Zwei Kanäle mit je 24bit Zählerstufe (zwei HC4040) pro Kanal.
Für die Datenausgabe der 48bit zum Controller dienen sechs
Schieberegister (HC165).
Das funktioniert soweit so gut.
Meine idee war, dass ich auf dem Mikrocontroller genau 1s warte, dann
bei den Schieberegistern das Parallel Load durchführe (nun sind die
Werte ja gespeichert.) Dann direkt dannach beim Zähler einen Reset
durchführe.
Nun habe ich ja die Frequenz in Herz.
Zu Testzwecken, habe ich den Oszillator (Kein Quarz!) des
Mikrocontrollers, welcher 4MHz hat, an den Eingang angeschlossen.
Meiner Meinung nach, müsste ich nun immer ganz exakt, 4MHz messen
können.
Denn der Timer Interrupt kommt ja nach genau 4 000 000 Pulsen.
Und in dieser Zeit, hat der Zähler ja genau 4 000 000 Pulse gesehen.
Leider Gibt es einen offset von etwa 4-6 Hz sowie einen Jitter von 3 Hz.
Meine Interrupt routine:
1
ISR(TIMER1_COMPA_vect)
2
{
3
//Daten speichern
4
//PL ist ständig aktiv und wird erst hier inaktiv.
5
//Somit wird etwas zeit gespaart im Interrupt.
6
PL_1;
7
RST_1;
8
RST_0;
9
spiData=1;//Flag, damit die Daten im main loop verarbeitet werden
10
}
Hat jemand eine Idee, wo hier das Problem sein könnte?
Danke!
Holger K. schrieb:> Hat jemand eine Idee, wo hier das Problem sein könnte?
Genaue Augangsimpulse erzeugt man mit Compare-Registern und nicht durch
laufzeitabhängige ISRs.
Wenn Du schon einen AVR verwendest, nutze die Input-Capture Funktion von
Timer 1 und baue Dir gleich einen reziproken Frequenzzähler.
Holger K. schrieb:> Nun habe ich ja die Frequenz in Herz.
Im Herzen nutzen Dir die Frequenzen nur in einem sehr schmalbandigen,
niederfrequenten Bereich. Für die Auswertung würde ich die Einheit Hertz
bevorzugen ;-)
Holger K. schrieb:> Hat jemand eine Idee, wo hier das Problem sein könnte?
Ja. Du machst es falsch.
Wenn du ein Intervall von exakt 1s Länge erzeugen willst, dann kannst du
Software vergessen. Nutze statt dessen die Output-Compare Funktion eines
Timers.
Allerdings sind reine Zählfrequenzmesser nicht sonderlich praktisch;
z.B. versagen sie komplett bei niedrigen Frequenzen. Ein Reziprokzähler
ist nicht aufwendiger und hat eine konstante Auflösung (Anzahl gültiger
Stellen) über den gesamten Meßbereich.
Eine Suche hier im Forum liefert etliche Treffer. Das Meßverfahren habe
ich im Artikel Frequenzzählermodul erklärt.
Holger K. schrieb:> Zwei Kanäle mit je 24bit Zählerstufe (zwei HC4040) pro Kanal.>> Für die Datenausgabe der 48bit zum Controller dienen sechs> Schieberegister (HC165).
Den Aufbau der ganzen Bits in Hardware kannst du dir normalerweise
sparen. Sofern die Taktfrequenz nicht zu hoch ist, kannst du dein Signal
direkt mit einem der eingebauten Timer/Counter zählen. Bei schnelleren
Signalen baust du nur die ersten Bit als Hardware-Zähler (z.B. 8 Bit)
auf und lässt die höheren Bits vom µC per HW-Zähler oder per
Pin-Interrupt durch den Übertrag zählen. Das spart dir auch viele
Schieberegister für die Datenübernahme in den µC.
Interrupt-Routinen werden bei AVR's nicht sofort bei Auslösung, sondern
einige Takte mehr oder weniger spät ausgeführt. Ich glaube es waren bis
zu 7 Takte verzögerung.
Das "bis zu" ist der Jitter, den zu beobachtet hast.
Danke für die Inputs
Das ärgert mich nun schon ein wenig, dass ich doch einige Zeit in ein,
ansich, ziemlich nutzloses Board investiert habe.
Ich werde wohl das nächste Wochenende einen neuen Frequenzzähler bauen
:)
Eine Frage zum Artikel, weshalb wurde dort 14.31MHz als Referenz
verwendet?
Mein Ansatz wäre, einen STM32F0 zu verwenden, anstelle des Atmega8.
Die Referenzfrequenz bei z.B. 16MHz anzusetzen.
Holger K. schrieb:> weshalb wurde dort 14.31MHz als Referenz verwendet?
Das ist eine Standardfrequenz im PC-Bereich und entsprechende Quarze
finden sich (ausgelötet von alten Mainboards) in vielen Bastler-Kisten.
Der genaue Wert der Frequenz ist am Ende unkritisch, geht ja sowieso als
Konstante in das Programm ein.
Axel S. schrieb:> Der genaue Wert der Frequenz ist am Ende unkritisch, geht ja sowieso als> Konstante in das Programm ein.
Wissen sollte man die Konstante allerding schon. Und das ist bestimmt
nicht diejenige Zahl, die auf dem Quarz drauf steht. Eine Eigenschaft
gängiger µC-Quarze ist, dass sie hauptsächlig billig sind und das
deckt sich selten mit genau. Kalibrieren muss man gegen eine
vernünftige Referenz.
Holger K. schrieb:> Mein Ansatz wäre, einen STM32F0 zu verwenden, anstelle des Atmega8.> Die Referenzfrequenz bei z.B. 16MHz anzusetzen.
Da lohnt der Umstieg auf ARM doch garnicht. Für niedrige Frequenzen <
300 kHz tut es der ATmega genau so gut. Bei höheren Frequenzen braucht
auch ein STM32F0x zusätzliche externe Logik und/oder einen separaten
Vorteiler. Bei Fref 16 MHz bieten beide Varianten die gleiche Auflösung
bei gleicher Meßrate.
Wenn schon STM32 dann doch besser gleich einen mit hoher interner
Referenzfrequenz >= 168 MHz. Der Faktor 10 ist direkt nutzbar.
> Das ärgert mich nun schon ein wenig, dass ich doch einige Zeit in> ein, ansich, ziemlich nutzloses Board investiert habe.
Warum ist es für dich nutzlos. ich glaube, ich habe den Knackpunkt noch
nicht erfasst.
Dein Frequenzzähler kann die Frequenz nicht ganz exakt erfassen, wegen
dem Jitter. Das ist nun klar. Klar ist aber auch, daß jedes Meßgerät
seine Grenzen hat. In prozent ausgedrückt ist die Abweichung ziemlich
gering. Wie genau brauchst du es denn?
Ich frage deswegen, weil deine Methode nur die Anzahl von Impulsen pro
Sekunde messen kann. Sie kann aber nicht zwischen 4 Mhz und 4,0000005
Mhz unterscheiden.
Bedenke auch, daß Quarze nicht 100,0000% genau sind. Wenn dein
Frequenzzähler tatsächlich genau 4 Millionen Takte gezählt hat, bleibt
immer nich die Frage offen, ob die Sekunde wirklich genau eine Sekunde
lang war.
Stefan U. schrieb:> Warum ist es für dich nutzlos. ich glaube, ich habe den Knackpunkt noch> nicht erfasst.
Ich war da ein wenig demotiviert, da ich relativ viel Zeit in etwas
investiert habe, was mit geringerem Aufwand und dazu noch genauer,
realisiert hätte werden können.
Stefan U. schrieb:> Bedenke auch, daß Quarze nicht 100,0000% genau sind. Wenn dein> Frequenzzähler tatsächlich genau 4 Millionen Takte gezählt hat, bleibt> immer nich die Frage offen, ob die Sekunde wirklich genau eine Sekunde> lang war.
Das ist klar.
Für genaue Messungen würde ich, wenn, dann einen OCXO verwenden.
m.n. schrieb:> Da lohnt der Umstieg auf ARM doch garnicht. Für niedrige Frequenzen <> 300 kHz tut es der ATmega genau so gut. Bei höheren Frequenzen braucht> auch ein STM32F0x zusätzliche externe Logik und/oder einen separaten> Vorteiler.
Den ARM möchte ich verwenden, da ich dafür die besseren Tools zur
verfügung habe.
Ich bin aktuell daran, den neuen Counter zu entwerfen.
Momentan bereitet mir die Eingangsstufe etwas Kopfschmerzen.
Was wäre hier alles wünschenswert?
Beim Counter gehe ich mal von 0.1 .. 50MHz aus.
Aktuell habe ich einen einfachen Komparator vorgesehen.
Scheint aus meiner Sicht ideal. Aber vielleicht sehe ich hier wieder was
nicht. Bin um Inputs dankbar. Anbei der Eingang.
Mit R2 bzw allgemein mit dem Spannungsteiler am + Eingang, könnte die
Schwelle des Triggers definiert werden.
Stephan schrieb:> schau mal bei Michael (m.n.) auf die Seite. Mino Elektronik.> Der hat dort einen Eingangsteiler veröffentlicht und noch einige> anregungen für Zähler.
Danke für den Tipp.
Leider hat er ausschliesslich einen Digitaleingang verwendet.
Ich hätte gerne einen Eingang von 200mVpp-50Vpp @ 0.1 - 50MHz
Sowie einen DC Bereich.
Leider kann dass der Counter von Mino nicht.
Holger K. schrieb:> Stephan schrieb:>> schau mal bei Michael (m.n.) auf die Seite. Mino Elektronik.>> Der hat dort einen Eingangsteiler veröffentlicht und noch einige>> anregungen für Zähler.>> Danke für den Tipp.> Leider hat er ausschliesslich einen Digitaleingang verwendet.>> Ich hätte gerne einen Eingang von 200mVpp-50Vpp @ 0.1 - 50MHz> Sowie einen DC Bereich.
Eingangsstufe DC-50MHz:
http://www.mino-elektronik.de/fmeter/eingangsstufe.htm> Leider kann dass der Counter von Mino nicht.
0.0025Hz-50MHz:
http://www.mino-elektronik.de/fmeter/fmeter.htm
> Das ärgert mich nun schon ein wenig, dass ich doch einige Zeit in ein,
ansich, ziemlich nutzloses Board investiert habe.
Nee. Das war doch lehrreich. Heutzutage wuerde man eher einen CPLD/FPGA
verwenden. zB einen Max 3064, mit 64 Flipflops. Die sollten genuegen und
koennen rekonfiguriert werden bis es passt. Moderne Zaehler
funktionieren etwas anders wie mit einer fixen Gatezeit.
Siehe zB https://radiokot.ru/konkursCatDay2014/30/02.pdf oder aehnlich
wenn man im Netz nach reciprocal frequency counter sucht
Zunächst zur Eingangsstufe:
Sofern man sehr niedrige Frequenzen erfassen möchte oder auch eine reine
Zählfunktion programmieren möchte, empfiehlt es sich, den Eingang
DC-gekoppelt auszulegen. In der Praxis braucht man ferner einen
hochohmigen Abschwächer, um Mehrfachzählungen durch Übersteuerung
auszuschließen, ein zuschaltbares Tiefpassfilter und einen einstellbaren
Offset, um bei 'komplexen' Eingangssignalen einen geeigneten
Triggerpunkt verwenden zu können. Dazu habe ich ein Schaltungsbeispiel:
http://mino-elektronik.de/fmeter/eingangsstufe.htm
Leider ist der PMBFJ620 nicht mehr erhältlich und der MAX961
zwischenzeitlich sehr teuer geworden. Der MAX hat den großen Vorteil,
einen invertierten Ausgang zu haben, mit dem eine niederohmige
Mitkopplung (Hysterese) eingestellt werden kann. Diese ist ebenso wie
der kompakte SMD-Aufbau notwendig, um die Schaltung vor
Eigenschwingungen zu schützen. Mit fliegendem Drahtaufbau wird man
Trauer haben.
Als einfacher, hochohmiger Komparator bietet sich ein TLV3501 an.
Nichts gegen einen STM32 dann aber bitte einen mit >= 100 MHz interner
Taktfrequenz. Damit kann man die gewünschten 50 MHz ohne externen
Vorteiler auf unterschiedliche Weise messen:
1. Man nimmt einen Timer mit zwei Capture-Eingängen, von denen der eine
direkt bis in den 100 kHz Bereich arbeitet. An den 2. Capture Eingang
schaltet man das Eingangssignal über einen Vorteiler, der aus einem
weiteren internem Timer gebildet wird. Entscheidend ist dabei die
Umschaltung, welchen Capture-Kanal man aktuell abhängig von der
Eingangsfrequenz auswertet.
2. Man nimmt einen Timer, um die Eingangsimpulse zu zählen. Einen
weiteren Timer braucht man, um die genaue Zeit zu erfassen. Beide Timer
brauchen Capture-Register. Zur Erzeugung des Capture-Signals braucht man
zusätzlich ein externes D-FF (z.B. 1/2 74xx74), welches nach Ablauf
einer minimalen Messzeit aktiviert und anschließend synchron zum
Eingangssignal gesetzt wird. Anhand der Werte der Capture-Register und
per ISR mitgezählter erfolgter Überläufe kann man die genaue, hoch
aufgelöste Frequenz berechnen.
Die zuletzt genannte Methode braucht zwar dieses D-FF läuft dafür ohne
Umschaltung von Fmin-Fmax in einem Bereich. Da immer auch Überläufe
beachtet werden müssen, reichen auch die internen Timer mit 16-Bit.
Um hier kein Buch zu schreiben, gebe ich Dir einen Link, bei dem die
Schaltungen zu den diversen Verfahren mit STM32F407 gezeigt sind:
http://mino-elektronik.de/FM_407/fmeter_407.htm
Die erste Schaltung nutzt externe Vorteiler für drei Kanäle und kann per
GPS-Signal stabilisiert werden. Die 2. Schaltung ist auf einen
Eingangskanal reduziert dafür aber per RS232 konfigurierbar.
Die Schaltung mit dem 429 Disco-Board nutzt einen internen Timer als
Vorteiler. Und die vorerst letzte Schaltung mit WQVGA-Display zeigt, wie
ein ext. D-FF zwei Timer für Zeit und Ereignisse synchronisiert und
lückenlos und ohne Umschaltung den gesamten Meßbereich abdeckt.
Ich bin noch nicht dazu gekommen, Beispielcode zu extrahieren. Aber Du
möchtest ja sicherlich Deine eigenen Erfahrungen machen ;-)
Für die Schaltungen mit LC-Anzeige kann ich Dir bei Bedarf jedoch
Leerplatinen anbieten.
Holger K. schrieb:> Ich hätte gerne einen Eingang von 200mVpp-50Vpp @ 0.1 - 50MHz> Sowie einen DC Bereich.
Also Holger,
was willst du primär: brauchst du in erster Linie einen Frequenzzähler,
oder liegt dir eher daran, sowas selbst zu bauen?
Es geht auch deutlich einfacher, ich hänge dir mal ein paar Bilder dran.
Der µC ist ein billiger einfacher PIC16F716, der Komparator am Eingang
ist ein ADCMP600 oder ein MAX999, die beiden Tore für Input und Referenz
sind zwei NC7SZ125, die Referenz ist ein TCO-990 von Toyocom und der
Quarz für den PIC ist fast egal, hier 18.432 MHz aus der Bastelkiste.
Das Ganze ist ein Reziprokzähler mit einer Torzeit im Bereich so etwa um
1 Sekunde herum (hängt ja vom Eingangssignal ab). Zusätzlich hat er noch
nen Pegelmesser, dessen Anzeige sieht man im Display unten rechts.
Ich hatte mir das Teil mal vor Jahren gebaut, um auch "im Feld" nen
Frequenzmesser zu haben. Ja, geht auch für 2m (grad so)
Die Eagle-Files und die PIC-Quelle hab ich grad nicht zur Hand, bei
Bedarf mußt du das einfach mal ansagen, dann findet sich das.
W.S.