Rauschen oder Problem mit Auflösung?

OP #3051537
Lesenswert?

Hallo zusammen,
ich lese einen MPX4100A Drucksensor an einem Arduino aus. Dabei fällt 
mir auf, dass der Wert ziemlich häufig schwankt.

Im Bild im Anhang könnt ihr die Schwankung sehen.
Der Sensor wird alle 30 sek. ausgelesen.

Hier der Code mit dem ich auslese:
1
float a_press = analogRead(1);
2
a_press = (((((a_press*ADCVOLT)/5.0)+0.1518)/0.01059)*10)+41.875;

41.875 ist die Höhenkompensation.
ADCVOLT ist 0.0049 mv/ADC.
Der Sensor ist 1:1 ohne groß Hühnerfutter am AnalogPin des Arduino 
angeschlossen.

Habt ihr vielleicht ein paar Ideen für mich?
Gast #3051575
Lesenswert?

Florian Trück schrieb:
> Zerstöre ich damit nicht auch gleich noch den Rest der 10 Bit Auflösung?
> Dann kann ich doch auch gleich die Nachkommastellen abschneiden, oder?

Ich hab nicht ins DB (Datenblatt) geschaut.
Wenn das Ding nicht von vornherein Bandbegrenzt ist,ist so was immer 
Pflicht. Stören tut es Dich mit Sicherheit nicht bei einer 
Aktualisierung alle 30sek wenn Du ein Filter um die 1Hz einbaust,oder
Gast #3051589
Lesenswert?

Schwankungen um 1 LSB sind beim ADC nicht ungewöhnlich. Ob die Ursache 
letztlich externes Rauschen oder der ADC selber ist, ist egal - man hat 
da einfach die Grenzen der Auflösung erreicht.

Ein bisschen könnte man ggf. noch per Oversampling gewinnen: also den 
ADC mehrfach (z.B. 256 mal) auslesen und dann mitteln. Ein gewisses 
Grundrauschen ist dabei sogar nötig. Um 50 Hz/100Hz Störungen zu 
unterdrücken wäre ein Zeitfenster von 20 ms oder einem vielfachen von 
Vorteil. Damit kann man etwas mehr an Auflösung gewinnen - in dem 
Beispiel mit 256 Werten theoretisch 4 Bit mehr, allerdings wird die 
Genauigkeit oft nur unwesentlich besser.
Gast #3051783
Lesenswert?

Nach meinen Erfahrungen kannst du beim Arduino die letzten beiden 
Stellen beim AD-Wandler vergessen. Rechne da einfach nur mit 8 Bit 
Auflösung.
Falls du mehr brauchst, dann sollte ein externer AD-Wandler (z.B. am 
SPI-Bus) ergänzt werden. Bei einem 16 Bit-Wandler bleiben dann 
verlässliche 12 Bit übrig.
Die Ansteuer-Elektronik, Referenzspannungen etc sollten dann aber auch 
für diese Qualität ausgelegt sein.
#3052217
Lesenswert?

PittyJ schrieb:
> Nach meinen Erfahrungen kannst du beim Arduino die letzten beiden
> Stellen beim AD-Wandler vergessen.

Nach meinen Erfahrungen stehen die 10Bit des AVR wie ein Fels bei UREF = 
5V.
Es kann aber sein, daß er bei kleiner UREF schlechter wird.

Eine Schwankung um ein LSB hat auch der beste ADC der Welt. Er muß sich 
nunmal entscheiden und halbe Bits gibt es ja nicht.
Gast #3052230
Lesenswert?

#3052269
Lesenswert?

Kurzer Stapel schrieb:
> Es gibt auch noch Leute, die bauen sich ein Variometer, und dazu
> benoetigt man 16 Bit.

Klar, einfach 16 Bit dann ist alles klar.
hast du mal das gelesen:

spess53 schrieb:
> Übrigens rauscht dein Sensor auch:
>
> http://www.google.de/url?sa=t&rct=j&q=an1646+frees...

