- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Frequenz messen über Counter 1 ?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.06.2004
    Beiträge
    38

    Frequenz messen über Counter 1 ?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    13.04.2005
    Beiträge
    56
    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ß

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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).
    Disclaimer: none. Sue me.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    13.04.2005
    Beiträge
    56
    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ß

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Nein, bei WinAVR findest das nicht.

    http://atmel.com/dyn/resources/prod_...ts/doc0856.pdf
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    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.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    09.06.2004
    Beiträge
    38
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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...
    Disclaimer: none. Sue me.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    09.06.2004
    Beiträge
    38
    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

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    ä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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus