www.mikrocontroller.net

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


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Michael (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

MfG
Andi

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.