Deswegen misst man ja jauch die Rauhigkeit einer Oberfläche mit dem 
Metermaß, zumindest wenn es genügend auflösen kann.

Du hast insofern recht, daß die Sensoren deutlich mehr Auflösung bringen 
können, und für kurzzeitige Tendenzen also auch Werte unterhalb der 
Genauigkeit Informationen bringen können.
Aber man sollte WISSEN wo die Grenzen und mögliche Fehler sind.
#3052512
Lesenswert?

Florian Trück schrieb:
> Karl Heinz Buchegger schrieb:
>> Dieser Berechnung würde ein bischen Vorarbeit auf dem Papier und
>> Formelumstellen auch gut tun
>
> Für Vorschläge bin ich jederzeit offen. :-) Es war für mich schon schwer
> genug die Formel aus dem Datenblatt so umzustellen, dass ich überhaupt
> was sinnvolles raus bekomme. Mit Mathe hatte ich es noch nie so wirklich
> dicke... ;-)

Dann lern es.

Na komm. Das ist ein ganz simpler Doppelbruch. Den wirst da ja wohl noch 
auflösen können!
Wenn ich das schon höre "Mit Mathe hatte ich es noch nie dicke" und mir 
ansehe, wie trivial die Formelauflösung ist, dann kommt mir die Galle 
hoch.
Gast #3052524
Lesenswert?

>Und das bauen sie dann so, dass von den 16 Bit die untersten 6 mehr oder
weniger Zufallszahlen sind, wodurch sie mit ihrem 16 Bit Wandler einen
10 Bit Wandler samt Zusatzzahl simulieren :-)

Man kann auch das Rauschen wegmachen, indem man die Werte durch einen 
Tiefpass laesst. Exponentielles mittel nennt sich das dann.
#3052592
Lesenswert?

Florian Trück schrieb:
> Karl Heinz Buchegger schrieb:
>> Dann lern es.
> Nur zu, bring es mir bei...


Echt?
Du brauchst eine Anleitung dafür, wie man

   x * 0.0049
 -------------
       5

vereinfachen kann?

schnapp dir einen Taschenrechner, rechne 0.0049 / 5 aus, das macht 
0.00098 und schreib anstelle von

   x * ADCVOLT / 5

das hier

   x * 0.00098

(Wie gehts weiter? Ach ja
   a_press*ADCVOLT)/5.0)+0.1518)/0.01059)
)

  x * 0.00098 + 0.1518

da geht jetzt erst mal nichts.

  ( x * 0.00098 + 0.1518 ) / 0.01059

ok. Klammer auflösen

   x * 0.00098 / 0.01059    + 0.1518 / 0.01059

Da kommt gleich wieder besagter Taschenrechner zum Einsatz und die 
Konstanten werden ausgerechnet


   x * 0.09254 + 14.3342

(
weiter im Text
((((a_press*ADCVOLT)/5.0)+0.1518)/0.01059)*10
 AHa. Alles mit 10 Multiplizieren. Na das sollte doch kein Problem sein


   x * 0.9254 + 143.342

und zum Schluss noch +41.875
Die kommen gleich mal zu den 143.342 dazu


    x * 0.9254  + 185.217


Und das wars. Dein ganzer komplizierter Ausdruck

a_press = (((((a_press*ADCVOLT)/5.0)+0.1518)/0.01059)*10)+41.875;

dampft sich ein zu:

  a_press = a_press * 0.9254 + 185.217;



Und das war jetzt schwer?


Und PS: wir sehen hier auch ganz klar, dass ein ADC Wert, der sich um 1 
verändert, sich im Endergebnis mit einer Änderung von 0.9254 
niederschlägt. Was ja auch mit deinem Diagramm erstaunlich gut 
korreliert. :-)
OP #3052612
Lesenswert?

