Forum: Mikrocontroller und Digitale Elektronik ADC Werte sauber aufs display bringen


von Friedrich (Gast)


Lesenswert?

Hallo

Nachdem ich meinen Differenzdrucksensor mit einen Instrumentenverstärker 
zum laufen gebracht habe sollen die Werte auf dem Display erscheinen.

Das tun sie auch.

Nur folgendes will ich erreichen.

Es soll später mal die Fluggeschwindigkeit eines Flugzeugs gemessen 
werden TRUE Airspeed.

Die Anschlüsse kommen einmal an das Staurohr und eines an den Statischen 
Druck.(Fahrtmesser).


Nun will ich ereichen das die anzeige nicht wackelt sondern so schön 
ruhig ist wie im richtigen Flugzeug oder im Auto.

wie kann ich eine Lineare beschreibung der Werte hinbekommen so das die 
anzeige bei gleicher geschwindigkeit nicht immer ca +- 5km/h anzeigt.


Danke

von 3353 (Gast)


Lesenswert?

Tiefpassfilterung ?

von holger (Gast)


Lesenswert?

Mittelwertbildung über mehrere Messwerte ?

von Timmo H. (masterfx)


Lesenswert?

Ich denke was du machen willst, ist eine künstliche Trägheit einzubauen.
Zunächst solltest du immer aus mehreren Messungen einen Mittelwert 
bilden um um das Rumgezappel des (der) letzten Bits zu minimieren (ich 
denke das wirst du schon gemacht haben, also z.B. 10 mal abtasten und 
daraus den Mittelwert).
Um die Trägheit zu erreichen würde ich immer den aktuellen Wert 
speichern und gucken wie die Änderung zum neuen Wert ist. Nun kannst du 
selbst bestimmen wie schnell das ganze System reagieren soll. Angenommen 
du willst max. 5 km/s Anstieg haben. Du speicherst also z.B. 200 km/h 
als letzten Wert. Solange die Geschwindigkeit zunimmt (Delta-v = 
positiv) addierst du also 1 km/h jede 200ms dazu. Wird er negativ ziehst 
du wieder 1 km/h alle 200ms wieder ab, bis eben das delta-v Null ist 
(hier sollte man eine kleine Toleranz einbauen, damit auch hier nicht 
hin un hergesprungen wird.
So zumindest jetzt meine Idee.

von Johnny Maxwell (Gast)


Lesenswert?

> Um die Trägheit zu erreichen würde ich immer den aktuellen Wert
> speichern und gucken wie die Änderung zum neuen Wert ist. Nun kannst du
> selbst bestimmen wie schnell das ganze System reagieren soll.
> Angenommen du willst max. 5 km/s Anstieg haben...

Und was haben die angezeigten Werte dann mit der Geschwindigkeit zu tun? 
Wozu soll diese künstliche Verschlechterung des Sensors gut sein?

von Timmo H. (masterfx)


Lesenswert?

>Wozu soll diese künstliche Verschlechterung des Sensors gut sein?
Das ist keine Verschlechterung sondern nur eine Trägheit. Damit siehts 
halt toller aus als wenn er hüpft. Die Genauigkeit bleibt ja gleich.
Wenn du z.B. nur jede Sekunde bei einem Auto die Geschwindigkeit 
abtastest würde dein Tacho (sofern es nicht träge wäre) immer z.B in 10 
km/h Schritten springen, sähe doch ein wenig seltsam aus, oder findest 
du nicht?

Im übrigen sollte es auch 5 (km/h)/s Anstieg heißen, aber ich denke das 
geht aus dem Zusammenhang hervor.

von Timbo (Gast)


Lesenswert?

Bilde den Mittelwert aus den Messwerten der letzten Sekunde und 
aktualisiere die Geschwindigkeitsanzeige nur einmal pro Sekunde.

von Thorsten (Gast)


Lesenswert?

Für die True Airspeed musst Du aber noch die Lufttemperatur messen...
Ein Differenzdrucksensor gibt Dir nur den Staudruck (indicated 
Airspeed).

Gruss,
Thorsten

von Johnny Maxwell (Gast)


Lesenswert?

> Wenn du z.B. nur jede Sekunde bei einem Auto die Geschwindigkeit
> abtastest würde dein Tacho (sofern es nicht träge wäre) immer z.B in 10
> km/h Schritten springen, sähe doch ein wenig seltsam aus, oder findest
> du nicht?

Du beschreibst hier leider das genaue Gegenteil :)
Wenn man mehr "Mess"-werte haben will als man wirklich misst kann man 
interpolieren, damit die Änderungen zwischen zwei Messungen schön 
glatt verläuft. In deinem Beispiel würde ich also nur alle paar Sekunden 
die Geschwindigkeit messen und die Tachonadel gedämpft hinterherzuckeln 
lassen. In gewisser Weise muss man also den aktuellen "wahren" Wert aus 
bereits gemessenen Werten aus der Vergangenheit schätzen!

Unser OP kann aber offenbar sogar öfter als er die Messwerte anzeigen 
muss messen. Da seine Werte offenbar stark rauschen, kann er sie 
verbessern in dem er nur alle paar Mal den letzten Mittelwert ausgibt. 
Und das ist dann nicht geraten, das ist tatsächlich näher am 
"tatsächlichen" Wert.


> Im übrigen sollte es auch 5 (km/h)/s Anstieg heißen, aber ich denke das
> geht aus dem Zusammenhang hervor.

Haben wir glaub ich alle verstanden :)

von Timmo H. (masterfx)


Lesenswert?

