Hallo,
Ich versuche schon seit einiger Zeit einen MS5611 Drucksensor mit meinem
TI Launchpad MSP4302553 auszulesen. Dabei muss man zuerst
Kalibrierungsdaten auslesen, mit deren Hilfe kann man die danach
gelesenen Temeratur- und Druckwerte errechnen. Soweit funktioniert auch
alles nur stimmt der errechnete Druck nicht mal annaehernd mit dem
meiner Wetterstation ueberein. Die Temperatur passt so einigermassen und
die Kalibrierungsdaten entsprechen auch etwa denen im Datenblatt.
Woran kanns also liegen das der Druck nicht stimmt. Vielleicht koennte
sich mal jemand meine Funktion ms5611_get_pressure() anschaun, denke
dass es an der Berechnung liegt.
Hier die Ausgabe via uart_printf:
Hallo;
wenn handwerklich kein Fehler vorliegt:
Dein Sensor misst den physikalischen Luftdruck.
Deine Wetterstation verwendet vermutlich die "barometrische"
Höhenformel"
Wen n du ein bischen suchst, gibt es bestimmt auch codebeispiel zur
Anpassung.
Gruß
Die barometrische Hoehenformel kommt erst spaeter ins Spiel, jetzt gehts
mir mal in erster Linie um den aboluten Luftdruck, doch der passt ja
schon nicht.
Aber passt diese Berechnung grunsaetzlich:
Ein char, der den Wert 65438 hat?
Das glaub ich jetzt eher nicht.
1
return((uint8_t)rxb[0]*65536)+
wenn auf deinem System ein int nicht zufällig eine Größe von 4 Bytes
hat, dann hast du hier bereits deinen ersten Overflow.
1
volatilecharrxb[3];
halte dich an eine einfache Regel.
Es gibt 3(!) Character Datentypen
1
int8_t für kleine Integer, mit Vorzeichen (signed char)
2
uint8_t für kleine Integer, ohne Vorzeichen. Das ist das, was
3
man gemeinhin unter 'Byte' versteht (unsigned char)
4
char für alles was mit Textverarbeitung zu tun hat. (char)
Benutze den richtigen Datentyp in der richtigen Umgebung, und zwar
bereits bei den Variablendefinitionen!, und du hast weniger Probleme.
Auf deinem System scheinen plain vanilla char ein Vorzeichen zu haben.
char ist bei dir gleichzusetzen mit signed char. Ein Teil deiner
Probleme in ms5611_get_raw stammen daher.
Sodala, ich hab mich jetzt wieder mal an meinem alten Problem, dem
Auslesen des Sensors MS5611 beschäftigt ... bin wieder ein Stückerl
weitergekommen und mittlerweile kenn ich mich auch schon ein bisserl mit
dem debuggen des MSP430ers aus.
Das Auslesen der Temperatur funktioniert schon korrekt und stimmt mit
der Zimmertemperatur meiner Wetterstation überein, nur beim Luftdruck
sind sich die beiden noch ziemlich uneinig, leider hat die Wetterstation
recht. Ich lese vom Sensor so um die 1400 hPa (=mbar) es sollten aber so
an die 950 sein. Und da komm ich nicht mehr weiter und bitte um Hilfe.
folgender Codeabschnitt führt die Berechnung durch:
Die MS5611_CAL_xxx Werte sind Kalibrierungswerte die einmal zu beginn
gelesen werden und in der Variable pres steht der endgültige Luftdruck.
Da ich mir long long nicht korrekt via uart ausgeben kann, hab ich off
und sens mit dem debugger angeschaut:
1
(gdb) print/x ms5611_get_raw::rxb
2
$4 = {0x84, 0xa9, 0x48}
3
(gdb) print ms5611_get_pressure::raw
4
$5 = 8694088
5
(gdb) print ms5611_get_pressure::off
6
$6 = 4332879376
7
(gdb) print ms5611_get_pressure::sens
8
$7 = 2164522714
9
(gdb) print ms5611_get_pressure::pres
10
$8 = 141616
Und wenn ich das mit dem Taschenrechner nachrechne, komm ich auf die
selben Werte. Bzw hab ich mir dafür ein kleines Bashscript geschrieben,
dem man die drei raw und den dT wert übergint und dann die Berechnung
macht, siehe Anhang.
Also ich steh wieder mal an und bin für jede Anregung dankbar.
lG,
Max
Mittlerweile funktioniert alles soweit ... mein einziges Problem ist
nur, dass ich beim Auslesen des Sensors ein delay vom mindestens 6000
Zyklen einbauen muss, damit eine korrete Antwort vom Drucksensor gelesen
wird. Bei 1MHz Taktung sind das ca. 100ms. Laut Datenblatt benötigt er
aber max 9.4ms für die Wandlung. Das ist für mich jetzt ein Problem da
ich gerne schnell mehrere Werte lesen und dann mitteln will.
Andere Sourcebeispile im Netz warten auch nur ca.10ms, sollte also
funktionieren.
Jetzt meine Frage. Ich hab die I2C Routinen von TI verwendet (siehe
Anhang), kann sein es daran liegen kann. Kann man das noch
besser/schneller machen? Vielleicht könnte sich mal jemand "meine" i2c.c
anschaun.
Das Auslesen selbst mach ich so:
1
uint32_tms5611_get_raw(constchar*command)
2
{
3
volatilecharrxb[3];// 3 Byte receive buffer
4
uint32_traw;
5
6
// Command to initiate a pressure conversion (OSR=4096, typ=D2)
7
i2cSetupTx(MS5611_ADDR_CSB_LOW);
8
i2cTransmit(command,1);
9
10
// Wait to finish conversion, 0.096 sec@1MHz, ~100ms (should be max 9.4ms)
Eine eigene Frage?
Dieser Thread ist über 13 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.