Karl Heinz Buchegger schrieb:
> dampft sich ein zu:
>
>   a_press = a_press * 0.9254 + 185.217;
>
> Und das war jetzt schwer?
Nein, nach einer so guten Erklärung war es wirklich nicht schwer. Danke 
für die Hilfestellung.

> Und PS: wir sehen hier auch ganz klar, dass ein ADC Wert, der sich um 1
> verändert, sich im Endergebnis mit einer Änderung von 0.9254
> niederschlägt. Was ja auch mit deinem Diagramm erstaunlich gut
> korreliert. :-)

Was bedeutet: Ändert sich die Spannung um 4,9mV (oder auch etwas mehr), 
geht der ADC Wert um eins hoch, was die Änderung aus dem Diagramm 
erklärt.
#3052614
Lesenswert?

tobi schrieb:
> Karl Heinz Buchegger schrieb:
>> Echt?
>> Du brauchst eine Anleitung dafür, wie man
>>
>>    x * 0.0049
>>  -------------
>>        5
>>
>> vereinfachen kann?
>
> das macht jeder gute Compiler für Dich. GCC ist ein guter.
> Es sei den mit -O0 wurde es ihm untersagt.

Es geht um mehr.
Es geht auch darum, dass man durch die Vereinfachung der Formel auch 
Einsichten in das Verhalten der beobachteten Werte und wo sie herkommen 
erhält.
OP #3052617
Lesenswert?

Udo Schmitt schrieb:
> Typisch Konsumkind! Von alleine könnt ihr nicht mal aufs Klo oder was?

Danke dass Du mich in eine Schublade mit den anderen steckst. Leute wie 
Dir haben wir eines Tages das Ende der Welt zu verdanken. Tschuldige, 
aber das musste jetzt mal raus...

Im Gegensatz zu anderen Konsumkindern bin ich für jede Hilfe dankbar und 
lerne dadurch dazu. Ich fange keinen Post an mit: Ey kannste mir das mal 
ausrechnen?
#3052632
Lesenswert?

Florian Trück schrieb:

>> Und PS: wir sehen hier auch ganz klar, dass ein ADC Wert, der sich um 1
>> verändert, sich im Endergebnis mit einer Änderung von 0.9254
>> niederschlägt. Was ja auch mit deinem Diagramm erstaunlich gut
>> korreliert. :-)
>
> Was bedeutet: Ändert sich die Spannung um 4,9mV (oder auch etwas mehr),
> geht der ADC Wert um eins hoch, was die Änderung aus dem Diagramm
> erklärt.

Ganz genau.
Man erkennt auch, dass deine springenden Werte tatsächlich nur auf eine 
Änderung des ADC Wertes um 1 zurückzuführen sind (was allerdings nichts 
darüber aussagt warum der Wert springt).

Gut, das was den meisten auch vorher schon klar, weil die Form des 
Diagramms einfach zu characteristisch ist. Aber zumindest wissen wir, 
dass durch die Umrechnung nichts verloren gegangen ist und es mit diesem 
ADC besser nicht geht. Und du weißt auch, warum die niemals einen Wert 
von 1001.80 in deiner Anzeige sehen wirst. Dieses Ergebnis ist mit 
ganzzahligen ADC Werten nun mal nicht machbar.
OP #3052636
Lesenswert?

Karl Heinz Buchegger schrieb:
> Dieses Ergebnis ist mit
> ganzzahligen ADC Werten nun mal nicht machbar.

Es sei denn, man hätte mehr als 10 Bit Auflösung zur Verfügung, oder?
Bei 12 Bit wären dann Zehntelschritte und evtl. auch Einerschritte 
machbar.

In diesem Fall macht das aber wenig Sinn, da ich nur Änderungen der 
Wetterlage erkennen will, nicht ob jemand die Tür oder das Fenster 
aufgemacht hat. Dann macht es bei mir durchaus Sinn, die 
Nachkommastellen einfach abzuschneiden. Der entstehende Fehler ist 
durchaus tollerierbar und bei einer Schwankung von 1hPa wird auch nicht 
viel am Wetter passieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren