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
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-
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-
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
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.