Ik heb hier een BMP180-sensormodule. Het is een sensor van Bosch, waarmee temperatuur en luchtdruk gemeten kan worden. Via een Atmega32 probeer ik er gegevens uit los te peuteren, via I2C.
Via internet heb ik de nodige info opgehaald. Zo ook om er gegevens uit te kunnen trekken. Via Bascom-code is het me gelukt om de Raw-Temp (UT) en RAW-Pressure (UP) uit te trekken.
De verkregen waarden wijkt, voor wat betreft de luchtdruk erg af. In de datasheet staat een uitleg over hoe de berekeningen uitgevoerd dienen te worden, middels formules.
Voor de berekeningen heb ik de parameter-waarden uit de datasheet gebruikt. De uiteindelijk berekende waarden voor de temperatuur en de luchtdruk wijken abnormaal af.
In Nederland schommelt de temperatuur tussen -10 en +35 oC. De luchtdruk tussen de 950 en 1015. Maar de berekende waarden wijken echt enorm af, en vallen ver buiten de aangegeven waarden. Als ik de meter zou mogen geloven zou het vandaag of erg fris zijn of kokend heet. En dan heb ik het nog niet eens over de luchtdruk.
Voor mij vormde dit een reden om de gecalibreerde parameters uit de BMP180 te halen, middels I2C. Je voelt het al aankomen, deze schijnen ook behoorlijk af te wijken, van de datasheet. Inmiddels zit ik te denken of "ik" wellicht iets fout doe.
Vandaar dat ik probeer om het op CO te posten, in de hoop dat ik er alsnog uit kom.
Om te starten, zal ik hier een overzicht geven van de gegevens uit de datasheet, en dat wat ik hier in de praktijk uit de BMP180 krijg.
code:
Param Byte1 Byte2 Waarde Datasheet
AC1 34 209 int 20770 408
AC2 251 193 int 16891 -72
AC3 199 194 int 17095 -14383
AC4 127 217 wrd 55679 32741
AC5 100 20 wrd 5220 32757
AC6 75 38 wrd 9803 23153
B1 25 115 int -3303 6190
B2 0 39 int -22784 4
MB 138 0 int -32630 -32768
MC 209 246 int 30417 -8711
MD 9 138 int 2569 2868
Ik haal in 1 keer alle parameters uit de BMP180. Vervolgens sorteer ik ze en vertaal het terug naar een waarde.
Opm : Wat ik heb begrepen, is dat :
In C, "Short" de waarde -32,768 tot +32,767 kan hebben. In Bascom komt dat overeen met een Integer.
In C, "Unsigned short" de waarde 0 tot 65535 kan hebben. In Bascom komt dat overeen met een Word.
Goed, laat ik een voorbeeld geven hoe ik bijv. een parameter bereken.
AC1 (short / integer)
(Byte2 * 256) + Byte1 = (209 * 256) + 34 = 53538. Vervolgens trek ik er 32768 van af, zodat AC1 de waarde 20770 krijgt.
AC4 (unsigned short / word)
(Byte2 * 256) + Byte1 = (217 * 256) + 127 = 55769.
Nu ja, als de gecalibreerde waarden zouden kloppen, dan zou het verder niet uit moeten maken. Maar ik vindt ze behoorlijk afwijken, met een enkele uitzondering.
Pas ik de formules toe, zoals in de datasheet aangegeven, dan zijn de resultaten bedroevend. Ze wijken echt fors af. Maar het kan ook natuurlijk zijn dat ik de formules niet goed hanteer. Dat komt mede omdat ik bepaalde dingen niet goed begrijp. Ik daarom de waarden uit de datasheet gebruikt samen met de calibratie-waarden. Zo heb ik een aardige indruk gekregen wat er allemaal gebeurd (alles in een excel sheet gepropt, om het te kunnen volgen).
Toch zijn er een aantal zaken waar ik geen vat op heb.
Opm : Hieronder zijn de RAW_temp (UT) en RAW_pressure (UC) uit de BMP180.
Voor UT krijg ik Byte1 = 210 en Byte2 = 107
Voor UC krijg ik Byte1 = 71, Byte2 = 35 en Byte3 = 5
De hieronderstaande formules zijn overgenomen uit de datasheet :
code:
Temperatuur :
X1 = (UT - AC6) * AC5 / 2^15
X2 = MC * 2^11 / (X1 + MD)
B5 = X1 + X2
T = (B5 + 8) / 2^4
Luchtdruk :
B6 = B5 - 4000
X1 = (B2 * (B6 * B6 / 2^12)) / 2^11
X2 = AC2 * B6 / 2^11
X3 = X1 + X2
B3 = (((AC1 * 4 + X3) << oss) + 2) / 4
X1 = AC3 * B6 / 2^13
X2 = (B1 * (B6 * B6 / 2^12)) / 2^15
X3 = ((X1 + X2) + 2) / 2^2
B4 = AC4 * (unsigned long)(X3 + 32768) / 2^15
B7 = ((unsigned long)UP - B3) * (50000 >> oss)
if (B7 < 0x800000000) {p = (B7 * 2) / B4}
else {p = (B7 / B4) * 2}
X1 = (p / 2^8) * (p / 2^8)
X1 = (X1 * 3038) / 2^16
X2 = (-7357 * p) / 2^16
p = (p + (X1 + X2 + 3791)) / 2^4
Ik heb het bovenstaande zitten napluizen, en heb vervolgens haakjes toegevoegd, zodat je kunt zien hoe ik aan mijn berekeningen kom :
code:
Temperatuur :
X1 = (UT - AC6) * AC5 / 32768
X2 = MC * 2048 / (X1 + MD)
B5 = X1 + X2
T = (B5 + 8) / 16
Luchtdruk :
B6 = B5 - 4000
X1 = ((B2 * (B6 * B6)) / 4096) / 2048
X2 = (AC2 * B6) / 2048
X3 = X1 + X2
B3 = ((((AC1 * 4) + X3) << oss) + 2) / 4
X1 = (AC3 * B6) / 8192
X2 = ((B1 * (B6 * B6)) / 4096) / 32768
X3 = ((X1 + X2) + 2) / 4
B4 = (AC4 * (X3 + 32768)) / 32768
B7 = Zorg ervoor dat UP positief is (- teken weghalen)
en dan (UP - B3) * 50000
Indien B4 < 0 dan :
p = (B7 * 2) / B4
anders :
p = (B7 / B4) * 2
X1 = (p / 256) * (p / 256)
X1 = (X1 * 3038) / 65536
X2 = (-7357 * p) / 65536
p = (p + (X1 + X2 + 3791)) / 16
Wat met "<< oss" en ">> oss" in de datasheet wordt bedoeld, is me onduidelijk. Evengoed, of beter : evenslecht, heb ik het niet helemaal duidelijk voor me wat bij "AC4 * (unsigned long)UP - B3) * (50000 >> oss) gebeurt.
Goed, een hele lap text, incl. wat formules. Ik kan me heel goed voorstellen dat vele lezers hierdoor al meteen wegduiken. Ik had het inderdaad ook stapsgewijs middels reacties kunnen plaatsen. Ik vind het echter eerlijker om meteen te laten zien wat ik al heb ondernomen en waar ik ergens gestruikeld moet zijn.
Ik hoop dat er reacties komen met aanvullende info, zodat ik de BMP180 uiteindelijk aan de praat krijg.