Forum: Mikrocontroller und Digitale Elektronik Druck und Höhensensor MPL3115a2


von Marcel W. (cranke)


Lesenswert?

Hallo,

zurzeit arbeite ich mit dem MPL3115a2 von Freescale.
Die gelieferte Temperatur von 20 °C scheint mir auch realistisch zu 
sein.
Leider liefert mir der Sensor eine Höhe von 161m statt den ca 80-90m 
über NN die ich erwarte und der Druck von 33871 Pa scheint mir auch 
nicht möglich zu sein.

Hat jemand mit diesen Sensor ähnliche Probleme oder eine Idee woran dies 
liegen könnte?

Über Tipps oder Anregungen würde ich mich sehr freuen.

Hier ein Ausschnitt über den Relevanten Code
1
void main (void)
2
{
3
    char i=0;
4
    unsigned long pressure = 0;
5
    unsigned char P_MSB=0,P_LSB=0,P_LSB_1=0,P_CSB=0,T_LSB=0;
6
    char T_MSB=0;
7
    int altitude=0;  
8
    unsigned char lcd_txt[21];
9
   
10
11
     seri_init();                            // Serielle schnitstelle mit 9600, 1 stop, 8 datenbits
12
    dis_init();                              // LCD initalisieren
13
    dis_clear();                             // LCD löschen                   
14
    clear_screen();                          // Terminal löschen
15
16
17
18
//INIT SENSOR
19
20
21
I2C_send_1(sensor, 0x26, 0xB8);    // Set to Altimeter with an OSR = 128
22
I2C_send_1(sensor, 0x13, 0x07);    // Enable Data Flags in PT_DATA_CFG
23
I2C_send_1(sensor, 0x26, 0xB9);    // Set Active Altimeter
24
25
26
while(1)
27
{
28
29
30
I2C_send_1(sensor, 0x26, 0xB8);    // Set to Altimeter with an OSR = 128
31
I2C_send_1(sensor, 0x26, 0xB9);    // Set Active Altimeter
32
33
34
while(!(I2C_empf_1(sensor, 0x00) & 0x08) );
35
36
P_MSB = I2C_empf_1(sensor, 0x01);
37
P_CSB = I2C_empf_1(sensor, 0x02);
38
P_LSB_1 = I2C_empf_1(sensor, 0x03);
39
T_MSB = I2C_empf_1(sensor, 0x04);
40
T_LSB = I2C_empf_1(sensor, 0x05);
41
42
altitude =0;
43
altitude = ( (P_MSB<<8) | (P_CSB) );
44
45
46
47
48
49
I2C_send_1(sensor, 0x26, 0xB8);    // passiv
50
I2C_send_1(sensor, 0x26, 0x38);    // Set to Barometer with an OSR = 128
51
I2C_send_1(sensor, 0x26, 0x39);    // Set Active Barometer
52
53
while(!(I2C_empf_1(sensor, 0x00) & 0x08) );
54
55
P_MSB = I2C_empf_1(sensor, 0x01);
56
P_CSB = I2C_empf_1(sensor, 0x02);
57
P_LSB = I2C_empf_1(sensor, 0x03);
58
59
60
pressure = ((P_MSB<<10) | (P_CSB<<2) |  (P_LSB>>6) ); // Druck zusammen bauen
61
62
I2C_send_1(sensor, 0x26, 0x38);     //Standby
63
64
65
66
clear_screen();
67
68
printf("\nPressure:       %lu,%u       \n", pressure, P_fraction(P_LSB)   );
69
printf("Temp    :         %d,%u       \n", T_MSB, T_fraction(T_LSB)  );
70
printf("Hoehe   :         %d,%u          \n\n", altitude, T_fraction(P_LSB_1)  );
71
72
sprintf(lcd_txt,"P: %lu,%u", pressure, P_fraction(P_LSB)   );
73
dis_txt(1,0,0,lcd_txt);
74
75
sprintf(lcd_txt,"T: %d,%u", T_MSB, T_fraction(T_LSB)  );
76
dis_txt(1,1,0,lcd_txt);
77
78
sprintf(lcd_txt,"H: %d,%u", altitude, T_fraction(P_LSB_1)  );
79
dis_txt(1,2,0,lcd_txt);
80
81
82
}
83
84
}

Gruß
Marcel

von Marcel W. (cranke)


Lesenswert?

Noch keiner Erfahrungen mit diesem Chip?
Außerdem fällt mir auf, dass die Ergebnisse der Höhe nicht 
reproduzierbar sind, zwar steigt die Höhe um ca 2m, wenn man den Chip um 
2m anhebt, jedoch bin zeigt der Sensor mittlerweile 230m an....

von Marcel W. (cranke)


