Guten morgen liebe Freunde! Ich stehe vor einer kleinen Denkblockade. Ich habe einen Sensor, welcher Druck misst. Funktioniert auch alles wunderbar. Jetzt möchte ich gerne eine einstellbare Dämpfung hinzufügen -> am Display möchte ich also eine Zeit von sagen wir mal 0-60s einstellen können und der ausgegebene Messwert soll dieser eingestellten Zeit folgen. Jetzt habe ich diesbezüglich ein kleines Problem bei der Realisierung. Zuerst einmal weiß ich ehrlich gesagt garnicht, wie ich da rangehen soll. Zum anderen stell ich mir die Frage, wie bei Eingangssprüngen reagiert werden soll. Mal angenommen ich messe jetzt 100mbar und gleich darauf 1000mbar -> meine eingestellte Dämpfung sei 60s. Dann würde ich ja erwarten, dass mein Endwert langsam ansteigt, bis die 1000mbar erreicht sind. Der Endwert wäre nach 60s erreicht. Wenn ich jetzt einen Sprung von 100mbar auf 110mbar haben würde, dann ist die Zeit von 60s natürlich etwas lang für den mickrigen Sprung. Wie wird sowas also in der Industrie realisiert? Ich habe mir die Dämpfungskurven da mal angeguckt, es sieht ja nicht so aus, als ob die 60s jetzt jedesmal von neu starten, wenn sich der Messwert auch nur geringfügig ändert - das wäre ja auch nicht wirklich praktikabel, da der Controller ja jede noch so kleine Änderung mitbekommt. Kann mir da einer von euch helfen?
arithmetische Mittelwertbildung.
Könnte evtl. jemand, der nebenbei ein wenig Zeit hat, das mit mir hier zusammen entwickeln? Also bitte nicht falsch verstehen - ich mein nicht FÜR MICH MACHEN! Ich will das ja auch verstehen! Ich werfe jetzt beispielsweise einfach mal ein paar Werte in den Raum. Sagen wir die Dämpfung ist auf 20s eingestellt.
1 | t(s) | Wert(mbar) |
2 | -------------------
|
3 | 0 | 1 |
4 | 1 | 7 |
5 | 2 | 8 |
6 | 3 | 15 |
7 | 4 | 20 |
8 | 5 | 23 |
9 | 6 | 27 |
10 | 7 | 90 |
11 | 8 | 110 |
12 | 9 | 80 |
13 | 10 | 67 |
14 | 11 | 66 |
15 | 12 | 90 |
16 | 13 | 210 |
17 | 14 | 300 |
18 | 15 | 400 |
19 | 16 | 350 |
20 | 17 | 360 |
21 | 18 | 365 |
22 | 19 | 390 |
23 | 20 | 512 |
24 | 21 | 600 |
25 | 22 | 650 |
Wie realisiere ich jetzt, dass diese eingestellte Dämpfung von 20s hier greift? Muss meine Messung dadurch auch beispielsweise verlangsamt werden - z.B. nurnoch jede Sekunde anstatt kontinuierlich?
Detlef schrieb: > der ausgegebene > Messwert soll dieser eingestellten Zeit folgen. Was genau soll das bedeuten?
Stefan L. schrieb: > Was genau soll das bedeuten? Naja ich kenne das von den Geräten, die ich mir angeschaut habe - dort kann ich am Display eine Dämpfungszeit stufenlos einstellen. Beispielsweise zwischen 0 und 300s. Die wird ja Auswirkungen auf die Ausgabe des Messwertes haben - nur klemmts bei mir mit der Umsetzung.
Da gibt es jetzt verschiedene Möglichkeiten: - Gleitender Mittelwert über diese Zeitdauer - Aufnahme über diesen Zeitraum und danach Mittelwertbildung und Anzeige des Messwertes - Tiefpass mit dieser Zeitkonstante Da musst du schon wissen, was du willst.
Stefan L. schrieb: > Gleitender Mittelwert über diese Zeitdauer Wenn ich diese Variante nehme, springt mein Wert dann nach der Zeitdauer und eine neue Mittelwertbildung beginnt, oder ist das kontinuierlich? Stefan L. schrieb: > Aufnahme über diesen Zeitraum und danach Mittelwertbildung und Anzeige > des Messwertes Nee, das passt nicht. Dann hätte ich ja wirklich für die Zeitdauer Stillstand auf dem Display. Stefan L. schrieb: > Tiefpass mit dieser Zeitkonstante Das wäre natürlich auch eine Alternative - allerdings muss ich dafür eine e-Funktion mit dem uC rechnen, richtig? Ist denn vielleicht jemand hier, der evtl. schonmal ähnliches implementiert hat und mir sagen kann, was am geeignetsten ist. Also ich möchte schon gerne eine kontinuierliche Anzeige auf dem Display, welche sich auch laufend ändert, jedoch mit der Verzögerung, die eingestellt ist. Ich habe das ja nur bei anderen Geräten gesehen, den Quelltext, bzw. die Vorgehensweise dabei sehe ich ja leider nicht.
definiere mal was Du mit Dämpfung meinst! Man kann sich so einges darunter vorstellen und auch wieder nichts.... Alternativ, poste Links von den Anleitungen der Geräten und auf welcher Seite das beschrieben ist
Du benutzt ein Moving Average Filter: x...Messwert vom sensor y...Ausgabewert am Display y(i) = (1- a) * y(i-1) + a * x(i); also, z.B. y(i) = 0.999 * y(i-1) + 0.001 * x(i) Implementiert für Micorcontroller: y = y - y << 10 + x << 10; Fertsch.
Frank schrieb: > Du benutzt ein Moving Average Filter: Und wie bekomme ich hier meine eingestellte Zeit mit hinein?
Detlef schrieb: > Frank schrieb: >> Du benutzt ein Moving Average Filter: > > Und wie bekomme ich hier meine eingestellte Zeit mit hinein? Die kriegst du sowieso nicht hin. Vergiss die Zeitangaben, die du bei den diversen Geräten gesehen hast. Lies das als "kurze Einschwingzeit, mittlere Einscheingzeit, lange Einschwingzeit". Und dammit man da Zahlen hat, haben die halt einfach Zeiten erfunden (bzw ausgemessen), nach denen das System irgendwie in einem eingeschwungenen Zustand ist. Das ist so wie die Stufenangaben beim Fön: 1 - 2 - 3 Das einzige was man daraus ableiten kann: bei 3 bläst er mehr als bei 2. Aber um wieviel mehr entscheidet jeder Hersteller für sich selbt.
Karl Heinz Buchegger schrieb: > Vergiss die Zeitangaben, die du bei den diversen Geräten gesehen hast. Tja...ich habe gerade mal intensiv die Funktion eines Geräts geprüft und muss feststellen, dass ich genau das tun werde! Bei einer Dämpfung von 10s dauert es ca. 50s, bis sich das Signal eingeschwungen hat...super!!!! Bei 2s sind es sogar noch ca. 15s. Was soll denn so ein Schei**?
Detlef schrieb: > Karl Heinz Buchegger schrieb: >> Vergiss die Zeitangaben, die du bei den diversen Geräten gesehen hast. > > Tja...ich habe gerade mal intensiv die Funktion eines Geräts geprüft und > muss feststellen, dass ich genau das tun werde! Bei einer Dämpfung von > 10s dauert es ca. 50s, bis sich das Signal eingeschwungen > hat...super!!!! Bei 2s sind es sogar noch ca. 15s. > > Was soll denn so ein Schei**? Das Zauberwort heisst Zeitkonstante. Du stellst am Gerät nur die Zeitkonstante des (digitalen oder analogen) Tiefpasses ein. Damit unterdrückst du kurzfristige Schwankungen (kürzer als die Zeitkonstante). Die Zeit zum Einschwingen liegt beim fünffachen der Zeitkonstante.
Detlef schrieb: > Was soll denn so ein Schei**? Ich denke, Du hast nicht verstanden, was eine Zeitkonstante ist. Da kann man Dir schlecht helfen.
Detlef schrieb: > Was soll denn so ein Schei**? Dann denk doch mal Analog. Bei einem RC-Tiefpass hast du ja auch eine Zeitkonstante T = R*C. Das heist doch auch da nicht das erst nach dieser Zeit sich am Ausgang was tut.
Detlef schrieb: > Wenn ich diese Variante nehme, springt mein Wert dann nach der Zeitdauer > und eine neue Mittelwertbildung beginnt, oder ist das kontinuierlich? Google doch mal nach gleitender Mittelwert. Detlef schrieb: > Stefan L. schrieb: >> Tiefpass mit dieser Zeitkonstante > > Das wäre natürlich auch eine Alternative - allerdings muss ich dafür > eine e-Funktion mit dem uC rechnen, richtig? Nein, du programmierst einfach ein passendes IIR-Filter.
Frank2 schrieb: > Ich denke, Du hast nicht verstanden, was eine Zeitkonstante ist. Doch klar, weiß ich das! Mein Weltbild ist ja grad auch erstmal etwas durcheinander. Hab gerade mit einem Herrn von Endress + Hauser telefoniert und er sagte mir, dass die Zeit in deren Geräten wirklich nichts mit der tatsächlichen Zeit in Sekunden zu tun hat. Helmut Lenzen schrieb: > Dann denk doch mal Analog. Bei einem RC-Tiefpass hast du ja auch eine > Zeitkonstante T = R*C. Das heist doch auch da nicht das erst nach dieser > Zeit sich am Ausgang was tut. Ja, das ist natürlich klar! Stefan L. schrieb: > Nein, du programmierst einfach ein passendes IIR-Filter. Den schau ich mir grad mal genauer an. Ich hab ja halt nur im Kopf, dass ich meine eingestellte Zeit da mit rein bekomme. Ich habe einfach ein Denkproblem gerade. Wenn ich beispielsweise einen Drucksprung von 0 auf 1000 habe -> in welchen Intervallen messe ich einen Wert und aktualisiere meine Rechnung, bzw. meinen Ausgang.
Detlef schrieb: > Wenn ich beispielsweise einen Drucksprung von 0 auf 1000 habe -> in > welchen Intervallen messe ich einen Wert und aktualisiere meine > Rechnung, bzw. meinen Ausgang. So dass am Ende die Messwerte so rauskommen, so dass du zufrieden bist. Der angezeigte Messwert soll dem Sonsor folgen aber er soll auch nicht jede kleine Änderung sofort bis in die Anzeige durchschlagen lassen. Mach da nicht mehr draus, als es ist. Ein moving average reicht da normalerweise locker aus und ist einfach zu implementieren. Wie groß du a wählst hängt davon ab, wieviele falsche Sensorsignale du erwartest und wie groß die sind. Da du das aber sowieso nicht weißt, musst du ein a schätzen. Mach es einstellbar und dann probierst du ein paar Werte aus, solange bis du zufrieden bist. a hat einen Werteberech von >0 bis 1. Einfach einen Einstellregler drann und dann von 1 beginnend reduzieren, bis die Anzeige nicht mehr zappelt aber auch nicht zu träge ist.
Manchmal hilft ein Beispielcode. Man kann durchaus eine Mittelwertbildung über die Zeit machen. Ebenso kann man ein Hysteresis Filter bauen oder den Messwert "nachführen". Desweiteren geht natürlich auch ein Tiefpassfilter, wie oben erklärt. Wie dem auch sei, auch eine Mittelwertbildung über eine Zeit ist nichts anderes als ein TP. Anbei 2x Beispiele (Silabs 8x51 + MSP). Beispiel Mittelwert über Zeit.
1 | void getAdcValue (void) |
2 | {
|
3 | uint16_t AdcSum = 0; |
4 | uint8_t AdcCount = 0; |
5 | |
6 | for (AdcCount=0; AdcCount < 16; AdcCount ++) { |
7 | AD0INT = 0; // clear adc ready Flag |
8 | AD0BUSY = 1; // starte AD Wandlung |
9 | while (!AD0INT); // AD Wandlung fertig ? |
10 | AdcSum += ADC; // Mittelwert über 16 Messungen |
11 | }
|
12 | AdcAvg += AdcSum >> 4; // absoluter Mittelwert über refresh cycle time |
13 | AvgCnt ++; // Anzahl der Mittelwerte |
14 | if (timer_tic >= 100) { // LED's refresh cycle time ~ (0.5 - 10 Sek.) |
15 | intTo7Segment (((AdcAvg / AvgCnt) * Faktor) / Scale) |
16 | AvgCnt = 0; // Mittelwert counter zurücksetzen |
17 | AdcAvg = 0; // absoluten Mittelwert zurücksetzen |
18 | timer_tic = 0; // reset timer_tic |
19 | }
|
20 | }
|
Beispiel mit Hysteresis + Nachführung des Messwert:
1 | void getAdcValue (void) |
2 | {
|
3 | uint16_t AvgCount = 0, measVal = 0; |
4 | uint32_t AvgSum = 0; |
5 | |
6 | for (AvgCount = 0; AvgCount < 512; AvgCount ++) { |
7 | ADC10CTL0 &= ~ADC10IFG; |
8 | ADC10CTL0 |= ENC + ADC10SC; // AD Wandler starten |
9 | while (!(ADC10CTL0 & ADC10IFG)); // AD Wandlung fertig ? |
10 | AvgSum += ADC10MEM; // Mittelwert über 512 Messungen |
11 | }
|
12 | measVal = ((((AvgSum >> 7) * Factor) + Offset) >> 16); // skaliert auf 12 BIT |
13 | |
14 | // ---- Messwert mittels Signalfenster beruhigen, Hysteresis ----
|
15 | /*
|
16 | if ((measVal > (AdcVal + SigWindow)) || (measVal < (AdcVal - SigWindow)))
|
17 | AdcValOut (measVal);
|
18 | */
|
19 | // ---- Messwert mittels "Nachziehen" beruhigen, Filter ----
|
20 | |
21 | if (measVal > AdcVal) { |
22 | if (measVal - AdcVal > DeltaUpdate) { |
23 | AdcVal = measVal; |
24 | } else { |
25 | AdcVal += AdcFilter; |
26 | }
|
27 | } else if (measVal < AdcVal) { |
28 | if (AdcVal - measVal > DeltaUpdate) { |
29 | AdcVal = measVal; |
30 | } else { |
31 | AdcVal -= AdcFilter; |
32 | }
|
33 | }
|
34 | AdcValOut (AdcVal); |
35 | }
|
Danke euch allen - ich guck mir das alles mal an!
1. Tiefpaß: Anzeigewert = Summe / 16 Summe = Summe + neuer Wert - Anzeigewert 16 ist ein brauchbarer Wert, kann aber auch geändert werden. Je älter ein Meßwert, umso kleiner wird sein Einfluß (Exponentialfunktion), entspricht also einem RC-Tiefpaß. Man braucht nur einen Speicher für die Summe. 2. Gleitender Mittelwert: Index = Index + 1 if( Index >= 64 ) Index = 0 Wert[Index] = neuer Wert Summe = Wert[0] + Wert[1] ... + Wert[63] Anzeigewert = Summe / 64 64 ist ein brauchbarer Wert, kann aber auch geändert werden. Das Einschwingverhalten ist deutlich besser als beim Tiefpaß. Alle Werte älter als 64 Abtastungen verschwinden. Man braucht aber 64 Speicher für die Werte. Bei einer Abtastung pro Sekunde: Gleitender Mittelwert über 64 Abtastungen: Mittelwert über 64s Tiefpaß mit Zeitkonstante 16: auch Messungen älter als 64s gehen noch ins Ergebnis ein (etwa zu 12%). Peter
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.