Forum: Mikrocontroller und Digitale Elektronik 0Hz messen mit Input Capture


von Benedikt (Gast)


Lesenswert?

Mit einem mega8 erfasse ich eine Motordrehzahl im Bereich 0-500Hz.
Die Taktfrequenz von Timer 1 liegt bei 62500Hz. Somit lässt sich der
Bereich 1Hz bis >10kHz mesen.
Gibt es irgendeinen einfachen Trick um Frequenzen <1Hz zu erkennen, um
Fehlmessungen zu umgehen ?
Wenn der Motor steht, bleibt der zuletzt gemessene Wert erhalten, da
kein Input Capture Interrupt erfolgt, weshalb die Regelung nicht
funktioniert.

Hier nochmal alles zusammengefasst, was ich erreichen möchte:
Frequenz >=1Hz: Frequenz=62500/(Input Capture-letzen Input Capture)
Frequenz <1Hz: Frequenz=0

Vermutlich geht das über eine Softwaremäßige Erweiterung des Input
Capture Registers auf 24bit, nur wie erkenne ich den Zeitpunkt, zu dem
ich das Register auslesen muss, wenn kein Capture Interrupt erzeugt
wird ?

von Michael (Gast)


Lesenswert?

Du mußt nur ein Timeout vorsehen (ggf. Überläufe zählen) und dann das
Ergebnis auf 0 setzen.

von Andi (Gast)


Lesenswert?

Du könntest ja noch den Timer-Overflow aktivieren welcher eine Variable
hochzählt zum erfassen von weniger als 1Hz.
Muß dann von der Input-Capture-ISR zurückgesetzt werden.

MfG
Andi

von Chris (Gast)


Lesenswert?

0Hz zu messen stell ich mir etwas schwer vor, da du unendlich lange
warten müsstest.

von Andi (Gast)


Lesenswert?

Besser gesagt sind das nicht 0Hz sondern weniger als 1Hz, also 0,XHz.

MfG
Andi

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es jetzt mit einem zusätzlichen Register als 24bit Erweiterung
gelöst.
Dieses wird bei jedem Timer Overflow erhöht.
Ist es bei einem TimerOverflow bereits 1 (also der Zählerstand wird
jetzt auf 2, also 131072 erhöht), dann wird die Frequenz aus Null
gesetzt. Dazu setze ich TRot auf 65535, was von der Dividierroutine in
eine Frequenz von 0Hz umgewandelt wird.
Liegt die Frequenz irgendwo zwischen 0Hz und 1Hz, dann wird ab und zu
ein Input Capture Interrupt ausgelöst und auch hier wird das erweiterte
Input Capture Register ausgewertet.

Allerdings bin ich nicht ganz sicher, ob es nicht Sonderfälle gibt
(z.B. bei geringen Frequenzen, oder wenn gleichzeitig ein Timer
Overflow und ein Input Capture Interrupt auftreten), ob dann die Werte
nicht mal falsch werden können.

von Michael (Gast)


Lesenswert?

Ich gebe Dir mal mein Programm, wo Du in der Routine t1_cap_int() sehen
kannst, wie man die Überläufe handhaben kann.
Wenn Du T1 schneller laufen läßt (kleinerer Vorteiler), hast Du mehr
Überläufe in 1 Sekunde und kannst das Timeout besser auflösen.

http://www.mino-elektronik.de/progs/avr/fm.c

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.