嵌入式开发--温度、湿度、气压传感器BME280
1、芯片介绍
BME280是BOSCH的一颗低功耗的温度、湿度、气压传感器芯片,尺寸是2.5 mm x 2.5 mm x 0.93 mm,非常的小巧,同时支持I2C和SPI接口,
支持3种工作模式转换
上电之后是休眠状态。
对Mode[1:0]写入11,可以进入正常测量模式,芯片进行连续测量和读取测量数据。写入00可以返回休眠模式。
对Mode[1:0]写入01,则设置为强制模式,芯片进行一次测量,测量完成后进入休眠模式,可以通过数据接口读取寄存器,获取测量数据。
湿度测量的设置
对osrs_h[2:0]写入相关的数值,可以设置禁止测量或过采样,如下表
对osrs_h[2:0]写入000,会禁止湿度测量,或按上图测量过采样的值。
温度测量
对osrs_t[2:0]进行设置,与湿度类似
气压测量
对osrs_p[2:0]进行设置,与湿度类似
复位
对0xe0地址的寄存器写入0xb6,可以对芯片进行软复位。
读取ID
读取0xd0地址的寄存器可以获得芯片ID,应当为0x60。可以做为芯片通讯是否正常的判断依据。
测量状态指示status
measuring位,当自动转换进行时,该位自动置1。测量完成后,数据传输到寄存器后,该位置0。
可以通过读取该位,获得传感器状态,当为0时,可以正常读取传感器数据。
寄存器映射
全部寄存器的映射如下图,方框的颜色表示了不同的读写属性,具体含义可以阅读手册。
2 MCU的设置
我使用的是SPI2,SPI的参数设置如下:
3 软件编写
软件编写需要按照以下流程进行:
3.1 芯片复位
上电后发送reset指令
u8 BME280_Reset(void)
{bme280_tx_data[0] = BME280_REG_RESET;bme280_tx_data[1] = 0xb6;SPI2_CS(0);HAL_SPI_Transmit(&BME280_SPI, bme280_tx_data, 2, 100);
// HAL_SPI_Transmit(&BME280_SPI, (u8*)(0xb6), 1, 100);SPI2_CS(1);delay_us(100);return 0;
}
3.2 读取ID
以判断芯片是否工作正常
u8 BME280_Read_ID(void)
{bme280_tx_data[0] = BME280_REG_ID;SPI2_CS(0);// HAL_SPI_Transmit(&BME280_SPI, bme280_tx_data, 1, 100);
// HAL_SPI_Receive(&BME280_SPI, bme280_rx_data, 1, 100);HAL_SPI_TransmitReceive(&BME280_SPI, bme280_tx_data, bme280_rx_data, 2, 10);SPI2_CS(1);return bme280_rx_data[1];
}
3.3 读取补偿寄存器的数值,并转换为相应的补偿参数
Bosch在出厂时对每一个传感器都进行过校准,所以每一颗芯片的补偿参数都不一样,需要自行从芯片中读取。补偿的计算方法,在芯片手册中已经给出。
补偿寄存器共42个,位于2个连续的数据段中,
calib00~25,起始地址为0x88,终止地址为0xa1,共26个
calib26~41,起始地址为0xe1,终止地址为0xf0,共16个
当读取完全部的补偿寄存器后,需要将其组合成若干个校准参数
其中温度补偿有3个参数,T1~T3
气压补偿是9个,P1~P9
湿度补偿6个,H1~H6
注意最后一栏,有些是有符号数,有些是无符号数,不要弄错了
3.4设置功能寄存器
需要设置3个功能寄存器:ctrl_hum, ctrl_meas, config。
至此初始化过程结束,可以进行正常的数据采集了。
bme280_tx_data[0] = 0x7f & BME280_REG_CTRL_HUM;BME280_Write(bme280_tx_data[0], &ctrl_hum);bme280_tx_data[0] = 0x7f & BME280_REG_CTRL_MEAS;BME280_Write(bme280_tx_data[0], &ctrl_meas);bme280_tx_data[0] = 0x7f & BME280_REG_CONFIG;BME280_Write(bme280_tx_data[0], &config);
代码略,需要的自行下载文末代码。
3.5 读取寄存器
// 读取BME280的温度、湿度、气压数据
void BME280_Get_Temp_Hum_Press(void)
{u8 i;s32 t,h,p;static u8 data[8] = {0};//获取气压,温度,湿度for(i=0; i<8; i++){data[i] = BME280_Read_1_REG(0xf7+i);}//组合为温度湿度气压的原始数据t = data[3]<<12 | data[4]<<4 | data[5]>>4; h = data[6]<<8 | data[7]; p = data[0]<<12 | data[1]<<4 | data[2]>>4; //计算补偿后的温度湿度气压值bme280_temp = BME280_Compensate_s32_T(t); bme280_humi = (u32)(BME280_Compensate_s32_H(h)/10.24f);bme280_press= BME280_Compensate_s32_P(p);
}
3.6 计算补偿
对于STM32来说,可以使用32位定点计算,复杂度不高,速度快。
计算的过程需要使用初始化过程中已经设置好的补偿参数。
需要注意的是t_fine这个参数,它是根据温度值和补偿值计算出来的,不同的温度,对应着不同的t_fine值。所以t_fine需要在每次采集温度后重新计算。
也就是说,温度的测量是必须的,如果将其禁止不测的话,t_fine就无法计算了。
4 完整代码下载
代码是从项目中摘取的,所以不能发完整的工程代码,只提供BSP支持包,其实支持包已经足够使用了。
下载地址:BSP支持包下载