Forum: Mikrocontroller und Digitale Elektronik Frequenzzähler eigenbau, Jitter beim Interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Holger K. (holgerkraehe)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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!

von Holger K. (holgerkraehe)


Bewertung
0 lesenswert
nicht lesenswert
@MOD

Irgendwas stimmt mit den Bildern nicht...

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

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


Bewertung
1 lesenswert
nicht lesenswert
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.

von Wolfgang (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Holger K. (holgerkraehe)


Bewertung
0 lesenswert
nicht lesenswert
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.

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


Bewertung
0 lesenswert
nicht lesenswert
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.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Holger K. (holgerkraehe)


Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten.

Dann steht wohl einem erfolgreichen Neubau nichts mehr im Wege!

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
> 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.

: Bearbeitet durch User
von Holger K. (holgerkraehe)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

von Stephan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ein Vorteiler macht den Zähler doch auch wieder ungenauer, als der TO es 
gerne hätte! Er will jeden einzelnen Takt im Zeitfenster zählen.

von Stephan (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Holger K. (holgerkraehe)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Erwin D. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Pandur S. (jetztnicht)


Bewertung
0 lesenswert
nicht lesenswert
> 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

von Stephan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
er hat einfach nicht richtig geschaut

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von W.S. (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.