Implemented first Hangar-Service
Dependencies: CalibrateMagneto QuaternionMath
Fork of SML2 by
Diff: Barometer.cpp
- Revision:
- 46:fd5a62296b12
- Parent:
- 40:8e852115fe55
--- a/Barometer.cpp Wed May 27 11:45:00 2015 +0000 +++ b/Barometer.cpp Wed May 27 13:01:43 2015 +0000 @@ -14,56 +14,62 @@ } } -bool Barometer::powerOn() { +bool Barometer::powerOn() +{ write_reg(0xE0, 0xB6); // reset wait_ms(2); // cf. datasheet page 8, t_startup return read_reg(0xD0) == 0x58; // verify chip ID } -void Barometer::powerOff() { +void Barometer::powerOff() +{ // nothing to do } -void Barometer::start() { +void Barometer::start() +{ // reset our initial calibration nsamples = 0; sum = 0; avg = 0; - + // set parameters for Bosch-recommended "Indoor navigation" preset write_reg(0xF5, 0x10); // 0.5ms t_standby, IIR coefficient=16 write_reg(0xF4, 0x57); // 2x oversampling for temperature, 16x for pressure and power mode "normal" } -void Barometer::stop() { +void Barometer::stop() +{ write_reg(0xF4, 0x54); // keep the oversampling settings but set power mode to "sleep" } -Vector3 Barometer::read() { +Vector3 Barometer::read() +{ uint8_t buffer[6]; /* for (int i = 0; i < 6; i++) buffer[i] = read_reg(0xF7 + i); */ - + read_reg(0xF7, buffer, sizeof buffer); - + const uint32_t adc_P = ((buffer[0] << 16) | (buffer[1] << 8) | buffer[2]) >> 4; const uint32_t adc_T = ((buffer[3] << 16) | (buffer[4] << 8) | buffer[5]) >> 4; - + const float celsius = bmp280_val_to_temp(adc_T) - 20; // 20 degree offset (?) const float pa = bmp280_val_to_pa(adc_P); const float centimeter = pressureToAltitude(pa) * 100.0; - + if (++nsamples < 10) { sum += centimeter; avg = sum / nsamples; } - + return Vector3(celsius, pa, centimeter - avg); } -float Barometer::pressureToAltitude(const float pa) const { +float Barometer::pressureToAltitude(const float pa) const +{ return -44330.7692 * (pow(pa * 0.0000098692, 0.1902632365) - 1); } @@ -83,9 +89,9 @@ int16_t dig_P8; int16_t dig_P9; } cal_data; - + read_reg(0x88, (uint8_t*)&cal_data, sizeof cal_data); - + dig_T1 = cal_data.dig_T1; dig_T2 = cal_data.dig_T2; dig_T3 = cal_data.dig_T3;