Pages: [1]   Go Down
Author Topic: MPX5010DP  (Read 1116 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
ich hab mir jetzt den MPX5010DP Differentialdruck sensor von freescale geholt.
Er hat einen druckbereich von 0-10kPa und kann, auf grund seiner spannung von 0.02-4.7V,  an den arduino angeschlossen werden.
Erst mal wollt ich fragen og ich ihn richtig angeschlossen habe:

Pin1(mit einkerbung) = V out = also hab ich den pin mit dem analogpin 5 meines megas verbunden.
Pin2 = Ground = verbunden mit ground des arduino
Pin3 = VCC = mit 5V des arduino verbunden
Pin4,5,6 = unbelegt

Ich hab das erstmal ohne kondesatoren oder sonstiges angeschlossen. Ist das so richtig?

Denn habe ich versucht einen kleinen sketch zu machen in dem mir auf meinem LCD der druck in mBar angezeigt werden soll.
Sketch:
Code:
#include <LiquidCrystal.h>   

LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);

int backLight = 29;
int   mpxPin = 5;
int   mpx;               
     
float mbar;             

void setup() {
  lcd.begin(20, 4);
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH);
}

void loop() {
    mpx = (float)analogRead(mpxPin);
    mbar = (mpx/(float)1023-0.04)/0.009;
   
    lcd.setCursor(0, 0);
    lcd.print("mb ");
    lcd.print(mbar);
    delay(1000);
  }

datasheet:
http://www.freescale.com/files/sensors/doc/data_sheet/MPX5010.pdf

anstatt 0.09 zur umrechnung zu benutzen habe ich 0.009 benutzt um die kPa in hPa (mBar) umzurechnen.
Code:
mbar = (mpx/(float)1023-0.04)/0.009;

Wenn ich in das rörchen des sensors nicht reinblase sollte dort 0.00 mb stehen doch stattdessen steht dort -1.84 und -1.74mb . d.h. irgendwas habe ich fasch gemacht.
Aber ich verstehe einfach nicht was. Was habe ich falsch gemacht?

Hat vieleicht auch jemand diesen sensor in gebrauch und könnte mir helfen?

Mfg

strohhirn
Logged

Gruß

strohhirn

Offline Offline
Jr. Member
**
Karma: 1
Posts: 81
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
versuch es mal mit folgenden zeilen in der loop:

int mpx = analogRead(mpxPin);
float mbar = mpx/10.23 //ersetzt mpx*100/1023 für hPa


Logged

Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

der Sensor hat einen Offset (s. Datenblatt), welchen Du noch kompensieren musst.

Des weiteren empfiehlt der Hersteller eine Entkopplung sowohl der Versorgungsspannung, mit 470p am Ausgang (gegen Masse) und 1µ || 100n an der Versorgungsspannung.

Die empfohlenen Kondensatoren würde ich so nah als möglich am Drucksensor anlöten, bei längerer Verbindungsleitung ist ausserdem ein abgeschirmtes Kabel zu empfehlen.

N.B.: Insbesondere vom Hersteller empfohlene Kondensatoren an der Versorgungsspannung sollten m.E. beachtet werden.
Mir ist kürzlich wegen eines fehlenden Kondensators fast ein Empfänger für Infrarotfernbedienung samt ARDUINO-Board abgeraucht, weil der IR-Empfänger plötzlich angefangen hat zu schwingen.


Gruß

Martin
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
der Sensor hat einen Offset (s. Datenblatt), welchen Du noch kompensieren musst.

Verzeih mir bitte ich bin noch nicht so vertraut mit all den ausdrücken, technischen Zeichnungen, arduino behehlen.
Ich lese machmal in sketchen dieses Offset . Aber was ist das? Könntest du mir das bitte erklären?

Die kondensatoren werd ich denn auch ma anschließen, Danke.
Logged

Gruß

strohhirn

Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also, lt. Datenblatt hat der Sensor eine Offsetspannung.

D.h., er gibt bei Ausgangswert 0 nicht tatsächlich 0 aus, sondern einen mehr oder weniger höheren Wert.
Wenn ich mich recht erinnere, sind es bei Deinem Sensor zwischen 0,2 und 0,45V, wobei es hier sehr wahrscheinlich auch Exemplarstreuungen gibt.

Wenn Du noch einen analogen Eingang an Deinem Arduino frei hat, kannst Du dort ein Trimmpoti von 10 - 20 Kiloohm (zwecks feinfühligerer Einstellmöglichkeit ist hier ein Spindeltrimmer zu bevorzugen) einfügen.
Den damit eingestellten Analogwert ziehst Du dann von Messwert ab und stellst das Poti so ein, dass der Sensor bei Differenzdruck 0 auch 0 anzeigt.

