Ср мар 01, 2017 11:42:57
typedef struct _bmp280_cp
{
u16 dig_t1;
s16 dig_t2;
s16 dig_t3;
u16 dig_p1;
s16 dig_p2;
s16 dig_p3;
s16 dig_p4;
s16 dig_p5;
s16 dig_p6;
s16 dig_p7;
s16 dig_p8;
s16 dig_p9;
s32 t_fine;
} bmp280_cal_parm;
u8 bmp280_init( void )
{
u8 com_rslt = 0;
u8 data = 0;
u8 adata[BMP280_CALIB_DATA_SIZE] =
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// Check ID
com_rslt |= i2c_read_reg
( BMP280_I2C_ADDRESS1,
BMP280_CHIP_ID_REG,
&data,
1 );
if ( ( data != BMP280_CHIP_ID1 ) &&
( data != BMP280_CHIP_ID2 ) &&
( data != BMP280_CHIP_ID3 ) )
return com_rslt |= ERROR_UNIT;
// Set power mode and oversampling
data = BMP280_NORMAL_MODE | BMP280_OVERSAMP_T2 | BMP280_OVERSAMP_P16;
com_rslt |= i2c_write_reg
( BMP280_I2C_ADDRESS1,
BMP280_CTRL_MEAS_REG,
&data,
1 );
// Set standby time and filter
data = BMP280_STANDBY_TIME_0_5_MS | BMP280_FILTER_COEFF_4;
com_rslt |= i2c_write_reg
( BMP280_I2C_ADDRESS1,
BMP280_CONFIG_REG,
&data,
1 );
// Get calibration parameters
com_rslt |= i2c_read_reg
( BMP280_I2C_ADDRESS1,
BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG,
adata,
BMP280_CALIB_DATA_SIZE );
bmp280_cp.dig_t1 = ( adata[BMP280_TEMPERATURE_CALIB_DIG_T1_MSB] << 8 ) |
adata[BMP280_TEMPERATURE_CALIB_DIG_T1_LSB];
bmp280_cp.dig_t2 = ( adata[BMP280_TEMPERATURE_CALIB_DIG_T2_MSB] << 8 ) |
adata[BMP280_TEMPERATURE_CALIB_DIG_T2_LSB];
bmp280_cp.dig_t3 = ( adata[BMP280_TEMPERATURE_CALIB_DIG_T3_MSB] << 8 ) |
adata[BMP280_TEMPERATURE_CALIB_DIG_T3_LSB];
bmp280_cp.dig_p1 = ( adata[BMP280_PRESSURE_CALIB_DIG_P1_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P1_LSB];
bmp280_cp.dig_p2 = ( adata[BMP280_PRESSURE_CALIB_DIG_P2_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P2_LSB];
bmp280_cp.dig_p3 = ( adata[BMP280_PRESSURE_CALIB_DIG_P3_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P3_LSB];
bmp280_cp.dig_p4 = ( adata[BMP280_PRESSURE_CALIB_DIG_P4_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P4_LSB];
bmp280_cp.dig_p5 = ( adata[BMP280_PRESSURE_CALIB_DIG_P5_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P5_LSB];
bmp280_cp.dig_p6 = ( adata[BMP280_PRESSURE_CALIB_DIG_P6_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P6_LSB];
bmp280_cp.dig_p7 = ( adata[BMP280_PRESSURE_CALIB_DIG_P7_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P7_LSB];
bmp280_cp.dig_p8 = ( adata[BMP280_PRESSURE_CALIB_DIG_P8_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P8_LSB];
bmp280_cp.dig_p9 = ( adata[BMP280_PRESSURE_CALIB_DIG_P9_MSB] << 8 ) |
adata[BMP280_PRESSURE_CALIB_DIG_P9_LSB];
return com_rslt;
}
u8 bmp280_get_pt_data( u32 *v_pressure, s32 *v_temperature )
{
u8 com_rslt = 0;
u8 adata[BMP280_TEMPERATURE_DATA_SIZE +
BMP280_PRESSURE_DATA_SIZE] = {0, 0, 0, 0, 0, 0};
s32 unc_pres = 0; // Uncompensate pressure
s32 unc_temp = 0; // Uncompensate temperature
s32 v_x1_u32r = 0;
s32 v_x2_u32r = 0;
// Read temperature and pressure raw data
com_rslt |= i2c_read_reg
( BMP280_I2C_ADDRESS1,
BMP280_PRESSURE_MSB_REG,
adata,
BMP280_TEMPERATURE_DATA_SIZE +
BMP280_PRESSURE_DATA_SIZE );
// Make signed integer value of temperature
unc_temp = ( ( adata[BMP280_TEMPERATURE_MSB_DATA] << 16 ) |
( adata[BMP280_TEMPERATURE_LSB_DATA] << 8 ) |
adata[BMP280_TEMPERATURE_XLSB_DATA] ) >> 4;
// Make signed integer value of pressure
unc_pres = ( ( adata[BMP280_PRESSURE_MSB_DATA] << 16 ) |
( adata[BMP280_PRESSURE_LSB_DATA] << 8 ) |
adata[BMP280_PRESSURE_XLSB_DATA] ) >> 4;
// Compensate temperature
// Calculate x1
v_x1_u32r = ( ( ( ( unc_temp >> 3 ) -
( (s32)bmp280_cp.dig_t1 << 1 ) ) ) *
( (s32)bmp280_cp.dig_t2 ) ) >> 11;
// Calculate x2
v_x2_u32r = ( ( ( ( ( unc_temp >> 4 ) -
( (s32)bmp280_cp.dig_t1 ) ) *
( ( unc_temp >> 4 ) -
( (s32)bmp280_cp.dig_t1 ) ) ) >> 12 ) *
( (s32)bmp280_cp.dig_t3 ) ) >> 14;
// Calculate t_fine
bmp280_cp.t_fine = v_x1_u32r + v_x2_u32r;
// Calculate temperature
*v_temperature = ( bmp280_cp.t_fine * 5 + 128 ) >> 8;
// Compensate pressure
// Calculate x1
v_x1_u32r = ( (s32)bmp280_cp.t_fine >> 1) - (s32)64000;
// Calculate x2
v_x2_u32r = ( ( (v_x1_u32r >> 2) *
(v_x1_u32r >> 2 ) ) >> 11)
* ( (s32)bmp280_cp.dig_p6 );
v_x2_u32r = v_x2_u32r +
( ( v_x1_u32r * ( (s32)bmp280_cp.dig_p5 ) ) << 1 );
v_x2_u32r = ( v_x2_u32r >> 2 ) + ( ( (s32)bmp280_cp.dig_p4 ) << 16 );
// Calculate x1
v_x1_u32r = ( ( ( bmp280_cp.dig_p3 *
( ( ( v_x1_u32r >> 2 ) *
( v_x1_u32r >> 2 ) ) >> 13 ) ) >> 3 ) +
( ( ( (s32)bmp280_cp.dig_p2 ) *
v_x1_u32r ) >> 1 ) ) >> 18;
v_x1_u32r = ( ( ( 32768 + v_x1_u32r ) *
( (s32)bmp280_cp.dig_p1 ) ) >> 15 );
// Calculate pressure
*v_pressure = ( ( (u32)( (s32)1048576 - unc_pres ) -
( v_x2_u32r >> 12 ) ) ) * 3125;
// Check overflow
if ( *v_pressure < 0x80000000 )
// Avoid exception caused by division by zero
if ( v_x1_u32r != 0 )
*v_pressure = ( *v_pressure << 1 ) / ( (u32)v_x1_u32r );
else
return com_rslt | ERROR_INV_DATA;
else
// Avoid exception caused by division by zero
if ( v_x1_u32r != 0 )
*v_pressure = ( *v_pressure / (u32)v_x1_u32r ) * 2;
else
return com_rslt | ERROR_INV_DATA;
// Calculate x1
v_x1_u32r = ( (s32)bmp280_cp.dig_p9 *
(s32)( ( ( *v_pressure >> 3 ) *
( *v_pressure >> 3 ) ) >> 13 ) ) >> 12;
// Calculate x2
v_x2_u32r = ( (s32)( *v_pressure >> 2 ) *
(s32)bmp280_cp.dig_p8 ) >> 13;
// Calculate true pressure
*v_pressure = (u32)( (s32)*v_pressure +
( ( v_x1_u32r +
v_x2_u32r +
bmp280_cp.dig_p7) >> 4 ) );
return com_rslt;
}
Пт апр 07, 2017 08:32:31
#define BMP280_PRESSURE_MSB_DATA 0
#define BMP280_PRESSURE_LSB_DATA 1
#define BMP280_PRESSURE_XLSB_DATA 2
#define BMP280_TEMPERATURE_MSB_DATA 3
#define BMP280_TEMPERATURE_LSB_DATA 4
#define BMP280_TEMPERATURE_XLSB_DATA 5
Ср ноя 22, 2017 11:01:34
//======================//
#define BMP280_ADDRESS 0x77 // SDO connect to Vdd
#define BMP280_R 0xEF // Read cmd
#define BMP280_W 0xEE // Write cmd
//======================//
//#define BMP280_ADDRESS 0x76 // SDO connect to GND
//#define BMP280_R 0xED // Read cmd
//#define BMP280_W 0xEC // Write cmd
//======================//
//=====Registers Addresses================//
#define BMP280_DIG_T1 0x88
#define BMP280_DIG_T2 0x8A
#define BMP280_DIG_T3 0x8C
#define BMP280_DIG_P1 0x8E
#define BMP280_DIG_P2 0x90
#define BMP280_DIG_P3 0x92
#define BMP280_DIG_P4 0x94
#define BMP280_DIG_P5 0x96
#define BMP280_DIG_P6 0x98
#define BMP280_DIG_P7 0x9A
#define BMP280_DIG_P8 0x9C
#define BMP280_DIG_P9 0x9E
#define BMP280_CHIP_ID 0xD0
#define BMP280_RESET_REG 0xE0
#define BMP280_CAL26 0xE1 // R calibration stored in 0xE1-0xF0
#define BMP280_STATUS 0xF3
#define BMP280_CTRL_MEAS 0xF4
#define BMP280_CONFIG 0xF5
#define BMP280_PRESSURE_MSB 0xF7
#define BMP280_PRESSURE_LSB 0xF8
#define BMP280_PRESSURE_XLSB 0xF9
#define BMP280_TEMPERATURE_MSB 0xFA
#define BMP280_TEMPERATURE_LSB 0xFB
#define BMP280_TEMPERATURE_XLSB 0xFC
Ср ноя 22, 2017 11:12:56
Ср ноя 22, 2017 13:09:46
Albert_V писал(а):Смотрите Figure3 или Figure4.
Ср ноя 22, 2017 13:24:18
Верно.serg_svd писал(а):POR - Power On Run? Подача питания?
Правильно.serg_svd писал(а):Write settings - Какие настройки записываются? Config и Ctrl_meas?
А вот тут уже вы поленились. Вбейте в поиск по документу osrs_t и osrs_p и посмотрите к чему это относится. Это НЕ настройка.serg_svd писал(а):Далее я не понял.
Ср ноя 22, 2017 14:40:59
Albert_V писал(а):А вот тут уже вы поленились. Вбейте в поиск по документу osrs_t и osrs_p и посмотрите к чему это относится. Это НЕ настройка.
Albert_V писал(а):Документация, на мой взгляд, сделана несколько через ....
Albert_V писал(а):Калибровочные данные можно считать один раз и хранить их в памяти или постоянно считывать вместе со значениями температуры и давления
Чт ноя 23, 2017 01:12:38
Тогда так:serg_svd писал(а):Переводчик говорит про регистр...
Скорее, "чтоб враг не догадался" или чтоб скачивали их "родные" библиотеки.serg_svd писал(а):По-моему документация написана для очень подготовленных инженеров и программистов.
Чт ноя 23, 2017 02:03:50
Чт ноя 23, 2017 02:29:56
Чт ноя 23, 2017 09:22:59
Чт ноя 23, 2017 09:27:29
Чт ноя 23, 2017 09:44:43
Чт ноя 23, 2017 09:54:50
Чт ноя 23, 2017 10:05:23
Albert_V писал(а):Не забудьте что в этом случае, до вычислений, значение давления надо будет разделить на 16, а температуру на 2.
Чт ноя 23, 2017 10:13:08
Нет. После oversampling-а на 16 вы получите число умноженное на 16.serg_svd писал(а):Это для облегчения вычислений?
Пт ноя 24, 2017 22:39:48
Albert_V писал(а):После oversampling-а на 16 вы получите число умноженное на 16.
Сб ноя 25, 2017 07:00:52
Поздравляю.serg_svd писал(а):В общем заработало.
Сб ноя 25, 2017 11:02:42
Сб ноя 25, 2017 11:14:55