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 ?
Du mußt nur ein Timeout vorsehen (ggf. Überläufe zählen) und dann das Ergebnis auf 0 setzen.
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
0Hz zu messen stell ich mir etwas schwer vor, da du unendlich lange warten müsstest.
Besser gesagt sind das nicht 0Hz sondern weniger als 1Hz, also 0,XHz. MfG Andi
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.