Im 'Fachchinesisch' nennt man sowas 'Nullpunktabgleich'.


Gruß

Martin
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

das mit dem offset hab ich jetzt verstanden und mir noch ein paar mal das datasheet angesehen.
Dort in der Tabele steht bei einer Spannung von 4,75V(wie bei mir) ist leigt offset bei 0V , bei mir liegt er aber immer knapp unter 0,2 V.

Hab jetzt mal mir den analog wert ausgeben lassen, wenn ich nicht rein blase. Ideal für die Umrechnungsgleichung wäre ein Wert von etwa 41 (0,2V).

Nun ist mein problem das ich nicht weiß wie ich den Wert auf ca. 41 bringe, da er bei mir immer schwankt.
Mal liegt er bei 25-28, oder 35-39, mal steigert er sich einfachso hoch auf 51 und sinkt auf einmal wieder 25.

Was soll ich machen? Kondensatoren sind angeschloßen. Nur Sensor und 20x4 LCD werden mit dem 5V des arduino versorgt.

Kleine frage am rande: Ich würde gerne ein 20x4 LCD im programm Fritzing haben mit den maßen 9,8 x 6 cm.
Wenn jemand so eine datei hat und sie mir geben könnte wäre ich sehr froh. (oder link)

Hier ma ne fritzind datei wie ich die kondensatoren angeschloßen hab.

* mpx kondensatoren.fzz (7.62 KB - downloaded 9 times.)
Logged

Gruß

strohhirn

Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

da hast Du das Datenblatt missverstanden!

Du hast drei Spalten: MIN, TYP und MAX

Dort steht beim Offset MIN 0V, TYP 0,2V und MAX 0,425V

Daraus kannst Du aber nicht ableiten, dass bei minimaler Versorgungsspannung von 4,75V der Offset 0V beträgt.
Dieser Eintrag besagt lediglich, dass in Abhängigkeit der Exemplarstreuung mit einem Offset von 0V bis 0,425V zu rechnen ist, wobei der Offset typischerweise, also bei den meisten Bauteilen, 0,2V betragen wird.
Dieser Wert deckt sich ja mit Deinen Ergebnissen.

Du musst aber noch mit weiteren Fehlern rechnen:

- Fehler des A/D-Wandlers
- Fehler durch ungenaue Referenzspannung

Ohne die Datenblätter der Arduino-Controller gelesen zu haben, würde ich den Wandlerfehler mit 3 bis 5 Digits annehmen (jeweils plus/minus).

Da der Arduino im Normalbetrieb die Versorgungsspannung als Referenzspannung benutzt, findest Du die Abweichungen der Versorgungsspannung vom Idealwert von 5,000V auch in Deinen Ergebnissen wieder!
Ob sich der Arduino auf eine externe Referenzspannung von z.B. 2,5V, welche dann mit einer Referenzdiode LM385-Z2,5 erzeugt wird, umschalten lässt, kann ich Dir leider nicht sagen, hier müssten Dir und mir die Kollegen des Forums weiterhelfen.

Zum eliminieren des Offsetfehlers kannst Du auch diesen Lösungsansatz verfolgen:
- Drucklose Messung vor der eigentlichen Messung, der gewonnene Messwert ist dann Dein Offset -> Zwischenspeichern
- Jetzt die eigentliche Messung durchführen, vor dem Umrechnen in andere Maßeinheiten den Offset aus der vorhergehenden Messung abziehen.


Gruß

Martin
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aha, ok.  Danke Martin.

Quote
Ob sich der Arduino auf eine externe Referenzspannung von z.B. 2,5V, welche dann mit einer Referenzdiode LM385-Z2,5 erzeugt wird, umschalten lässt, kann ich Dir leider nicht sagen, hier müssten Dir und mir die Kollegen des Forums weiterhelfen.

Verzei mir bitte mein schwaches Wissen. Was würde mir das bringen? Was macht diese Referenzdiode?

Quote
Zum eliminieren des Offsetfehlers kannst Du auch diesen Lösungsansatz verfolgen:
- Drucklose Messung vor der eigentlichen Messung, der gewonnene Messwert ist dann Dein Offset -> Zwischenspeichern
- Jetzt die eigentliche Messung durchführen, vor dem Umrechnen in andere Maßeinheiten den Offset aus der vorhergehenden Messung abziehen.

Könntest du es bitte etwas verständlicher umschreiben? Hab es mir mehrmals durchgelesen und nur schlecht verstanden.

Mfg

