Forum: Mikrocontroller und Digitale Elektronik gleitender Mittelwert oder was besseres


von MiGo (Gast)


Lesenswert?

Hallo @all,

ich suche nach einen guten algorithmus zum Werte dämpfen.
Anwendung: An einem Fahrzeug (landw. Zugmaschine) befindet sich ein 
Anbaugerät mit Wiegezellen (Drei Biegebalken mit Dehnungsmessstreifen).
Über einen instrumentationsverstärker bekomme ich ein Analogsignal auf 
meinen ADC vom mega8. Die ergebnisse sind überzeugend genau. Nur während 
der Fahrt schwankt mein Anzeigewerte enorm.
Die Drei Sensoren sind jeweils an einem mega8 angeschlossen und werden 
seriel abgefragt. Wenn ich mal so im halben sekundentakt alle drei über 
eine minute während der fahr aufzeichne und mit Excel einen Mittelwert 
bilde ist es auch wieder recht genau. Nur wie könnte ich jetzt mit der 
"Online"-Anzeige vorgehen. Wenn ich nur über wenige sekunden einen 
gleitenden Mittelwert bilde schwank es immer noch enorm. Bei einer 
Mittelwertsbildung über eine Minute(120 Werte, je 2 pro sec. mehr 
schaffe ich nicht, da alle drei seriell in schleife sind und die jeweils 
angefragten Ergebnisse als Summe vom Anzeige-Mega32 mit 16x2-Display 
durchgereicht werden.) bilde ist die Anzeige zwar nicht so schwankend 
aber eben enorm Träge.

Wer kennt bessere Wege, schwankende Werte zu dämpfen?

Ich wäre um jede Hilfe dankbar

Also ein kurzer starker Ausschlag in eine Richtung sollte sich zunächst 
nicht so auswirken, aber kleine dauerhafte Veränderungen (Abgabe vom 
Streugut) sollte direkt erkennbar sein, damit ich die Abgabe in Kg/min 
sinnvoll errechnen kann.

mfg MiGo

von Labberer (Gast)


Lesenswert?

Als exponentielles Mittel ? Funktioniert identisch zu einem Tiefpass.

von Hannes Lux (Gast)


Lesenswert?


von Hans-jürgen H. (hjherbert) Benutzerseite


Angehängte Dateien:

Lesenswert?

