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