C BMP180 --> Temperatur berechnen?!

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo Freunde,

ich versuche nun die Temperatur von einem "BMP180" Drucksensor aus zu lesen.
Dieser hat in seinem EPROM einige Kalibriertwerte gespeichert, die ich vorher auslesen muss und mit verrechnen muss.

Die Kalibrationswerte & den Wert der Temperatur "UT" bekomme ich.

Leider bekomme ich als Ergebniss "truetemperature" ständig ne "0" raus. Das deutet doch eigentlich darauf hin das der Wert nicht in die Variable rein passt oder ?

Hier den Quellcode den ich im Internet gefunden hab..

[CCODE]
// addresses of the BMP180 calibration MSB reigisters
uint8_t BMP180_regaddress[11] =
{
0xAA, 0xAC, 0xAE, 0xB0,
0xB2, 0xB4, 0xB6, 0xB8,
0xBA, 0xBC, 0xBE
};

uint16_t BMP180_cal[11]; // holds all BMP180 calibration data


uint8_t BMP180_init(void)
{
unsigned char ID;
i2c_start(BMP180_address + I2C_WRITE);
i2c_write(BMP180_ID);
i2c_start(BMP180_address + I2C_READ);
ID = i2c_readNak();
i2c_stop();

if(ID == 0x55)
{
for(uint8_t i = 0; i < 11; i++)
{
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_regaddress);
i2c_start(BMP180_address+I2C_READ);
BMP180_cal = i2c_readAck()<<8;
BMP180_cal |= i2c_readNak();
i2c_stop();
}
return 1;
}
else
{
return 0;
}
}

uint16_t BMP180_read(uint8_t oversampling_setting, uint8_t select)
{
uint16_t UP; // holds the raw pressure value read from BMP180
int16_t UT; // holds the raw temperature value read from BMP180
long B6, X1, X2, X3, B3, B5, B7;
unsigned long B4;
int16_t truetemperature;
uint16_t truepressure;

i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_CTRL);
i2c_write(0x2E);
_delay_us(50);

i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_OUTMSB);

i2c_start(BMP180_address+I2C_READ);
UT = i2c_readAck()<<8;
UT |= i2c_readNak();
i2c_stop();

i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_CTRL);
i2c_write(0x34+(oversampling_setting<<6));
_delay_us(80);

i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_OUTMSB);

i2c_start(BMP180_address+I2C_READ);
UP = i2c_readAck()<<8;
UP |= i2c_readNak();
i2c_stop();
UP >>= (8-oversampling_setting);

X1 = (UT-BMP180_cal[5]) * BMP180_cal[4] / 32768;
X2 = BMP180_cal[9] * 2048 / (X1 + BMP180_cal[10]);
B5 = X1 + X2;
truetemperature = (B5 + 8) / 16;
[/CCODE]

Die Funktion wird als "uint16_t" deklariert... Das kann bei negativen Temperaturen doch schon in die Hose gehen oder?

Dann, werden die ausgelesenen Kalibrierwerte ebenfalls in einem "uint16_t" gespeichert... Im Datenblatt sehe ich aber auch negative Werte... Oder Interpretiere ich mal wieder was falsch?
 
Hier mal die Messergebnisse... Was mir spanisch vorkommt, sind die negativen Werte von "UT"...
 

Anhänge

  • BMP180_Messergebniss.jpg
    BMP180_Messergebniss.jpg
    44,2 KB · Aufrufe: 12
Schau mal ins Datenblatt des Sensors. Da findest Du auf S.15 den Algorithmus nebst Beispiel. Insbesondere auch zu den 16Bit-Calibrationsdaten, ob sie vorzeichenbehaftet zu interpretieren sind oder nicht. Die unkompensierten Rohdaten (UT, UP) scheinen als vorzeichenbehaftet zu interpretieren sein. Das ist bei Divisionen usw zu beachten, C benötigt dafür eben Datentypen (unter ASM gibt ja keine).

Anhand des Algorithmus kannst Du schlussfolgern, welchen Typ die Zwischenergebnisse haben müssen.

Achtung, da wird viel geschoben (mehrbytige, große Variablen), andererseits auch viel dividiert (was bei ganzen Zahlen schnell null werden kann)
 
Wenn man sich aber mal die "Rohdaten (UT)" anschaut, sieht man das dieser Wert negativ ist.
Das kann doch wohl nicht sein oder ? Laut Datenblatt lese ich nicht das es negativ sein darf... Oder irre ich mich da mal wieder???:confused:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)