strohhirn
Logged

Gruß

strohhirn

Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

die Referenzdiode erzeugt eine sehr stabile und vor allem genaue Referenzspannung, bei der LM385-Z2,5 sind es eben 2,5V.
Dadurch kann so ein Bauteil auch bei höher auflösenden Wandlern (z.B. 12-bit-Wandler) als Spannungsreferenz benutzt werden.
Du musst immer dran denken, dass der A/D-Wandler, also Dein analoger Eingang, seine Werte durch vergleich mit einer Referenz ermittelt.

Zum zweiten Punkt, Offsetkorrektur Deiner Messung.

Wie Du das am besten umsetzen kannst, hängt auch davon ab, was Du damit vorhast.

Ich habe beruflich mit Druckmesstechnik zu tun, daher kenne ich die 'Unarten' von Drucksensoren nur zu genau!

Am besten gehst Du so vor:

- Sicherstellen, dass an den Anschlüssen des Sensors kein Druck ansteht
- Jetzt speicherst Du den Offsetwert (z.B.: int Korrekturwert =  analogread(x)), wobei x für den von Dir gewählten Eingang steht
- Nun kannst Du den zu messenden Druck anlegen
- Jetzt speicherst Du den Messwert (z.B.: int Messwert = analogread(x))
- Nun ziehst Du den Offset ab (Messewert = Messwert - Korrekturwert)
- Jetzt enthält die Variable 'Messwert' den um den Offsetfehler korrigierten Wert, diesen kannst Du jetzt in die gewünschte Einheit umrechnen

Ich hoffe, dass es jetzt etwas klarer ist.


Gruß

Martin
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für die klare und gut umschriebene beschreibung.

Um den Offset fehler zu korigieren bin ich deinem vorschlag gefolgt, das sieht bei mir so aus:

Code:
#include <LiquidCrystal.h>   

LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);

int backLight = 29;
int   mpxPin = 5;
               
     
float mbar;             

void setup() {
  lcd.begin(20, 4);
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH);
Serial.begin(9600);
}

void loop() {
int  Korrekturwert = (float)analogRead(mpxPin);

int Messwert = (float)analogRead(mpxPin);

int Messewert = Messwert - Korrekturwert;

    mbar = (Messewert/(float)1023-0.04)/0.009 ;
   
    Serial.println(Messwert);
    lcd.setCursor(0, 0);
    lcd.print("mb ");
    lcd.print(mbar);
    delay(1000);
  }

Leider hat das nicht wirklich was gebracht. Die mbar Werte haben sich komischer weise noch mehr verschlechtert.

Quote
- Nun kannst Du den zu messenden Druck anlegen
Ich möchte den Druck aber nicht nur zu einem bestimmten Zeitpunkt messen , sondern zu jeder zeit.

Mit Der Referenzdiode Verstehe ich nicht warum man eine mit 2,5V nehmen soll und nicht 5V?
Ich kenne mich aber auch so garnicht mit den Teilen aus und weiß auch nicht wie man die anschließt und verwendet.

Mfg

strohhirn
Logged

Gruß

strohhirn

Germany
Offline Offline
Full Member
***
Karma: 3
Posts: 126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

lass die ständige Umwandlung in 'float' weg un wandle erst nach 'float', wenn Du den korrekten Messwert hast!

Wenn Du den Druck allerdings jederzeit messen willst, dann musst Du den Offsetfehler 'hart' abziehen oder aber an einen freien Analogeingang ein Trimmpoti anschliessen und den dort eingestellten Wert vom eigentlichen Messwert abziehen (bzw. addieren, wenn Dein Ergenis bei Druck 0 mbar negativ wird!).
Dieses dann so einstellen, dass bei Druck = 0 mbar auch 0 mbar angezeigt wird.
Zur feinfühligeren Einstellung würde ich an dieser Stelle einen Spindeltrimmer bevorzugen, kostet nur wenig mehr als ein normales Trimmpoti.

Andererseits kannst Du ja die Offsetspannung hinreichend genau messen.
Dann kannst Du den daraus resultierenden Wert einfach abziehen.

Noch was zur Referenzdiode:
Diese Referenzdiode mit 2,5V ist zum einen ein gängiger Typ, zum andern lassen sich halt 2,5V aus 5V gut erzeugen, ohne dass separate (höhere!) Versorgungsspannungen benötigt werden.
Allerdings weiß ich nicht, wie man den Arduino dazu überredet, die externe Referenz zu benutzen, da müsstest Du mal in den Technischen Unterlagen nachsehen.


Gruß

Martin
Logged

Pages: [1]   Go Up
Jump to: