Forum: Mikrocontroller und Digitale Elektronik ADC-Wert in Druck umrechnen


von Johnny E. (electricjohnny)


Lesenswert?

Hallo Leute,

ich habe an einen ArduinoUNO den Drucksensor MPX5010 angebunden.
Der Druckbereich des Sensors geht von 0-100mbar.
Die ausgegebene Spannung liegt typ. bei 0.2-4.7V.

Diese habe ich mit einem Druckkalibrator in Zehnerschritten angefahren 
und die passenden ADC-Werte notiert.

Die Kurve ist zwischen 0 und 100mbar schön linear.

Jetzt fehlt ir nur noch der Ansatz, wie man den ADC-Wert in den 
passenden Druckwert umrechnet.

Druck [mbar]  ADC-Wert
-10         12
0           38
10          129
20          221
30          313
40          414
50          506
60          599
70          692
80          785
90          878
100         970
110         1016

wenn ich als Faktor berechne: 100mbar/970adc, berücksichte ich den 
Offset ja nicht.
Wie kann ich dieses Problem umgehen?

Danke und Grüße,
Johnny

von Mathe (Gast)


Lesenswert?

y = mx +b

Geradengleichung im kat. Ko. System.

von Frank B. (f-baer)


Lesenswert?

Johnny E. schrieb:
> Die Kurve ist zwischen 0 und 100mbar schön linear.

Aus einer Geraden kann man Anstieg (m) und Nullstelle (b) sogar grafisch 
bestimmen...

von Bitflüsterer (Gast)


Lesenswert?

Um die Genauigkeit, soweit es die Umstände an sich erlauben, zu erhöhen, 
kannst Du eine lineare Regression verwenden. Excel z.B. kann das; aber 
auch andere Programme.
Dabei werden die X- und Y-Werte eingegeben und daraus eine 
Geradengleichung (gemäß der Antwort von Mathe) berechnet.

von Johnny E. (electricjohnny)


Lesenswert?

okay, Excel gibt als Formel für eine Lineare Trendline y = 9,3555x + 
36,318 an.

Wie kann ich diese nun verwenden, um auf einem angeschlossenen Arduino 
LCD den Wert in mbar auszugeben?

Es geht also nicht um den Code für das LCD, sondern nur um die 
Umrechnung ADC-Wert=>mbar mit dieser Formel.

von Dirk B. (dirkb2)


Lesenswert?

Anders rum.
Die ADC-Werte liegen auf der X-Achse.

Es gibt auch die Funktionen Steigung und Achsenabschnitt.
Da kannst du das richtig berechnen.

Steigung: 0,106884288
Achsenabschnitt: -3,879398009

von Dirk B. (dirkb2)


Lesenswert?

Dirk B. schrieb:
> Steigung: 0,106884288
> Achsenabschnitt: -3,879398009

Da sind der erste und letzte Punkt nicht mit drin.

von Bitflüsterer (Gast)


Lesenswert?

Johnny E. schrieb:
> okay, Excel gibt als Formel für eine Lineare Trendline y = 9,3555x +
> 36,318 an.
>
> Wie kann ich diese nun verwenden, um auf einem angeschlossenen Arduino
> LCD den Wert in mbar auszugeben?
>
> Es geht also nicht um den Code für das LCD, sondern nur um die
> Umrechnung ADC-Wert=>mbar mit dieser Formel.

Das muss man zuerst mal im Zusammenhang mit Genauigkeit und Auflösung 
des Sensors sehen. Du siehst ja, das da bei der Regression reichlich 
Stellen nach dem Komma herauskommen. Es besteht die Möglichkeit (ich 
möchte fast sagen: die Wahrscheinlichkeit) das es mehr Stellen sind als 
Dein Sensor an sich auflöst.
Weiter müsste man auch berücksichtigen, wieviele Stellen Du überhaupt 
auf dem LCD anzeigen willst.