Lesenswert?

Das Problem der Höhe habe ich gelöst, um die Höhe über NN zu erfahren 
muss man natürlich wie bei allen Höhenmetern das Aktuelle QNH eingeben, 
bzw. für die Höhe über den Boden das aktuelle QFE.

;) Dafür fehlten mir bis vor kurzen leider noch die grundlegenden 
Erkenntnisse über den Luftdruck.

Falls aber schon mal einer es geschafft hat bei diesem Sensor auch einen 
Korrekten Luftdruck auszulesen, würde ich mich immer noch freuen.

Gruß

von John W. (halfpastseven)


Lesenswert?

Hast du es mittlerweile hinbekommen??

von Marcel W. (cranke)


Lesenswert?

Ja das Problem war, dass ich beim zusammensetzen des 12 Bit Registers 
die einzelnen Bytes auf long int casten musste. Ohne casten gab es halt 
immer einen Überlauf bei der Berechnung, was zu einem Fehlerhaften 
Ergebnis führte.
1
338                // Druck aus den 3 Character zusammensetzen
2
339                pressure  = ((long)P_LSB >> 6) ;
3
340                pressure += ((long)P_CSB << 2) ;
4
341                pressure += ((long)P_MSB <<10);


Gruß Marcel

von Quadrocopter Eric (Gast)


Lesenswert?

Und haste das zeitliche Driften der Höhe in Griff gekriegt?

von Marcel W. (cranke)


Lesenswert?

Nein das zeitliche Driften führe ich jedoch auf leichte 
Luftdruckschwankungen zurück, welche ständig vorhanden sind und das 
Ergebnis natürlich negativ beeinflussen. Wenn man bedenkt, dass 1 hPa 
ca. 8,3m entsprechen ist hierfür auch nicht viel nötig.

Gruß Marcel

von John W. (halfpastseven)


Lesenswert?

Ok, vielen Dank für die Infos!! :-)

von dr.prof.schlau (Gast)


Lesenswert?

