简介 BMP280 - 气压传感器
文章图片
背面
文章图片
通信模式
- I2C
- SPI
- 单位写
- 多位写
- 单位读
- 多位读
根据片选(CSB)引脚决定,如果CSB拉低,则采用SPI模式。注意,一旦CSB引脚被拉低后,SPI模式会一直开启,直到下一次重启硬件。
I2C通讯模式
- SCL --> 时钟线
- SDI --> 数据线
- SDO --> 片地址的LSB(最低加权位)
- CSB --> Vdd 拉高
0b111011x0
(x时SDO决定的LSB)。读模式 读模式的前提,需要通过写模式写入要读取的寄存器地址,然后通过
0b111011x1
读取输出的数据。SPI通讯模式
SPI模式下,存在两种形式4线模式和3线模式。两种模式的协议是相同的。在寄存器
spi3w_en
设置为1的状态下,采用了3线模式,这种模式下SDI用于数据通讯。- SCL --> 时钟线
- SDI --> 数据输入线; 三线模式下为双向数据线
- SDO --> 数据输出线; 3线模式下无用
- CSB --> 片选引脚,拉低后启用
写模式 把寄存器地址为的bit7设定为0。如要写地址
0b11110100
则把bit 7 转为 0,也就指定了写模式,这时候spi写入的寄存器地址为0b01110100
,变换的就是bit 7 为,用它指定RW模式。读模式 和写模式相同,只要把寄存器地址写入设备,就可以读取到寄存器的数据。
数据采集注意 微调参数
每一个BMP280设备都存在一定的微调参数,这些微调参数在设备生产过程中,就已经被写入到设备的NVM中,并且不支持客户进行修改,在计算采集的温度数据时,都应该通过微调参数的调整。
寄存器LSB/MSB | 寄存器内容 | 数据类型 |
---|---|---|
0x88/0x89 | dig_T1 | unsigned short |
0x8A/0x8B | dig_T2 | signed short |
0x8C/0x8D | dig_T2 | signed short |
0x8E/0x8F | dig_P1 | unsigned short |
0x90/0x91 | dig_P2 | signed short |
0x92/0x93 | dig_P3 | signed short |
0x94/0x95 | dig_P4 | signed short |
0x96/0x97 | dig_P5 | signed short |
0x98/0x99 | dig_P6 | signed short |
0x9A/0x9B | dig_P7 | signed short |
0x9C/0x9D | dig_P8 | signed short |
0x9E/0x9F | dig_P9 | signed short |
0xA0/0xA1 | reserved | reserved |
采集到的微调数据 | |||
---|---|---|---|
寄存器地址 | 命名 | 数据 | 数据类型 |
0x88/0x89 | dig_T1 | 27504 | unsigned short |
0x8A/0x8B | dig_T2 | 26435 | short |
0x8C/0x8D | dig_T3 | -1000 | short |
0x8E/0x8F | dig_P1 | 36477 | unsigned short |
0x90/0x91 | dig_P2 | -10686 | short |
0x92/0x93 | dig_P3 | 3024 | short |
0x94/0x95 | dig_P4 | 2855 | short |
0x96/0x97 | dig_P5 | 140 | short |
0x98/0x99 | dig_P6 | -7 | short |
0x9A/0x9B | dig_P7 | 15500 | short |
0x9C/0x9D | dig_P8 | -14600 | short |
0x9E/0x9F | dig_P9 | 6000 | short |
采集到的测量数据 | |||
寄存器地址(MSB/LSB/XLSB) | 名称 | 数值 | 类型 |
0xF7/0xF8/0xF9(7:4) | UT[20 bit] | 519888 | signed long |
0xFA/0xFB/0xFC(7:4) | UP[20 bit] | 415148 | signed long |
int32_t var1, var2, T;
var1 = (((adc_T >> 3) - ((int32_t)dig_T1 << 1)) * ((int32_t)dig_T2)) >> 11;
var2 = (((((adc_T >> 4) - ((int32_t)dig_T1)) * ((adc_T >> 4) - ((int32_t)dig_T1))) >> 12) * ((int32_t)dig_T3)) >> 14;
t_fine = var1 + var2;
T = (t_fine * 5 + 128) >> 8;
变量名 | 变量值 | 描述 | 算法 |
---|---|---|---|
var1 | 128793.1787 | var1 = … | |
var2 | -370.8917052 | var2 = … | |
t_fine | 128422 | t_fine = … | |
T | 25.08 | 温度数据 | T = … |
int32_t var1, var2, p;
var1 = ((double)t_fine) - 128000;
var2 = var1 * var1 * (double)dig_P6;
var2 = var2 + ((var1 * (double)dig_P5) << 17);
var2 = var2 + (((double)dig_P4) << 35);
var1 = ((var * var1 * (double)dig_P3) >> 8) + ((var1 * (double)dig_P2) << 12);
var1 = (((double)1) << 47) + var1) *((double)dig_P1) >> 33;
p = 1048576 - adc_P;
p = ((p << 31) - var2_ * 3125) / var1;
var1 = (((double)dig_P9) * (p >> 13) * (p >> 13)) >> 25;
var2 = (((double)dig_P8) * p) >> 19;
p = ((p + var1 + var2) >> 8) + (((double)dig_P7) << 4);
变量名 | 变量值 | 描述 | 算法 |
---|---|---|---|
var1 | 211.1435929 | var1=… | |
var2 | -9.523652701 | var2=… | |
var2 | 59110.65716 | var2=… | |
var2 | 187120057.7 | var2=… | |
var1 | -4.302618389 | var1=… | |
var1 | 36472.21037 | var1=… | |
p | 633428 | p=… | |
p | 100717.8456 | p=… | |
var1 | 28342.24444 | var1=… | |
var2 | -44875.50492 | var2=… | |
p | 100653.27 | p=… |
- 采集气压数据
- 采集气温数据
- 温度范围 -40 ~ 85 度
- 压强范围 300 ~ 1100 hPa
- 电压范围 1.71 ~ 3.6 V
- sleep mode
- normal mode
- forced mode
压强测量是可选功能,在不启用的状态下,可以将BMP280当作温度传感器使用。而模式由位于控制寄存器(0xF4)的
osrs_p[2:0]
位控制。过采样设定 | 压力过采样 | 压力分辨率 | 推荐的温度过采样 |
---|---|---|---|
Skiped | Skiped | - | 自定义 |
超低功耗 | x1 | 16bit / 2.62Pa | x1 |
低功耗 | x2 | 17bit / 1.31Pa | x1 |
标准分辨率 | x4 | 18bit / 0.66Pa | x1 |
高分辨率 | x8 | 19bit / 0.33Pa | x1 |
超高分辨率 | x16 | 20bit / 0.16Pa | x2 |
温度测量同样是可选的流程,然后同样有位于控制寄存器(0xF4)的
osrs_t[2:0]
进行控制。osrs_t[2:0] | 温度过采样 | 温度分辨率 |
---|---|---|
000 | Skiped | - |
001 | x1 | 16bit / 0.0050度 |
010 | x2 | 17bit / 0.0025度 |
011 | x4 | 18bit / 0.0012度 |
100 | x8 | 19bit / 0.0006度 |
101,110,111 | x16 | 20bit / 0.0003度 |
IIR滤波器由控制寄存器(0xF5)中的
filter[2:0]
进行设置。filter[2:0] | 滤波器系数 | 带宽 |
---|---|---|
000 | Off | Full |
001 | 2 | 0.223 x ODR |
010 | 4 | 0.092 x ODR |
011 | 8 | 0.042 x ODR |
100, others | 16 | 0.021 x ODR |
功耗模式 功耗模式由控制寄存器(0xF4)中的
mode[1:0]
进行设置。mode[1:0] | Mode |
---|---|
00 | Sleep Mode |
01,10 | Forced Mode |
11 | Normal Mode |
过采样 | 压力过采样 | 温度过采样 | 1Hz Forced Mode | |
---|---|---|---|---|
Typ | Max | |||
超低功耗 | x1 | x1 | 2.74 | 4.16 |
低功耗 | x2 | x1 | 4.17 | 6.27 |
默认分辨率 | x4 | x1 | 7.02 | 10.50 |
高精度 | x8 | x1 | 12.7 | 18.95 |
超高精度 | x16 | x2 | 24.8 | 36.85 |
内存分布
寄存器名称 | 地址 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|---|
temp_xlsb | 0xFC | temp_xlsb<7:4> | 0 | 0 | 0 | 0 | |||
temp_lsb | 0xFB | temp_lsb<7:0> | |||||||
temp_msb | 0xFA | temp_msb<7:0> | |||||||
press_xlsb | 0xF9 | press_xlsb<7:4> | 0 | 0 | 0 | 0 | |||
press_lsb | 0xF8 | press_lsb<7:0> | |||||||
press_msb | 0xF7 | press_msb<7:0> | |||||||
config | 0xF5 | t_sb[2:0] | filter[2:0] | spi3w_en[0] | |||||
ctrl_meas | 0xF4 | osrs_t[2:0] | osrs_p[2:0] | mode[1:0] | |||||
status | 0xF3 | measuring[0] | im_update[0] | ||||||
reset | 0xE0 | reset[7:0] | |||||||
id | 0xD0 | chip_id[7:0] |
- 控制寄存器 支持读写
- 数据寄存器 只读
- 状态寄存器 只读
- 重置寄存器 只写
- 标准数据 只读
id
0xD0
包含了芯片的身份标示码chip_id[7:0]
,上电复位后可读。reset
0xE0
软复位寄存器,如果写入0xB6
则设备使用完整的上电复位流程进行复位。如果写入其他值,则无效。读出值为0x00。status
0xF3
状态寄存器,包含了两个为的数据。状态寄存器 | 位名 | 描述 |
---|---|---|
Bit 3 | measuring[0] | 转换发生时设定为1,结果转存后转换为0 |
Bit 0 | im_update[0] | NVM数据拷贝时设定为1,拷贝结束后设置为0 |
0xF4
设备的运行状态寄存器ctrl_meas 寄存器 | 位名称 | 描述 |
---|---|---|
Bit 7, 6, 5 | osrs_t[2:0] | 控制温度的过采样 |
Bit 4, 3, 2 | osrs_p[2:0] | 控制气压的过采样 |
Bit 1, 0 | mode[1:0] | 控制电流的模式 |
0xF5
【技术实践类|BMP280使用指南】配置寄存器用于控制采样率,滤波器模式和通讯模式。config寄存器 | 位名 | 描述 |
---|---|---|
Bit 7, 6, 5 | t_sb[2:0] | 设定normal_mode下的无效时间 |
Bit 4, 3, 2 | filter[2:0] | 设定IIR滤波器 |
Bit 0 | spi3w_en[0] | spi通讯模式开启标志 1表示开启 |
0xF7
…0xF9
press寄存器 | 位名 | 描述 |
---|---|---|
0xF7 | press_msb[7:0] | 压力的msb部分 19:12 |
0xF8 | press_lsb[7:0] | 压力的lsb部分 11:4 |
0x F9 (bit 7, 6, 5, 4) | press_xlsb[3:0] | 压力的xlsb部分 3:0 |
0xFA
…0xFC
temp寄存器 | 位名 | 描述 |
---|---|---|
0xFA | temp_msb[7:0] | 温度的msb部分 19:12 |
0xFB | temp_lsb[7:0] | 温度的lsb部分 11:4 |
0xFC(bit 7, 6, 5, 4) | temp_xlsb[3:0] | 温度的xlsb部分 3:0 |
推荐阅读
- arduino|【毕业设计】基于arduino的蓝牙扫地机器人
- ESP32|[教程] ESP32+TFT+分光棱镜实现透明小电视
- 硬件|硬件篇(教你做STM32蓝牙小车(基于STM32F103ZET6))
- 半导体材料的国产替代,机遇与挑战并存!
- 紫光展锐解除楚庆CEO职务,内部员工爆料那些不为人知的内情!
- bmp|总监调岗至前台,企业被判赔偿26万,法院(“侮辱性调岗”违法!)
- 俄乌战争影响全球半导体材料供应,芯片成本恐上涨
- 凤姐如何变冰冰()
- 裸奔(哒咩!)