Forum: Mikrocontroller und Digitale Elektronik Rauschen oder Problem mit Auflösung?


von Florian T. (florian_t)


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?

von Hääähhhh (Gast)


Lesenswert?

doch das bild hat was

von Florian T. (florian_t)


Angehängte Dateien:

Lesenswert?

Anhang vergessen... :-)

von STK500-Besitzer (Gast)


Lesenswert?

Hast du dir die ADC-Werte schon mal ohne die Umrechnung angesehen?

von Tachen (Gast)


Lesenswert?

Florian Trück schrieb:
> Der Sensor ist 1:1 ohne groß Hühnerfutter am AnalogPin des Arduino
> angeschlossen

Mach mal ein Amt Alias Filter davor z.B. TP1.

Danach gibst Du mal nur die Digits aus und vergleichst die Werte mit dem 
DB.

von Tachen (Gast)


Lesenswert?

Tachen schrieb:
> Amt

Shit Handy...meinte Anti

von user (Gast)


Lesenswert?

Das sieht mir danach aus das das letzte Bit wackelt

von Florian T. (florian_t)


Lesenswert?

Tachen schrieb:
> Mach mal ein Amt Alias Filter davor z.B. TP1.

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?

> Danach gibst Du mal nur die Digits aus und vergleichst die Werte mit dem
> DB.

DB?

von Florian T. (florian_t)


Lesenswert?

user schrieb:
> Das sieht mir danach aus das das letzte Bit wackelt

Also eher Rauschen auf der Leitung, als Ungenauigkeit vom ADC?

von Tachen (Gast)


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

von Ulrich (Gast)


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.

von Michael (Gast)


Lesenswert?

Florian Trück schrieb:
> Also eher Rauschen auf der Leitung, als Ungenauigkeit vom ADC?

Nein, Quantisierungsrauschen

von Florian T. (florian_t)


Lesenswert?

Tachen schrieb:
> Stören tut es Dich mit Sicherheit nicht bei einer
> Aktualisierung alle 30sek wenn Du ein Filter um die 1Hz einbaust,oder

Da hast Du wiederum recht.

Laut DB hat der Sensor eine Sensivity von 54mV/kPa und eine Accuracy von 
1,8% über den gesamten Messbereich (4,59V).

von Florian T. (florian_t)


Lesenswert?

Ulrich schrieb:
> 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.

Naja, 1-2 Bit würden schon reichen.

von PittyJ (Gast)


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.

von Florian T. (florian_t)


Lesenswert?

PittyJ schrieb:
> 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.

Was wäre denn ein passender und auch preiswerter externer Wandler? Und 
wo bekomme ich den einfach?

von oh. (Gast)


Lesenswert?

Eine Recherche bei den Herstellern und Distributoren wirkt Wunder...

von Peter D. (peda)


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.

von spess53 (Gast)


Lesenswert?


von Udo S. (urschmitt)


Lesenswert?

Rechnen hilft:

Florian Trück schrieb:
> und eine Accuracy von 1,8% über den gesamten Messbereich (4,59V).

Dein sogenanntes 'rauschen' schwankt zwischen 1001,4 und 1002,4, also 
etwa um 0,1%!!!

Dein 'Rauschen' ist also 20 mal kleiner als deine Messungenauigkeit.

Streichst du dein Nutellabrot eigentlich mit der Schieblehre?

von Udo S. (urschmitt)


Lesenswert?

PittyJ schrieb:
> Nach meinen Erfahrungen kannst du beim Arduino die letzten beiden
> Stellen beim AD-Wandler vergessen. Rechne da einfach nur mit 8 Bit
> Auflösung.

Was auch noch 4 mal genauer ist als der zu messende Sensor.

von Kurzer Stapel (Gast)


Lesenswert?

Es gibt auch noch Leute, die bauen sich ein Variometer, und dazu 
benoetigt man 16 Bit.

von Udo S. (urschmitt)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

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 :-)

von Karl H. (kbuchegg)


Lesenswert?

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

Dieser Berechnung würde ein bischen Vorarbeit auf dem Papier und 
Formelumstellen auch gut tun. Da wird mir ein bischen zu naiv 
rumgemacht, so als wäre Floating Point unendlich genau.

von Florian T. (florian_t)


Lesenswert?

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... ;-)

von Florian T. (florian_t)


Lesenswert?

Udo Schmitt schrieb:
> Streichst du dein Nutellabrot eigentlich mit der Schieblehre?

Ja sicher doch, Du nicht? ;-)

von tobi (Gast)


Lesenswert?

(Bedingt) kannst noch was rausholen durch Decimation. Paradoxerweise 
brauchst dabei etwas Rauschen.

Lies mal Atmel AN 121.

von Karl H. (kbuchegg)


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.

von Thosch (Gast)


Lesenswert?

Florian Trück schrieb:
>> Streichst du dein Nutellabrot eigentlich mit der Schieblehre?
>
> Ja sicher doch, Du nicht? ;-)

also nee, Meßschieber ist mir zu ungenau.
Dafür nehm' ich eine Abziehklinge, die mit einer Mikrometerschraube 
eingestellt wird. ;-)

von ah. (Gast)


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.

von Florian T. (florian_t)


Lesenswert?

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

Karl Heinz Buchegger schrieb:
Na komm. Das ist ein ganz simpler Doppelbruch. Den wirst da ja wohl noch
> auflösen können!

Ganz ehrlich: Ich brauch sowas vielleicht einmal im Jahr. Eher sogar 
noch viel weniger. Das letzte Mal das ich einen Doppelbruch lösen musste 
war 2001.

von Karl H. (kbuchegg)


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. :-)

von tobi (Gast)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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

Typisch Konsumkind! Von alleine könnt ihr nicht mal aufs Klo oder was?

Sorry Karl Heinz, aber das musste gerade raus, ich habe nicht deine 
Engelsgeduld.

von Florian T. (florian_t)


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.

von Karl H. (kbuchegg)


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.

von Florian T. (florian_t)


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?

von Karl H. (kbuchegg)


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.

von Florian T. (florian_t)


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.

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.