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?
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?
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.
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**?
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
voidgetAdcValue(void)
2
{
3
uint16_tAdcSum=0;
4
uint8_tAdcCount=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
voidgetAdcValue(void)
2
{
3
uint16_tAvgCount=0,measVal=0;
4
uint32_tAvgSum=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
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