Grundsätzlich solltest du erst mal die Mechanik verbessern (wenn das 
überhaupt geht. Vielleicht Gummi (Silent) - Blöcke dazwischenbauen.

ADC-Werte filtere ich so:
Ich messe 64 mal. (Immer ein wenig warten dazwischen)
Sortiere die Werte
Lasse die 16 höchsten und die 16 niedrigsten unter den Tisch fallen.
Summiere die restlichen 32 auf.

Zur Quelle : tsnext und DBprintf-Zeilen einfach weglassen

von MiGo (Gast)


Lesenswert?

also an meinen ADC-Werten an sich zweifele ich nicht, da ich ja ohne hin 
schon direkt an der Messstelle im 10ms/Takt werte auslese und diese 
schon mit gleitenden MW errechne, bevor ich sie dann wenn eine Anfrage 
kommt über seriellen Anschluss an den Masster weitergebe. Wie gesagt, 
wenn ich mit Notebook und Excell über eine gewisse Zeit werte erfrage, 
dann stimmt das im Mittel exakt. Nur die Stöße die durch die Fahrt 
entstehen. Da hilft auch kein Gummi oder so. Es geht hier um 1-2 Tonnen 
Gewicht. Die Zugmaschine ist gefedert. Aber wenn eine Unebenheit kommt 
schlägt es eben zur einen und danach zur Anderen Seite aus. Mit nem 
analog-Instrument würde ich vielleicht am Ende noch was erkennen. Aber 
ich möchte ja für weitere Berechnungen (Verbrauch etc) gedämfte, 
repräsentative Mittelwerte bekommen, die nicht so arch verspätet 
ankommen.

Was würde es bringen, meine empfanenen Werte zu sammeln (für ne 
gewisseZeit, bei 64 Werten z.B. eine Halbe Minute und die obersten und 
untersten 16 auser Acht lasse). Letztendlich bekomme ich ja die gleiche 
Verzögerung wie bei der Mittelwertbildung.

Wie berechnet man den exponentiellen Mittelwert. Viellicht hilft dies?


Oder was heisst, ADC-Werte sauber aufs Display bringen? Genau das 
versuche ich ja.....

Danke

von Oha (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

MiGo wrote:

>
> Wie berechnet man den exponentiellen Mittelwert. Viellicht hilft dies?

Ich schätze mal nicht.
Dein Problem ist ja, dass du extreme Ausreisser drinnen hast, die 
klarerweise keine realen Werte sein können (zumindest nicht solche die 
dich interessieren).

Ich würds auch mal mit der Methode probieren, diese Ausreisser zu 
isolieren und wegzuwerfen.

> Was würde es bringen, meine empfanenen Werte zu sammeln (für ne
> gewisseZeit, bei 64 Werten z.B. eine Halbe Minute und die obersten und
> untersten 16 auser Acht lasse). Letztendlich bekomme ich ja die gleiche
> Verzögerung wie bei der Mittelwertbildung.

Dann miss halt nicht über eine halbe Minute, sondern nur über ein paar 
Sekunden.

> also an meinen ADC-Werten an sich zweifele ich nicht, da ich ja ohne hin
> schon direkt an der Messstelle im 10ms/Takt werte auslese und diese
> schon mit gleitenden MW errechne

Schmeiss den mal raus und ersetze den gleitenden MW durch so eine 'Miss 
und Filter' Strategie.

Letztendlich weisst du ja, dass sich deine interessierenden Werte nicht 
innerhalb von ein paar Sekunden um derartige Größenordnungen verändern 
werden. Wenn bei dem was nach Verwerfen der größten und kleinsten Werte 
übrigbleibt, immer noch eine zu große Bandbreite drinnen ist, wäre es zu 
überlegen, ob das Display in so einem Fall nicht einfach "keine Werte 
möglich" oder sowas ähnliches anzeigt.

Mit Standardverfahren wirst du da nicht weiterkommen. Da bleibt nur 
probieren und selbst eine Heuristik entwerfen. (Heuristik: Verfahren, 
das theoretisch nicht begründet wird oder begründet werden kann, aber in 
der Praxis gut funktioniert)

von flätz (Gast)


Lesenswert?

Bei einem ähnlichen Problem hatte ich gute Erfolge mit einer Art 
Integrator:
Zunächst muß erstmal ein Meßwert vorliegen. Wenn der nächste Wert größer 
ist, wird der alte Wert (langsam) hochgezäht, ansonsten runtergezählt 
oder konstant gehalten. Der Wert pendelt dadurch nur wenig um einen 
Mittelwert. Nachteilig ist die lange Einstellzeit bei einem echten 
Sprung im Messwert.

von Hannes Lux (Gast)


Lesenswert?

> Oder was heisst, ADC-Werte sauber aufs Display bringen? Genau das
> versuche ich ja.....

Das ist ein Link, in dem weitere Informationen zu finden sind. Einfach 
mal draufklicken.

Es handelt sich um eine sehr effiziente AVR-ASM-Routine zum Glätten von 
ADC-Messwerten, die Du in die AVR-Software einbinden kannst.

...

von was-willst-du (Gast)


Lesenswert?

- große Zahl von Meßwerten im Speicher vorhalten.
- wenn ein neuer kommt, den ältesten wegwerfen.
- Mittelwert berechnen
- wenn Du willst, bei der Mittelwertberechnung die unwahrscheinlichsten 
(verglichen mit dem letzten Mittelwert) wegwerfen

So hast Du zu jedem Meßintervall einen Mittelwert (gewünschte 
Schnelligkeit). Änderungen durch Streuen gehen ins Ergebnis ein, der 
Mittelwert wird immer dem exacten Wert hinterherhinken, ist halt eine 
Art integrale messung.

von MiGo (Gast)


Lesenswert?

Js, so ein Forum is schon ne tolle sache,

Ich hab mich jetzt entschlossen, ein kombination aus Mittelwert, 
gleitend (vielleicht 10 Werte entspricht hier 5 sec) und dann aber mit 
Annäherung.

Also mein letzter anzeigewert wird verglichen mit dem schwach gedämpten 
Mittelwert. Und davon ein zehntel der Abweichung alle sekunde 
nachrücken. Ich bin mal auf die Ergebnisse gespannt.

Mit dem Nachrücken von 1/10 Abweichung verhoffe ich mir maximal 10 sec 
nach Stillstand des Fahrzeuges (also sehr stabile adc-Werte) sitmmt 
spätestens mein Anzeigewert. Aber extreme Schwankungen gehen nur 
prozentual ein. Den Teiler kann ich ja dann auch noch anpassen.


Ich melde mich wieder, wenn ich nach dem Sauwetter (wir haben 
Schneefall) eien Praxistest durchführen kann.

Danke für die tollen Vorschläge. Wer noch weitere Ideen hat ist immer 
willkommen....

mfg MiGo

von flätz (Gast)


Lesenswert?

Das wäre eigentlich ein schönes Projekt für MATLAB/SIMULINK. Auch die 
beschriebenen Sonderbehandlungen für Ausreißer usw. lassen sich damit 
simulieren. Erfordert halt ein wenig Einarbeitung, aber solange das 
Sauwetter noch anhält...

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.