mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-04 23:18:28 -04:00
897d9a1c0b
the averaging array was using 16 bit numbers, but we are storing numbers with 19 significant bits. That caused overflow at high altitude, and some very interesting altitude graphs! Thanks to Michael Oborne for spotting this in a log
60 lines
1.2 KiB
C++
60 lines
1.2 KiB
C++
/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
|
#ifndef __AP_BARO_BMP085_H__
|
|
#define __AP_BARO_BMP085_H__
|
|
|
|
#define TEMP_FILTER_SIZE 4
|
|
#define PRESS_FILTER_SIZE 8
|
|
|
|
#include "AP_Baro.h"
|
|
|
|
class AP_Baro_BMP085 : public AP_Baro
|
|
{
|
|
public:
|
|
AP_Baro_BMP085(bool apm2_hardware):
|
|
_temp_index(0),
|
|
_press_index(0),
|
|
_apm2_hardware(apm2_hardware){}; // Constructor
|
|
|
|
|
|
/* AP_Baro public interface: */
|
|
bool init(AP_PeriodicProcess * scheduler);
|
|
uint8_t read();
|
|
int32_t get_pressure();
|
|
int16_t get_temperature();
|
|
float get_altitude();
|
|
|
|
int32_t get_raw_pressure();
|
|
int32_t get_raw_temp();
|
|
|
|
private:
|
|
int32_t RawPress;
|
|
int32_t _offset_press;
|
|
int32_t RawTemp;
|
|
int16_t Temp;
|
|
uint32_t Press;
|
|
bool _apm2_hardware;
|
|
|
|
|
|
// State machine
|
|
uint8_t BMP085_State;
|
|
// Internal calibration registers
|
|
int16_t ac1, ac2, ac3, b1, b2, mb, mc, md;
|
|
uint16_t ac4, ac5, ac6;
|
|
|
|
int16_t _temp_filter[TEMP_FILTER_SIZE];
|
|
int32_t _press_filter[PRESS_FILTER_SIZE];
|
|
int32_t _offset_temp;
|
|
|
|
uint8_t _temp_index;
|
|
uint8_t _press_index;
|
|
uint32_t _retry_time;
|
|
|
|
void Command_ReadPress();
|
|
void Command_ReadTemp();
|
|
void ReadPress();
|
|
void ReadTemp();
|
|
void Calculate();
|
|
};
|
|
|
|
#endif // __AP_BARO_BMP085_H__
|