>Unser OP kann aber offenbar sogar öfter als er die Messwerte anzeigen
>muss messen. Da seine Werte offenbar stark rauschen, kann er sie
>verbessern in dem er nur alle paar Mal den letzten Mittelwert ausgibt.
Das hatte ich ja am Anfang schon geschrieben, bloß da er (der 
Fragesteller) als Beispiel ein Auto genannt hat, habe ich das als 
Trägheit interpretiert (ich war ja auch nicht der einzige). Zudem 
verhindert eine Mittelwertbildung nicht unbedingt das Springen, wenn 
z.B. durch den ADC nur 5 km/h aufgelöst werden können. Denn dann würde 
würde es auch springen. Wenn man eine Trägheit einbaut springt er nicht 
sondern singt oder steigt langsam anstatt zu springen. Finde ich für 
solche Anzeigen wo man ständig rauguckt angenehmer (so wirds bei den 
digitalen Autotachos auch gemacht.

Und ich glaube auch kaum, dass sein Fluggerät so extrem an 
Geschwindigkeit pro Sekunde zunimmt, und das mit 5 (km/h)/s war ja auch 
nur ein beispiel. Wenn das ding mit 3g beschleunigt dann macht man eben 
90 (km/h)/s Anstieg, das reicht dann auch aus um nicht veraltete Werte 
zu haben und dennoch eine "softe" Anzeige.

von Friedrich (Gast)


Lesenswert?

Danke für eure Antworten.

Ich versuche es heute mal umzusetzten.

Danke

von Hannes L. (hannes)


Lesenswert?

Da weder Controllertyp noch favorisierte Programmiersprache genannt 
wurde (oder ich es übersehen habe) gehe ich mal von AVR und ASM aus.

Ich verwende gerne den gleitenden Mittelwert über 256 Messungen, was 
recht gut dazu geeignet ist, Messwert-Ausreißer zu eliminieren und den 
Messwert zu "beruhigen". Messgenauigkeit geht dabei nicht verloren. Es 
wird neben den zwei Registern für das Ergebnis (adwl, adwh) nur noch ein 
Register für die Nachkommastellen (adwn) gebraucht. Hier wurden zwei 
Temp-Register (xl, xh) verwendet, weil ich einen Offset im Messwert 
brauchte, normal reicht da ein Temp-Register. Die Wertigkeit "1/256" 
wird durch Byteshifting erreicht.
1
ADCC:                   ;ISR ADC-Wandlung fertig
2
 in srsk,sreg               ;SREG sichern (Exklusivregister)
3
 push xh
4
 push xl
5
 sub adwn,adwl              ;1/256 des 
6
 sbc adwl,adwh              ;ADC-Wertes
7
 sbc adwh,null              ;mit Übertrag rausnehmen
8
 lds xl,adcl                ;ADC-Wert L einlesen
9
 lds xh,adch                ;ADC-Wert H einlesen
10
 adiw xh:xl,messoffset      ;Messwertverschiebung
11
 add adcn,xl                ;1/256 des neuen ADC-Wertes
12
 adc adwl,xh                ;1/256 des neuen ADC-Wertes
13
 adc adwh,null              ;mit Übertrag addieren
14
 pop xl
15
 pop xh
16
 out sreg,srsk              ;SREG wiederherstellen
17
 reti                       ;fertig...

...

von Karl H. (kbuchegg)


Lesenswert?

Hannes Lux wrote:

Hi Hannes

>
1
> ADCC:                   ;ISR ADC-Wandlung fertig
2
>  in srsk,sreg               ;SREG sichern (Exklusivregister)
3
>  push xh
4
>  push xl
5
>  sub adwn,adwl              ;1/256 des
6
>  sbc adwl,adwh              ;ADC-Wertes
7
>  sbc adwh,null              ;mit Übertrag rausnehmen
8
>  lds xl,adcl                ;ADC-Wert L einlesen
9
>  lds xh,adch                ;ADC-Wert H einlesen
10
>  adiw xh:xl,messoffset      ;Messwertverschiebung
11
>  add adcn,xl                ;1/256 des neuen ADC-Wertes
12
>

Müsste es hier nicht

   add adwn,xl

lauten?

von Hannes L. (hannes)


Lesenswert?

Karl heinz Buchegger wrote:
>>
1
>>  add adcn,xl                ;1/256 des neuen ADC-Wertes
2
>>
>
> Müsste es hier nicht
>
>    add adwn,xl
>
> lauten?

Genau!!!!!!

Das kommt davon, wenn man "Kosmetik" betreibt, wenn man schnell mal 
einen Namen ändert, den man beim Programmieren nicht optimal vergeben 
hat, und dabei eine Zeile übersieht... 8-(

Im Original sieht es sooooooo aus:
1
ADCC:                   ;ISR ADC-Wandlung fertig
2
 in srsk,sreg               ;SREG sichern (Exklusivregister)
3
 push xh
4
 push xl
5
 sub adcn,adwl              ;1/256 des 
6
 sbc adwl,adwh              ;ADC-Wertes
7
 sbc adwh,null              ;mit Übertrag rausnehmen
8
 lds xl,adcl                ;ADC-Wert L einlesen
9
 lds xh,adch                ;ADC-Wert H einlesen
10
 adiw xh:xl,messoffset      ;Messwertverschiebung
11
 add adcn,xl                ;1/256 des neuen ADC-Wertes
12
 adc adwl,xh                ;1/256 des neuen ADC-Wertes
13
 adc adwh,null              ;mit Übertrag addieren
14
 pop xl
15
 pop xh
16
 out sreg,srsk              ;SREG wiederherstellen
17
 reti                       ;fertig...

Ist übrigens aus der Laminator-Temperatur-Regelung...

Danke für Deine genaue Analyse und Deinen Hinweis auf den Fehler, denn 
Müll sollte nicht unwidersprochen stehen bleiben.

Gruß aus dem sonnigen Flachland,
Hannes

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.