Forum: Mikrocontroller und Digitale Elektronik Messsignalschwankungen mit Mikrocontroller dämpfen - wie vorgehen?


von Detlef (Gast)


Lesenswert?

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?

von Anyone (Gast)


Lesenswert?

arithmetische Mittelwertbildung.

von Detlef (Gast)


Lesenswert?

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?

von Mine Fields (Gast)


Lesenswert?

Detlef schrieb:
> der ausgegebene
> Messwert soll dieser eingestellten Zeit folgen.

Was genau soll das bedeuten?

von Detlef (Gast)


Lesenswert?

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.

von Mine Fields (Gast)


Lesenswert?

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.

von Detlef (Gast)


Lesenswert?

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.

von mano (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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.

von Detlef (Gast)


Lesenswert?

Frank schrieb:
> Du benutzt ein Moving Average Filter:

Und wie bekomme ich hier meine eingestellte Zeit mit hinein?

von Detlef (Gast)


Lesenswert?

Frank schrieb:
> 1- a

Und was wäre hier "a"?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Detlef (Gast)


Lesenswert?

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**?

von Frank B. (f-baer)


Lesenswert?

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.

von Frank2 (Gast)


Lesenswert?

Detlef schrieb:
> Was soll denn so ein Schei**?

Ich denke, Du hast nicht verstanden, was eine Zeitkonstante ist. Da kann 
man Dir schlecht helfen.

von Helmut L. (helmi1)


Lesenswert?

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.

von Mine Fields (Gast)


Lesenswert?

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.

von Detlef (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bernd N (Gast)


Lesenswert?

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
}

von Detlef (Gast)


Lesenswert?

Danke euch allen - ich guck mir das alles mal an!

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.