www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analoges Tachometer mit Schrittmotor


Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin auf der Suche nach ein paar Tipps um einen analogen Tachometer 
zu programmieren. Die "Visualisierung" erfolgt mit einem aus einem 
Auto-Tachometer stammenden Schrittmotor. Die Eingangsimpulse kommen 
(zwangsweise) mit 0,5-25 Hz und werden mit einer Periodenmessung 
erfasst. Die Ansteuerung des Motors funktioniert soweit.

Leider jedoch ruckelt der Zeiger insbesondere beim "Langsamer werden" im 
unteren Bereich stark. Ich schätze die Messwerte kommen in zu langen 
Abständen (halt bis zu 2 sec) so dass der Motor die alte Position 
schneller anfährt, stehen bleibt (ist=soll) und dann bei der nächsten 
Messung weitermacht.

Eine Erhöhung der Geberfrequenz ist leider nicht möglich. Möglich wäre 
es die letzten bspw. 16 Werte zu mitteln um ein langsameres Abklingen zu 
erzwingen, allerdings macht das die Verzögerung ja noch größer. Zudem 
sind 16 Werte "oben" 1/25 Hz * 16 => 0,5 sec und "unten" im Extremfall 
32 sec. Das macht es unpraktikabel. Möglich wäre es dann noch einen 
Timer laufen zu lassen der 10 mal in der Sekunde den Wert übernimmt und 
mit anderen mittelt. Dann würden zwangsweise auch Werte mehrfach 
einbezogen, aber es würde immer über einen konstanten Zeitraum 
gemittelt.

Rampen etc. für den Stepper sind auch nur bedingt tauglich, da der 
Endwert ja nie vorhersehbar ist und man nicht weiß wie langsam der Motor 
brauchen sollte.

Mich würde es freuen wenn jemand schon mal ähnliches gemacht hat.

Gruß
Robert

Autor: Gerd B. (silicat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde 2 Arten von Filter ansetzen, wobei der 2. einfacher ist und 
dieser vielleicht schon reicht.

1.) Den Sollwert so schnell runter laufen lassen, dass er beim nächsten 
Impuls GENAU sein Zeil erreicht. Er steht zb bei 1Hz. Nach 2Sek kommt 
ein neuer Impuls. 2Sek=0.5Hz. Er muss jetzt also auf 0.5Hz. Annahme: der 
nächste Impuls kommt auch wieder erst nach 2 Sekunden. Deshalb läßt Du 
jetzt Deinen Wert von 1Hz nach 0.5Hz fallen mit der Steigung: 
(1Hz-0.5Hz)/2Sec.
Das wird nicht ideal sein, da man den nächsten Impuls nie genau 
vorhersagen kann. Aber es wird es deutlich verbessern.
Deshalb das 2. Filter:

2.) Ein normales Tiefpassfilter 1. Ordnung.
Dazu rufst Du folgende Berechnung zB. alle 100ms (oder kürzer) auf:

filter_wert_long += Eingangswert-Ausgangswert;
Ausgangswert = filter_wert_long/n;

wobei an der Stelle n ein konstanter Wert 2,4,8,16,32,64,128 .. stehen 
muss und die Variable filter_wert_long ggf. vom Typ long sein muss, da 
sie n mal so groß werden kann, wie der maximale Eingangswert.
Je größer n, je langsamer und besser das Filter.


Gruß -siliCAT-

Autor: Gerd B. (silicat) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Robert

noch ein 3. Filter. Es basiert auf dem 2., hat aber noch eine 
Gewichtung, so dass hohe Frequenzen schnell gefiltert werden und 
niedrige langsam

filter_wert_long += (Eingangswert-Ausgangswert)*Eingangswert;
Ausgangswert = filter_wert_long/n;

Wichtig: n muss größer als der maximale Eingangswert sein !!!!




Mich hat Dein Problem jetzt selbst in den Fingern gejuckt und ich habe 
unter http://www.silicat.de/upload/tacho.zip eine kleine Simulation 
(800kBytes , VisualBasic, kleiner Installer + Uninstaller).
Damit sieht man, wie beide Filter wirken.

Gruß, -siliCAT-

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gerd,

vielen herzlichen Dank für Deine Mühe! Habe Dein Program ausprobiert 
(hatte die Runtime schon - evtl. würden sich mehr Leute ohne Installer 
trauen). Bin begeistert wie schnell du "mal eben" ein Testprogram aus 
dem Hut gezaubert hast was auch noch wirklich korrekt arbeitet.

Offensichtlich hast du den Effekt akkurat nachgebildet. Gehe ich von 
einer beliebigen Frequenz auf 0,5 Hz runter dauert es genau die 2 
Sekunden bis irgend eine Reaktion erfolgt. Mache ich einen 
Zwischenschritt bei 1 Hz würde der Zeiger dort erst stoppen und dann 
beim vorliegen des 0,5 Hz Messwertes wieder anlaufen. Deine Filter 
beugen dem ja prinzipiell durch eine Verlangsamung des Zeigers vor, was 
jedoch bei schnellen Ausschlägen störend sein könnte. Ebenfalls 
problematisch ist das "langsame Herankriechen" an den Zielwert.

Deine erste Idee mit der variablen Frequenz gefiel mir am allerbesten. 
Unter der Annahme dass die Beschleunigung, und damit eben die zeitliche 
Änderung der Periodendauer, begrenzt ist, könnte man das Eintreffen des 
nächsten Messwertes vorhersagen. Davon die obere Grenze (d.h. die 
maximale Verzögerung) berücksichtigen, damit wirklich kein Ruckeln 
entstehen kann.

Was mich wundert ist dass es dazu scheinbar wenig im Netz gibt. Alle 
machen es mit Digitalanzeigen, wo natürlich genau dieses Problem 
überhaupt nicht störend in Erscheinung tritt...

Gruß
Robert

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.