BMP280使用指南

简介

BMP280 - 气压传感器

在这里插入图片描述

背面

在这里插入图片描述

通信模式

  • I2C
  • SPI

Features

  • 单位写
  • 多位写
  • 单位读
  • 多位读

通讯模式选择

根据片选(CSB)引脚决定,如果CSB拉低,则采用SPI模式。注意,一旦CSB引脚被拉低后,SPI模式会一直开启,直到下一次重启硬件。

I2C通讯模式

  • SCL --> 时钟线
  • SDI --> 数据线
  • SDO --> 片地址的LSB(最低加权位)
  • CSB --> Vdd 拉高

写模式

写模式,通过Master写入从机地址开始0b111011x0(x时SDO决定的LSB)。

读模式

读模式的前提,需要通过写模式写入要读取的寄存器地址,然后通过0b111011x1读取输出的数据。

SPI通讯模式

SPI模式下,存在两种形式4线模式和3线模式。两种模式的协议是相同的。在寄存器spi3w_en设置为1的状态下,采用了3线模式,这种模式下SDI用于数据通讯。

  • SCL --> 时钟线
  • SDI --> 数据输入线;三线模式下为双向数据线
  • SDO --> 数据输出线; 3线模式下无用
  • CSB --> 片选引脚,拉低后启用

spi状态下,与i2c有些不同,因为无法通过地址位指定读写模式,因此,只能采用把读写模式放置在寄存器地址位中的模式来进行读写操作。

写模式

把寄存器地址为的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

测量流程

YES
NO
YES
NO
开始测量
测量温度
测量气压
滤波器开启
滤波器初始化
将ADC中的值拷贝到内存中
使用滤波器的更新内存
把内存值拷贝到输出寄存器中
结束测量

压强测量

压强测量是可选功能,在不启用的状态下,可以将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 filter

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

电流消耗

电流消耗取决于ODR和过采样设定。

过采样 压力过采样 温度过采样 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

ctrl_meas 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] 控制电流的模式

config 0xF5

配置寄存器用于控制采样率,滤波器模式和通讯模式。

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表示开启

press(_msb, _lsb, _xlsb) 0xF70xF9

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

temp(_msb, _lsb, _xlsb) 0xFA0xFC

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

猜你喜欢

转载自blog.csdn.net/m0_37964621/article/details/111407489