Hi, Thanks for the replay. Yes, I do see absolute accuracy pressure errors of about 4hPa. I checked the issue on 5 different sensors. I used as reference two iPhones as well as a website that reports real time local presure. I can't send the full code it is few 100K lines of code. The relevant code is below. #define CntrlMeasDefault 0B10110111 //Temp OS 16X, Press OS 16x, Power Normal #define ConfigDefault 0B01010000 //Inactive 125ms, IIR Filter coefx16, SPI OFF s32 IS_BMP_Config() { s32 com_rslt = ERROR; u8 CntrlMes=CntrlMeasDefault; u8 Config= ConfigDefault; I2C_routine(); // Initiate a pointer to the I2C routine com_rslt = bme280_init(&bme280); // Read DeviceID and the compensation parameters. com_rslt=bme280_write_register(BME280_CTRL_MEAS_REG,CntrlMes,(u8)1); com_rslt+=bme280_write_register(BME280_CONFIG_REG,Config,(u8)1); HAL_Delay(100); Read_Config_Reg(); return com_rslt; } s32 Get_BMP280_Bridge_Data(s32 *v_data_uncomp_temp_s32 ,s32 *v_data_uncomp_pres_s32) { s32 com_rslt = BME280_INIT_VALUE; com_rslt = bme280_read_uncomp_temperature(v_data_uncomp_temp_s32); com_rslt += bme280_read_uncomp_pressure(v_data_uncomp_pres_s32); return com_rslt; } double IS_Compensate_Pressure(s32 v_uncomp_pressure_s32) { double var1, var2; int8_t rslt=BMP280_OK; double pressure=0; //rslt = null_ptr_check(dev); if (rslt == BMP280_OK) { var1 = ((double) p_bme280->cal_param.t_fine / 2.0) - 64000.0; var2 = var1 * var1 * ((double) p_bme280->cal_param.dig_P6) / 32768.0; var2 = var2 + var1 * ((double) p_bme280->cal_param.dig_P5) * 2.0; var2 = (var2 / 4.0) + (((double) p_bme280->cal_param.dig_P4) * 65536.0); var1 = (((double)p_bme280->cal_param.dig_P3) * var1 * var1 / 524288.0 + ((double)p_bme280->cal_param.dig_P2) * var1) / 524288.0; var1 = (1.0 + var1 / 32768.0) * ((double) p_bme280->cal_param.dig_P1); pressure = 1048576.0 - (double)v_uncomp_pressure_s32; if (var1 < 0 || var1 > 0) { pressure = (pressure - (var2 / 4096.0)) * 6250.0 / var1; var1 = ((double)p_bme280->cal_param.dig_P9) * (pressure) * (pressure) / 2147483648.0; var2 = (pressure) * ((double)p_bme280->cal_param.dig_P8) / 32768.0; pressure = pressure + (var1 + var2 + ((double)p_bme280->cal_param.dig_P7)) / 16.0; } else { pressure = 0; rslt = BMP280_E_DOUBLE_COMP_PRESS; } } return pressure; } /* * returns altitude in meters based on pressure and standard seaLevelpressure, both in hPa * standard seaLevelhPa = 1013.25 */ float Get_Altitude(float Pressure) { return (float)44330 * (1.0 - pow(Pressure / 1013.25, 0.19026)); // From feet converted to [M] }
... View more