PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenz messen über Counter 1 ?



Jericho_one
24.02.2007, 14:22
Hi!

Ich habe folgendes vor/Idee: Ich will an Conter 1 (PB1) eine Frequenz anlegen im Bereich sagen wir 0 - 500kHz (Rechtecksignal) und diese natürlich messen. (Also soll am besten igrndwie im Hintergrund ein Zähler laufen,der z.b. 0,02 sec läuft und während desse zählt der Counter - auch im Hintergrund - die Flanken)

Nur irgendwie steh ich grad wie der Ochs vorm Berg und komm net so recht vorran. Gobts irgendwo ähnliche Beispiele?

MFg und Danke

Charly_cs
24.02.2007, 15:37
Hi!

So etwas ähnliches hab ich auch gemacht nur umgekehrt für eine Ultraschallmessung. Du musst das Signal an einen Interruptport anlegen und natürlich vorher festlegen auf welche Flanke er reagiert. Die erste festgelegte Flanke (z.B. rising) startet dann einen Timer und die nächste Flanke (auch wieder rising) stoppt ihn wieder. Jetzt kannst du den Timerwert auslesen und je nachdem was für ein Quarz du nutzt, die Signalzeit für eine Periode auslesen und berechnen. Deine Frequenz wäre dann F = 1/T (T = Signalzeit in Sekunden). Schau mal unter www.Mikrocontroller.net nach, da gibts eine Menge zu dem Thema und hier eigentlich auch.

Gruß

SprinterSB
24.02.2007, 18:10
Angabe deiner Hardwär wär hilfreich (Controller, Takt, ...)

IMHO ist eine Frequenz von 500kHz bei F_CPU = 16MHz zu hoch für den angesprochenen Ansatz. Es würde bedeuten, daß man einen totale ISR-Zeit von 32 maximal Zyklen hat.

Leider ist es bei AVR nicht möglich einen Timer von extern zu starten oder zu stoppen.

Ich würde es folgendermassen lösen: Manche AVRs haben T0/T1 Eingänge, durch die man Timer1 takten kann. Der Takt von Timer1 wird also nicht vom MCU-Takt abgeleitet, sondern kommt von extern.

Also so:
1. Referenztimer (irgendein Timer ausser No.1) zurücksetzen
2. Timer1 zurücksetzen
3. Timer1 auf extern zählen lassen
4. Referenztimer starten
5. Warten
6. Referenztimer Stoppen (zb in einer ISR)
7. Timer1 stoppen und Wert nehmen (zB in der gleichen ISR)
8. Auswertung

Timer1 kann geprescaled werden, ebenso der Referenztimer.

Beachte, daß die Zählereignisse synchron mit dem MCU-Takt erfolgen. Das ist für die Fehlersbabschätzung. In die Fehlerabschätzung geht ebenfalls mit ein: Zeitdifferenz zwischen Einschalten der Timer, gleiches gilt für's Aussschalten. (Eine Messung ohne bekannte Fehlergrenzen hat keine Aussagekraft ;-))

ALternativ lässt man Timer1 auf extern bis auf einen OutputCompare Zählen und nimmt in OutComp-ISR von Timer1 die Zeit von TimerR.

Neuere AVR haben eine PLL vor der I/O-Clock, mit der man den I/O-Takt bis auf 64MHz bringen kann. Ab das tafür taucht oder nur für PWM erfährst zu im Datenblatt. ZB ATtiny26/46/86 (oder 25/45/85, kann ich mir nie merken).

Charly_cs
24.02.2007, 20:11
Hi!

Gibt es irgendwo eine Liste wo ich nachschauen kann, wieviele Zyklen ein bestimmter Aufruf braucht oder kann ich das irgendwo bei Winavr nachschauen? Hab für mein Schiffsecholot ohne Probleme Frequenzen mit 150Khz für den Burst erstellen können.

Gruß

SprinterSB
24.02.2007, 20:16
Nein, bei WinAVR findest das nicht.

http://atmel.com/dyn/resources/prod_documents/doc0856.pdf

wkrug
24.02.2007, 22:55
Das Verfahren von SprinterSB ist schon sehr gut, allerdings kriegt man dabei gerade bei niedrigen Frequenzen relativ hohe Ungenauigkeiten.
Muss die Frequenz tatsächlich bi 0 anfangen, oder reichen auch 100...200Hz ?
Wie wärs die Taktfrequenz durch einen programmierbaren Vorteiler laufen zu lassen, der je nach Frequenz zwischen 1 und 256 teilt ?
Ein fester Vorteiler ginge vermutlich auch.
Dann hast Du bei 500kHz bei einem Teilerfaktor von 256 immerhin ca. 8000 Taktzyklen für deine ISR Routine.
Der Ausgang des Vorteilers wird dann natürlich wieder an einen Interruptpin , oder was ich noch besser fände, an den ICP Pin gehängt.

Jericho_one
24.02.2007, 23:29
Hallo!

Also zuerst mal danke für die Tips.
Verwendet wird ein Atmega 32. Das mit ICP war auch schon angedacht.
Wg der Frequenz: Gedacht ist das ganze zur Drehzahlerfassung, was über einen optischen Sensor geschieht. Je nach unterteilung der einzelnen "Abschnitte" liegt die Frequenz. Dies kann man aber auch limitieren. 500kHz ist eher ein Extremfall!!!!

MFG

SprinterSB
25.02.2007, 16:28
Das externe Zählen ist für hohe Frequezen IMHO das beste Verfahren.

Bei niedrigen Frequemzen würde ich Capture-Compare bevorzugen.

Problem ist dann nur noch, zur Laufzeit zu entscheiden, welche Messung man machen will...

Jericho_one
25.02.2007, 16:41
Hi!

Gibts irgendwo für den Counter ein Beispielprogramm?
Für den ICP hab ich jetzt schon das ein oder andere Beispiel gesehen.

MFG und Danke

bL1nK
25.02.2007, 18:14
äh der 16bit counter, hat ne funktion die dir in hardware zur frequenzbestimmung dient. ich weiß jetzt nicht welchen uC du hast, aber der atmega8 hat das sicher.

hierzu beachte man das kapitel: 16-bit timer/counter1 -> input capture unit

hier wird soweit alles in hardware erledigt nur noch register auslesen und mit dem 16bit wert rumrechnen :)

Jericho_one
25.02.2007, 18:23
HAb nen Atmega 32 - also quasi dasselbe wie der 16er - muss ich mich morgen mal drauf stürzen - hauotsache der rest läuft etz endlich so wie ich will..:)

Schon ma Danke!

bL1nK
25.02.2007, 18:38
der atmega32 kann das bestimmt auch, einzige vorraussetzung ist halt du beschaltest entweder input-caputre pin oder einen der ADC pins oooder es geht sogar mit dem negativen AC pin ;)