Friday, April 30, 2010

BMP085 C Code for ARM Processor

I have debugged this code for the BMP085 pressure and temperature sensor.

(Note: I found this but do not yet have source: More precise calcs)

The examples in the data sheet assume an incorrect C operartor order.

Also in Arduino kits the int is a short and a long is a 32 bit int.

On my processor ( LM3S1607 ) an int is 32 bits.

So in this code everything is an int or unsigned int. Never short or unsigned short.

Also Arduino example code assumes the oversampling to be 0 and here we can set it to higher resolution.

The b3 = ... is where parenthesis are needed to get it right.

Enjoy.



int x1, x2, x3, b3, b5, b6, p;

unsigned int b4, b7;


x1 = ((BaroState.rawTemperature - Baro_ac6) * Baro_ac5) >> 15;
x2 = (Baro_mc << b5 =" x1" temperaturetenthc =" (b5">> 4;

b6 = b5 - 4000;
x1 = (Baro_b2 * (b6 * b6 >> 12)) >> 11;
x2 = Baro_ac2 * b6 >> 11;
x3 = x1 + x2;
// Error in the BMP085 spec sheet math.  Extra parens needed at the V's
//    V                              V
b3 = (((Baro_ac1 * 4 + x3) << Baro_oss) + 2) >> 2;
x1 = Baro_ac3 * b6 >> 13;
x2 = (Baro_b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (Baro_ac4 * (x3 + 32768)) >> 15;
b7 = (BaroState.rawPressure - b3) * (50000 >> Baro_oss);
p = b7 < x1 =" (p">> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
BaroState.pressurePa = p + ((x1 + x2 + 3791) >> 4);
NavState.baro = BaroState.pressurePa;