Hallo Marcel,
ich experimentiere auch mit dem MPL3115a2 und habe ihn gestern erst zum 
Laufen gebracht.
Anscheinend ist er sehr empfindlich beim Löten...(hüstel)
Ich habe hier auch einen viel zu hohen Höhenwert: ca. 140m statt 60. 
Gut, ich kann einfach einen Offset abziehen, aber eigentlich ist der 
Sensor ja temperaturkompensiert und "akkurat".
Leider läuft er immer nur etwa eineinhalb Minuten und steigt dann aus. 
(Kann auch an meinem übrigen Programm liegen).
Ist das auch der Grund, warum du ihn immer neu initialisierst?
1
while(1 ) {
2
I2C_send_1(sensor, 0x26, 0xB8);    // Set to Altimeter with an OSR = 128
3
I2C_send_1(sensor, 0x26, 0xB9);    // Set Active Altimeter
4
...
Meine Temperatur liegt zur Zeit bei 4925°C. Entweder ist meine Küche 
sehr warm oder die Daten liegen im Zweierkomplement vor. Ich teste die 
Tage aber noch weiter.
Ich bin schon froh, dass ich überhaupt Kontakt mit dem Sensor aufnehmen 
konnte.
Gruß
Michael

von Marcel W. (cranke)


Lesenswert?

dr.prof.schlau schrieb:
> Ich habe hier auch einen viel zu hohen Höhenwert: ca. 140m statt 60.
> Gut, ich kann einfach einen Offset abziehen, aber eigentlich ist der
> Sensor ja temperaturkompensiert und "akkurat".

Einen Offset von 10m musste ich bei mir auch einstellen, um ein 
korrektes Ergebnis zu erlangen. 100m sind jedoch denke ich zuviel. Hast 
du auch vor der Messung immer dran gedacht dem Sensor, den aktuellen 
"relativen" Luftdruck deines Standortes mitzuteilen?

dr.prof.schlau schrieb:
> Leider läuft er immer nur etwa eineinhalb Minuten und steigt dann aus.
> (Kann auch an meinem übrigen Programm liegen).
> Ist das auch der Grund, warum du ihn immer neu initialisierst?
>
1
while(1 ) {
2
> I2C_send_1(sensor, 0x26, 0xB8);    // Set to Altimeter with an OSR = 128
3
> I2C_send_1(sensor, 0x26, 0xB9);    // Set Active Altimeter
4
> ...

Ich initalisiere den Sensor nur jedesmal, um zwischen Höhen- und 
Druckmessung zu wechseln. Dies ist jedoch nur bei mir notwendig, da mich 
beide Werte interessiere.

dr.prof.schlau schrieb:
> Meine Temperatur liegt zur Zeit bei 4925°C. Entweder ist meine Küche
> sehr warm oder die Daten liegen im Zweierkomplement vor.

Ich kann dir leider nicht sagen, wie warm es in deiner Küche ist, jedoch 
kann ich bestätigen, dass die Temperatur im Zweierkomplement vor liegt 
;)

Gruß Marcel

von prof.dr.schlau (Gast)


Lesenswert?

Marcel W. schrieb:
> Einen Offset von 10m musste ich bei mir auch einstellen, um ein
> korrektes Ergebnis zu erlangen. 100m sind jedoch denke ich zuviel. Hast
> du auch vor der Messung immer dran gedacht dem Sensor, den aktuellen
> "relativen" Luftdruck deines Standortes mitzuteilen?

Nein, das habe ich bislang noch nicht gemacht. Da muss ich mir wohl noch 
einmal das Manual unters Kissen legen..

Zur Temperatur:
Im Manual steht:
if (data.Byte.hi > 0x7F)
{
   SCI_CharOut ('-');
   data.Word = ~data.Word + 1; //Zweierkomplement
}

Bei meinem Wert von 4295 liegt das High-Byte aber unter 7F und sollte 
doch so übernommen werden können, oder?
Wie gesagt, noch kämpfe ich mit dem Sensor, der nach kurzer Zeit nicht 
mehr ausgelesen wird, obwohl zum Auslesen sämtl. Interupts gesperrt 
sind. Das ganze habe ich in einem Projekt mit mehreren Anzeigen diverser 
Sensoren, die bereits laufen und ich so leider experimentieren muss.
Gruß
Michael

von Marcel W. (cranke)


Lesenswert?

> Zur Temperatur:
> Im Manual steht:
> if (data.Byte.hi > 0x7F)
> {
>    SCI_CharOut ('-');
>    data.Word = ~data.Word + 1; //Zweierkomplement
> }

Beim durchsehen des Manual wird dir dann auch sicher auffallen, dass die 
nur das Byte T_MIN_MSB für die Stellen vor dem Komma zuständig sind. Aus 
diesem Grund können ja unter keinen Umstand Werte über 255 entstehen. 
Die übrigen 4 Bit aus dem Register T_MIN_LSB musst du gesondert 
bearbeiten um daraus die Nachkommastellen zu ermitteln.

> Wie gesagt, noch kämpfe ich mit dem Sensor, der nach kurzer Zeit nicht
> mehr ausgelesen wird, obwohl zum Auslesen sämtl. Interupts gesperrt
> sind.

Das Problem ist mir mal untergekommen als ich mit voller Geschwindigkeit 
ständig die Register ausgelesen habe. Da ich dies zurzeit nur alle 5s 
mache, kann ich nicht sagen ob es jetzt nicht mehr auftritt oder halt 
nur 1000 mal so lange dauert bis der Sensor abschmiert.

Gruß Marcel

von dr.prof.schlau (Gast)


Lesenswert?

Marcel W. schrieb:
> Das Problem ist mir mal untergekommen als ich mit voller Geschwindigkeit
> ständig die Register ausgelesen habe. Da ich dies zurzeit nur alle 5s
> mache, kann ich nicht sagen ob es jetzt nicht mehr auftritt oder halt
> nur 1000 mal so lange dauert bis der Sensor abschmiert.

Hi Marcel,
leider verliere ich auch bei 10kHz I2C-SCL nach einigen Minuten die 
Verbindung (1 Abfrage/s.
Da du oben für 'altitude' einen 'int' angegeben hast, nehme ich an, dass 
du dein Programm auf einem PC und nicht auf einem AVR laufen lässt. Ich 
hantiere hier mit einem AVR644. Die Temperatur kann ich immer genau 
auslesen. Bei der Höhe haperts noch (evtl. ein Fehler beim casten der 
Werte)

Wie liest du das aktuelle QNH ein? Holst du dir die Werte irgendwo her 
und trägst sie dann ein oder liest du sie mit dem Sensor aus und legst 
sie dann im entspr. Register ab?

Gruß
Michael

von dr.prof.schlau (Gast)


Lesenswert?

Marcel W. schrieb:
> 338                // Druck aus den 3 Character zusammensetzen
> 339                pressure  = ((long)P_LSB >> 6) ;
> 340                pressure += ((long)P_CSB << 2) ;
> 341                pressure += ((long)P_MSB <<10);

Hi nochmal,
gleich noch eine Frage:
Bei der Zusammensetzung berücksichtigst du nur die oberen zwei Bits des 
P_LSB. (das LSB ist Bit 7-4, du benutzt also nur insgesamt 18Bit). Sehe 
ich das richtig?
Gruß
Michael

von Marcel W. (cranke)


Lesenswert?

dr.prof.schlau schrieb:
> Hi Marcel,
> leider verliere ich auch bei 10kHz I2C-SCL nach einigen Minuten die
> Verbindung (1 Abfrage/s.

Dazu weiß ich zurzeit auch leider keinen Rat.

dr.prof.schlau schrieb:
> Da du oben für 'altitude' einen 'int' angegeben hast, nehme ich an, dass
> du dein Programm auf einem PC und nicht auf einem AVR laufen lässt.

Nein ich nutze einen 8051er.

dr.prof.schlau schrieb:
> Bei der Höhe haperts noch (evtl. ein Fehler beim casten der
> Werte)

Denk dran, die Vorkommastellen befinden sich in OUT_P_MSB und OUT_P_CSB, 
bzw. die Nachkommastellen in OUT_P_LSB in Bit 7-4. Beim casten dürfte es 
deshalb an dieser Stelle keine Fehler geben. Wohl jedoch falls du 
vergisst, dass die Daten in OUT_P_MSB und OUT_P_CSB im 2er Komplement 
vorliegen.


dr.prof.schlau schrieb:
> Wie liest du das aktuelle QNH ein? Holst du dir die Werte irgendwo her
> und trägst sie dann ein oder liest du sie mit dem Sensor aus und legst
> sie dann im entspr. Register ab?

Den QNH holst du dir aus entweder aus einem auf deine Höhe kalibrierten 
Barometer bzw. im Internet bei irgendeinem Wetterdienst, bezogen auf 
deinem Einsatzort. Weil für eine Richtige Höhenangabe der relative 
Luftdruck notwendig ist. Umgekehrt kann dein Sensor nur den relativen 
Luftdruck berechnen, wenn dir deine Höhe über NN bekannt ist.


Gruß
Marcel

von Marcel W. (cranke)


Lesenswert?

dr.prof.schlau schrieb:
> Marcel W. schrieb:
>> 338                // Druck aus den 3 Character zusammensetzen
>> 339                pressure  = ((long)P_LSB >> 6) ;
>> 340                pressure += ((long)P_CSB << 2) ;
>> 341                pressure += ((long)P_MSB <<10);
>
> Hi nochmal,
> gleich noch eine Frage:
> Bei der Zusammensetzung berücksichtigst du nur die oberen zwei Bits des
> P_LSB. (das LSB ist Bit 7-4, du benutzt also nur insgesamt 18Bit). Sehe
> ich das richtig?


Ja wie aus dem Datenblatt ersichtlich, sind die ersten 18 Bit wiedermal 
die Vorkommastellen, und die 2 Bit auf Position 5-4 im OUT_P_LSB 
repräsentieren die Nachkommastellen.

Gruß
Marcel

von B e r n d W. (smiley46)


Lesenswert?

Schaut euch dazu die Barometrische Höhenformel an:
http://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel

Der Druck auf Meereshöhe beträgt im Mittel 1013,25 mbar. Er kann aber 
abhängig von der Wetterlage auchmal 1025 mbar betragen oder nur 980 
mbar. Das entspricht einem Höhenunterschied von ca. 360 Meter. Im 
Extremfall wurden im Zentrum eines Hurricanes schon mal 950 mbar 
gemessen.

Ganz grob ändert sich der Druck um 1 mbar pro 8 Meter Höhenunterschied.
Also im Treppenhaus 3 Stockwerke hoch -> 1 mbar weniger.

von dr.prof.schlau (Gast)


Lesenswert?

Marcel W. schrieb:
> Ja wie aus dem Datenblatt ersichtlich, sind die ersten 18 Bit wiedermal
> die Vorkommastellen, und die 2 Bit auf Position 5-4 im OUT_P_LSB
> repräsentieren die Nachkommastellen.

Ja, natürlich, beim Druck.
Ich habe bislang nur die Höhe ausgelesen. Da sind die 4 Bits aus dem LSB 
die Nachkomastellen.
Gruß
Michael

von Max (Gast)


Lesenswert?

Hallo,

ich bin gerade auf der Suche nach Sensoren für eine Wetterstation. 
Temperatur und Druck möchte ich dafür erfassen aber mir sind die 
Sensoren, gerade für Druck, zu teuer.
Wie sind denn eure Erfahrungen mit dem MPL bezüglich der Druckmessung?
Für die Temperatur würde ich einen anderen Sensor vorziehen.

von Mr.T (Gast)


Lesenswert?


von Ulrich M. (werder)


Lesenswert?

Schon gesehen:
The Ultimate Altimeter - A compact, Arduino altimeter for RC Planes

http://www.instructables.com/id/The-Ultimate-Altimeter-A-compact-Arduino-altimeter/?ALLSTEPS

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.