Aber sieht man mal davon ab, dann geht das so:

Was ist zunächst x und y in Deiner Formel? Beinahe offensichtlich ist y 
der ADC-Wert und x der Druck. Die Formel erlaubt es Dir also den Druck 
in einen ADC-Wert umzurechnen.
Du hast aber den ADC-Wert und willst den Druck. Gebrauchen wir dafür 
unsere liebe gute alte Algebra und stellen die Formel so um, das wir aus 
dem ADC-Wert den Druck berechnen können. Das ergibt:

(y - 36,318) / 9,3555 = x

Obwohl insgesamt nichts dagegen spricht, Fliesskommarechnungen zu 
verwenden, was hier nötig ist, nimmt man die Formel so wie sie dasteht, 
ist es häufig auch wertvoll sich mal zu überlegen, ob man die Rechnung 
nicht auch in ganzen Zahlen erledigen kann, weil das Codegrösse spart. 
Ausserdem empfinden manche die Anzeige auf dem LCD danach als einfacher. 
Wie macht man das?

Man skaliert die Zahlen so, dass keine Fliesskommazahlen mehr vorliegen. 
Im vorliegenden Fall multipliziert man also den Summanden und den Faktor 
mit 10000 und erhält:

(10000y - 363180) / 93555 = x

Setzt man z.B. den ADC-Wert 970 für y ein erhält man:

(10000 * 970 - 363180) / 93555 = x

(9700000 - 363180) / 93555 = x

9336820 / 93555 = x

99,8 = x

von Bitflüsterer (Gast)


Lesenswert?

Man kann einen weiteren Faktor wie 10 oder einen anderen verwenden, mit 
dem man nun aber die gesamte Gleichung multipliziert um auch als 
Ergebnis ein Integer zu erhalten. (Ich habe da leider die Erklärung ein 
wenig verbaselt).

Aber das ist Dir vielleicht schon klar.

von Johnny E. (electricjohnny)


Lesenswert?

Danke Bitflüsterer, toll erklärt!

von c-hater (Gast)


Lesenswert?

Johnny E. schrieb:

> Druck [mbar]  ADC-Wert
> -10         12
> 0           38
> 10          129
> 20          221
> 30          313
> 40          414
> 50          506
> 60          599
> 70          692
> 80          785
> 90          878
> 100         970
> 110         1016
>
> wenn ich als Faktor berechne: 100mbar/970adc, berücksichte ich den
> Offset ja nicht.
> Wie kann ich dieses Problem umgehen?

Na hier in desem Fall ist das ja nun wirklich supereinfach, weil der 
Nullpunkt der Zielskala schon direkt in der Wertetabelle ablesbar ist, 
0mbar entsprechen ganz offensichtlich einem ADC-Wert von 38.

Also ist der Offset für die ADC-Werte logischerweise -38. Und das 
korrekte Verhältnis ist nicht 100mbar/970, sondern (100-0mbar)/(970-38)

Die korrekte Formel wäre also:
1
 
2
          100
3
 [mbar] = --- * (adc - 38)
4
          932
Durchgespielt für z.B. 785 adc:
1
100                74700
2
--- * (785 - 38) = ----- = 80.15
3
932                 932
Paßt ziemlich gut und das tut es im ganzen Bereich von 38..970. 
Außerhalb dieses Bereiches kommt aber sehr schnell nur noch Mist raus. 
Hier ist die Kennlinie des Wandlers also offensichtlich nicht mehr 
linear.

von Bitflüsterer (Gast)


Lesenswert?

Bitteschön.

Nochmal die Anmerkung:
Es kann sich lohnen, einmal Auflösung und Genauigkeit des Sensors 
anzuschauen. Evtl. brauchst Du dann nicht mit so großen Zahlen rechnen.
Man kann das zwar erstmal ignorieren, aber es ist doch lehrreich für den 
Fall, dass es in einem anderen Projekt einmal ernsthaft darauf ankommt.

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.