Forum: Mikrocontroller und Digitale Elektronik Periodenlänge schnell messen


von Schorsch (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine Mikrocontrollerschaltung mit der ich mit 1kHz mehrere 
Zustände abfragen kann und per USB raussende, das funktioniert super.

Nun möchte ich ein Frequenzsignal messen. Das Signal schickt einen High 
Pegel alle ~50µs (also 20kHz). Messen daran möchte ich das '~'. Ich gehe 
von einem Frequenzbereich von 19.5kHz - 20.5kHz aus.

Da ich das Signal mit 1kHz, also 1/ms samplen möchte ist eine 
Taktzählung á la HC4020 ausgeschlossen. Ich muss über die Periodenlänge 
gehen.

Ich dachte daran mit Logikbausteinen das High (oder das Low) Signal mit 
einer weiteren Clock zu verunden und dann innerhalb einer Periode die 
Pulse mit einem 4020 zu messen. Über ein Schieberegister kann ich dann 
die Zählerstände einlesen. Angenommen ich möchte mit 14bit (siehe 4020) 
auskommen und ich benutze 50MHz Samplingfrequenz, dann hätte ich ca 7bit 
effektiv über die zu betrachtene Breite - das würde mir ausreichen.

Nun zu meiner Frage:
Hat jemand zufällig so eine Schaltung schonmal ausprobiert? Ehe ich eine 
Platine bestelle, hätte ich gerne so eine Beispielschaltung gesehen?
50MHz ist schon heftig, muß ich hier aus Bauteilvarianten o.ä. achten. 
Ich hätte auf jeden Fall die Leiterbahnen so kurz und rund wie möglich 
gemacht, und einseitig GND wo es geht.

Danke im Voraus

Schorsch

von Karl H. (kbuchegg)


Lesenswert?

Schorsch schrieb:
> Hallo zusammen,
>
> ich habe eine Mikrocontrollerschaltung

welchen?

Mit AVRs ist das zb alles kein Problem, wenn der Timer mit der Input 
Capture Unit noch frei bzw. in einem brauchbaren Taktbereich zählt.

Auch können oft integrierte Timer als Taktquelle einen Input Pin 
benutzen. Auch damit ist die Sache problemlos nur mit Bordmitteln 
machbar.

von Fabian O. (xfr)


Lesenswert?

Vielleicht ist dieser Artikel für Dich interessant:

http://www.mikrocontroller.net/articles/High-Speed_capture_mit_ATmega_Timer

von Schorsch (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> welchen?
>
> Mit AVRs ist das zb alles kein Problem, wenn der Timer mit der Input
> Capture Unit noch frei bzw. in einem brauchbaren Taktbereich zählt.
>
> Auch können oft integrierte Timer als Taktquelle einen Input Pin
> benutzen. Au

Hallo,

zur Zeit ist ein Atmega8 drauf, die neue Version wird aber einen mega64 
kriegen.

...Da hab ich noch gar nicht drüber nachgedacht....

Du meinst ich könnte einfach den Prescaler eines 16bit Timers auf Null 
stellen, und über ein externes Interrupt zählen..? Coole Idee, gefällt 
mir; minimiert definiv den Schaltungsaufwand. Hast Du zufällig 
Beispielcode?

Georg

von Karl H. (kbuchegg)


Lesenswert?

Schorsch schrieb:

>> Auch können oft integrierte Timer als Taktquelle einen Input Pin
>> benutzen. Au
>
> Hallo,
>
> zur Zeit ist ein Atmega8 drauf, die neue Version wird aber einen mega64
> kriegen.
>
> ...Da hab ich noch gar nicht drüber nachgedacht....
>
> Du meinst ich könnte einfach den Prescaler eines 16bit Timers auf Null
> stellen, und über ein externes Interrupt zählen..?

Nein.

Ich meine vor allen Dingen, dass du einen Blick ins Datenblatt riskieren 
sollst. Da hat Atmel extra eine schöne Tabelle bei jedem Timer 
abgedruckt, in der steht, wie man einen Timer takten lassen kann. Keine 
Angst, mann kriegt davon keinen Augenkrebs.

Im Falle des Mega 8
http://www.atmel.com/images/doc2486.pdf
Seite 99

von Ulrich (Gast)


Lesenswert?

Die passende Funktion beim AVR nennt sich "input capture". Damit wird 
bei einer Flanke der aktuelle Zählerstand von Timer1 gespeichert. Die 
Periodenmessung in dem Frequenzbereich geht damit ohne externe Hardware.

Ein Softwarebeispiel findet sich hier:
http://www.rn-wissen.de/index.php/Timer/Counter_(Avr)#Input_Capture

von amateur (Gast)


Lesenswert?

Im Grunde gibt es hierfür zwei Möglichkeiten:
1. Du schnappst Dir einen schnellen Zähler.
   Mit der ersten steigenden Flanke startest Du den Zähler.
   Mit der nächsten hältst Du ihn an und schaust nach was los ist.
   Höhere Frequenz: Weniger Ticks.
   Genauigkeit: Stark abhängig von möglichen Quarz/Teilerfaktoren.
   Schnell. Min. jeder zweite Impuls.
2. Du nimmst einen langsamen Zähler für ein Zeitraster und einen
    zweiten Zähler zum Zählen der einkommenden Impulse.
    Den zweiten Zähler kannst Du sparen, wenn Du sonst wenig zutun
    hast indem Du ihn durch Software plus Unterbrechung
    implementierst.
   In festem Raster schaust Du nach wie viele Pulse eingegangen sind.
   Höhere Frequenz: Mehr Impulse.
   Genauigkeit:  Feiner einstellbar.
   Langsamer. Möglichst nahe 255 bzw. 65535 Taktzyklen.

von m.n. (Gast)


Lesenswert?

amateur schrieb:
> Im Grunde gibt es hierfür zwei Möglichkeiten:

Stimmt.
1. Möglichkeit: 'input capture' mit +Flanke
2. Möglichkeit: 'input capture' mit -Flanke

Alles andere wäre Gewürge.

von Schorsch (Gast)


Lesenswert?

Hallo,

Ich find die Idee mit dem Input Capture wirklich gut und werde sie 
sobald möglich ausprobieren

Danke für die wirklich schnelle Hilfe...

Schorsch

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

vielleicht hat sich ja die Aufgabe seit deinem ersten Post verändert und 
ich habe das nicht mitbekommen, aber dein Angaben waren Periodenmessung 
von 50 µs auf 14 bit genau - dazu brauchst du eine zeitliche Auflösung 
der Messung von 3 ns, völlig egal wie dein Messaufbau ist.

Du kannst aber weder einen 4020 mit 300 MHz takten noch arbeitet ein 
µController-Capture auch nur annähernd mit solchen Frequenzen. Aber 
vielleicht habe ich ja alles missverstanden.

Gruss Reinhard

von m.n. (Gast)


Lesenswert?

Reinhard Kern schrieb:
> vielleicht hat sich ja die Aufgabe seit deinem ersten Post verändert und
> ich habe das nicht mitbekommen, aber dein Angaben waren Periodenmessung
> von 50 µs auf 14 bit genau

Eingangs steht etwas von 7Bit effektiv, die ihm reichen würden.

Bei einem mit 20MHz getakteten AVR ist die überschlägige Rechnung der 
Auflösung recht einfach: 20MHz Zählertakt zu ca. 20kHz Meßsignal ergibt 
eine Auflösung von ca. 1000 Punkten/Periode.
Bei 1ms Erfassungsrate könnten auch gleich 20 Perioden gemessen werden.

Falls dies nicht reichen sollte, wäre die nächst günstige Lösung einen 
STM32F4 zu nehmen, dessen Timer mit 168MHz laufen können und wiederum 
per 'input capture' rund 6ns Auflösung bieten.
Vermutlich wird aber das zu messende Signal garnicht so stabil sein, 
dass schon ein AVR locker alle Bedürfnisse abdeckt.

von Udo S. (urschmitt)


Lesenswert?

Weiter stellt sich die Frage ob er wirklich alle Millisekunde einen 
neuen Messwert braucht.
Er kann sonst ja auch noch mehr Perioden messen um einen genaueren Wert 
bei der gegebenen Taktfrequenz des µC zu erhalten.

von m.n. (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Weiter stellt sich die Frage ob er wirklich alle Millisekunde einen
> neuen Messwert braucht.

Schorsch schrieb:
> Da ich das Signal mit 1kHz, also 1/ms samplen möchte

Er möchte es so haben. Das ist doch ne klare Ansage und kein Grund, es 
ihm ausreden zu wollen.

von .trivial. (Gast)


Lesenswert?

Man kann wahweise laenger messen und mehr aufloesung haben.

von Schorsch (Gast)


Lesenswert?

m.n. schrieb:
> Eingangs steht etwas von 7Bit effektiv, die ihm reichen würden.

wenn ich mit 7 oder 8 bit den unterschied zwischen 19.5 und 20.5 kHz 
messen kann würde das schon völlig reichen

Sorry, wenn ich mich falsch ausgedrückt habe

Schorsch

von m.n. (Gast)


Lesenswert?

Schorsch schrieb:
> m.n. schrieb:
>> Eingangs steht etwas von 7Bit effektiv, die ihm reichen würden.
>
> wenn ich mit 7 oder 8 bit den unterschied zwischen 19.5 und 20.5 kHz
> messen kann würde das schon völlig reichen

Und hast Du es gelöst und wenn ja, wie?

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.