26 #define FBM320_REG_ID 0x6B 27 #define FBM320_REG_DATA 0xF6 28 #define FBM320_REG_CMD 0xF4 30 #define FBM320_CMD_READ_T 0x2E 31 #define FBM320_CMD_READ_P 0xF4 33 #define FBM320_WHOAMI 0x42 49 if (!sensor || !sensor->
init()) {
64 for (uint8_t i=0; i<9; i++) {
71 R[i] = ((uint8_t)tmp[0] << 8 | tmp[1]);
80 R[9] = ((uint8_t)tmp[0] << 8) | tmp[1];
116 printf(
"FBM320 ID 0x%x\n", whoami);
141 int32_t DT, DT2, X01, X02, X03, X11, X12, X13, X21, X22, X23, X24, X25, X26, X31, X32, CF, PP1, PP2, PP3, PP4;
143 DT = ((UT - 8388608) >> 4) + (cal.
C0 << 4);
144 X01 = (cal.
C1 + 4459) * DT >> 1;
145 X02 = ((((cal.
C2 - 256) * DT) >> 14) * DT) >> 4;
146 X03 = (((((cal.
C3 * DT) >> 18) * DT) >> 18) * DT);
148 temperature = ((2500 << 15) - X01 - X02 - X03) >> 15;
150 DT2 = (X01 + X02 + X03) >> 12;
151 X11 = ((cal.
C5 - 4443) * DT2);
152 X12 = (((cal.
C6 * DT2) >> 16) * DT2) >> 2;
153 X13 = ((X11 + X12) >> 10) + ((cal.
C4 + 120586) << 4);
155 X21 = ((cal.
C8 + 7180) * DT2) >> 10;
156 X22 = (((cal.
C9 * DT2) >> 17) * DT2) >> 12;
157 X23 = (X22 >= X21) ? (X22 - X21) : (X21 - X22);
159 X24 = (X23 >> 11) * (cal.
C7 + 166426);
160 X25 = ((X23 & 0x7FF) * (cal.
C7 + 166426)) >> 11;
161 X26 = (X21 >= X22) ? (((0 - X24 - X25) >> 11) + cal.
C7 + 166426) : (((X24 + X25) >> 11) + cal.
C7 + 166426);
163 PP1 = ((UP - 8388608) - X13) >> 3;
164 PP2 = (X26 >> 11) * PP1;
165 PP3 = ((X26 & 0x7FF) * PP1) >> 11;
166 PP4 = (PP2 + PP3) >> 10;
168 CF = (2097152 + cal.
C12 * DT2) >> 3;
169 X31 = (((CF * cal.
C10) >> 17) * PP4) >> 2;
170 X32 = (((((CF * cal.
C11) >> 15) * PP4) >> 18) * PP4);
172 pressure = ((X31 + X32) >> 15) + PP4 + 99880;
183 int32_t
value = ((uint32_t)buf[0] << 16) | ((uint32_t)buf[1] << 8) | (uint32_t)buf[2];
struct AP_Baro_FBM320::fbm320_calibration calibration
int printf(const char *fmt,...)
static AP_Baro_Backend * probe(AP_Baro &baro, AP_HAL::OwnPtr< AP_HAL::Device > dev)
virtual PeriodicHandle register_periodic_callback(uint32_t period_usec, PeriodicCb)=0
void _copy_to_frontend(uint8_t instance, float pressure, float temperature)
uint8_t register_sensor(void)
virtual AP_HAL::Semaphore * get_semaphore()=0
#define HAL_SEMAPHORE_BLOCK_FOREVER
virtual bool take(uint32_t timeout_ms) WARN_IF_UNUSED=0
#define FBM320_CMD_READ_P
bool read_calibration(void)
virtual bool take_nonblocking() WARN_IF_UNUSED=0
static AP_HAL::OwnPtr< AP_HAL::Device > dev
AP_HAL::OwnPtr< AP_HAL::Device > dev
virtual bool set_speed(Speed speed)=0
AP_Baro_FBM320(AP_Baro &baro, AP_HAL::OwnPtr< AP_HAL::Device > dev)
bool pressure_ok(float press)
#define FBM320_CMD_READ_T
bool read_registers(uint8_t first_reg, uint8_t *recv, uint32_t recv_len)
#define FUNCTOR_BIND_MEMBER(func, rettype,...)
bool write_register(uint8_t reg, uint8_t val, bool checked=false)
void calculate_PT(int32_t UT, int32_t UP, int32_t &pressure, int32_t &temperature)