Hallo,
vielleicht erinnert ihr euch an die Diskussion über gleitende Mittel im Sommer. In meinem letzten Projekt konnte ich durch einige Tricks die Sache in den Griff bekommen. Im aktuellen jedoch bin ich dringend darauf angewiesen einen anständigen Messwert zu bekommen. Allerdings habe ich die Geschichte von der theoretischen Seite her immer noch nicht ganz verdaut.
Konkret habe ich ein stark schwankendes analoges Messsignal eines Drucksensors welches größere Schwankungen aufweist wie mein Delta zwischen unterer und oberer Schaltschwelle ist.
Bei einem ADC Wert von 300 möchte ich einen Ausgang schalten der bis zum ADC Wert 200 aktiv bleibt. Mein Messwert schwankt jedoch beinahe über diesen ganzen Bereich. Das entsteht durch die seltsame Messmethode. Es handelt sich um eine Füllstandsmessung einer Abwassergrube eines Einödhofes. Bei einem bestimmten Pegel pumpt eine Tauchpumpe den Grubeninhalt in die Kanalisation der nächsten Ortschaft. Um den Füllstand zu messen wird ein Luftschlauch der in der Grube mündet durch eine Membranpumpe mit einem Druck beaufschlagt. Dieser Druck wird mittels Drucksensor ausgewertet. Dadurch, dass die Luftblasen in der sehr hochviskosen Flüssigkeit aufsteigen baut sich immer ein sehr hoher Druck auf, der dann sobald die Luftblase aufsteigt blitzartig in den Keller sinkt. Das erklärt mein schlechtes Signal.
Diese Messmethode hat einerseits den Vorteil, dass niemand in die Grube steigen muss um dort z.B. auf dem Boden einen Drucksensor anzubringen, zum anderen wird bei dieser sehr inhomogenen Beschaffenheit des Inhaltes wahrscheinlich auch nicht jede Art der Füllstandsmessung funktionieren. Ich hoffe ich konnte mein Problem einigermaßen gut in Worte fassen und ihr könnt euch ein Bild davon machen.
Nun habe ich schon viele Möglichkeiten versucht um diesen Messwert in den Griff zu bekommen, allerdings noch keine zufriedenstellende Lösung gefunden. Einige von euch(u.a. Manf, Recycle) haben sich sehr viel Mühe gegeben mir die gleitende Mittelung zu erklären, ich habe jedoch noch nicht komplett verstanden wie es genau funktionieren kann, dass mit dem Bascom Code von recycle auf der ersten Seite des nachfolgend genannten Threads eine solche gleitende Mittelung realisiert wird.
https://www.roboternetz.de/phpBB2/viewtopic.php?t=49678
Manf hat damals geschrieben, dass dieses Vorgehen eine exponentiell über der Zeit abnehmende Gewichtung der vorgehenden Werte ermöglicht. Wie kommt das zustande? Recycle verwendet lediglich Subtraktion/Addition und eine Divison durch die Anzahl der Werte über die gemittelt werden soll. Mir ist nicht ganz klar woher der exponentielle Charakter kommt.
Nichtsdestotrotz habe ich den Code von Recycle übernommen und getestet. Es ist eine deutliche Glättung der Werte festzustellen.
Jedoch auch eine Art Sprungfunktion. Es hat sich der Mittelwert 250 eingestellt. Mein tatsächlich gemessener ADC Wert pendelte zwischen 195 und 260. Sobald der ADC Wert kurzzeitig auf unter 200 fiel hat recycles Funktion den Mittelwert auf 200 gesetzt. Dieser änderte sich erst wieder wenn der ADC Wert zufällig einen Peak über 250 hatte. Dann sprang der Mittelwert wieder auf seinen ursprünglichen Wert von 250.
Woher diese Charakteristik rührt kann ich mir nicht vorstellen.
Tabellarisch:
IST-Wert / Mittelwert
220 / 250
210 / 250
250 / 250
199 / 200
230 / 200
240 / 200
251 / 250
240 / 250
245 / 250
198 / 200
230 / 200
255 / 250
Ich hoffe diese Tabelle konnte die zugegeben nicht ganz glückliche Beschreibung des Problems "Sprungfunktion" verdeutlichen.
Das ist meine Funktion zur gleitenden Mittelung von o.g. Thread Seite 1 aus Recycles Beitrag übernommen:
Kann sich jemand dieses Verhalten erklären, bzw mir einiges Tipps geben wie ich meinen Messwert in den Griff bekomme? Oder ist die Funktion so vielleicht nicht richtig umgesetzt?Code:const Anzahl = 50 Function Mittelung(aw As Integer) As Integer Local Zaehler As Integer Local Temp As Integer Local Mittelwert As Single Local Mittelwert_int As Integer For Zaehler = 1 To Anzahl Temp = Mittelwert / Anzahl Mittelwert = Mittelwert - Temp Temp = Aw / Anzahl Mittelwert = Mittelwert + Temp Mittelwert_int = Mittelwert Mittelung = Mittelwert Next Zaehler End Function
Unter Wikipedia gibt es einiges zum Thema "Gleitendes Mittel" zu finden. Die Beispiele sind jedoch immer auf Logistik, Lagerhaltung bzw Aktiencharts bezogen. Ich habe noch keinen Weg gefunden die dort genannte Funktion auf mein Problem zu übertragen.
Bis zum heutigen Tage war diese ganze Steuerung mit einer elektromechanischen Druckdose mit dem selbenMessprinzip realisiert. Diese hat jedoch den Dienst quittiert. Weil ich nun vermeiden möchte, dass die erwähnte Membranpumpe rund um die Uhr läuft möchte ich die Steuerung mittels Atmel und MPX5100 realisieren und die Pumpe nur einige Male pro Tag zum aufbauen des Messdrucks einschalten. Dazu kommt, dass der Hersteller kein Interesse mehr daran hat die bereits "schon" 10 Jahre alte Steuerung zu reparieren (sprich eine neue Druckdose zu verkaufen).
Als Notlösung denke ich bereits schon an eine mechanische Glättung meines Signals mittels Druckbehälter zum Ausgleichen der Druckschwankungen. Die Methode finde ich zwar keineswegs elegant, liegt mir als Maschinenbaustudent jedoch etwas näher .
Vielen Dank allen die sich die Zeit genommen haben diesen langen Beitrag zu lesen.
Ich freue mich auf Eure Resonanz
Gruss
Florian.
Lesezeichen