首页 > 编程知识 正文

高度越高大气压强,大气压力传感信号故障

时间:2023-05-04 20:27:59 阅读:277068 作者:4254

GY-BMP280-3.3 高精度大气压强传感器模块

转载于:https://blog.csdn.net/sunshinebooming/article/details/79637822

博世Sensortec - BMP280 是一种专为移动应用设计的绝对气压传感器。该传感器模块采用极其紧凑的封装。得益于小尺寸和低功耗特性,这种器件可用在如移动电话、GPS 模块或手表等电池供电型设备中。与上代产品相同,BMP180、BMP280 也基于Bosch 成熟的压阻式压力传感器技术,具有高确度和线性度,以及长期稳定性和很高的 EMC 稳健性。多种设备工作选择带来了最高灵活性,可以在功耗、分辨率和滤波性能方面对设备进行优化。

BMP280是博世最新推出的数字气压传感器,具有卓越的性能和低廉的价格,相对精度为±0.12 hPa(相当于±1米),传感器功耗仅有2.7μA。BMP280具有业界最小封装,采用极其紧凑的8引脚金属盖LGA封装,占位面积仅为2.0×2.5mm2,封装高度为0.95 mm。包括有压力和温度测量功能。该气压传感器支持SPI和IIC通信接口,相比上一代的BMP180,精度已有相当大的提升,非常适合应用于低成本的多旋翼飞行器飞行控制器上,价格仅有目前流行的MS5611的四分之一。传感器模块它的小尺寸和2.74μA@ 1Hz的低功耗允许在电池驱动的设备中实现。门内导航,医疗保健以及GPS改进的新兴应用需要高相对精度和低TCO。
————————————————
BMP280非常适用于地板水平检测等应用,因为传感器具有±0.12 hPa的优异相对精度,相当于±1m高度差,偏移温度系数(TCO)仅为1.5 Pa / K(相当于12.6厘米/ K)。作为广泛实施的BMP180的继承者,BMP280最初在2011年开始大量使用手机中的气压测量,BMP280在所有需要精确压力测量的应用中实现了高性能。同时,BMP280具有更高的应用灵活性,新的滤波器模式和SPI接口,而且相对于BMP180,占位面积缩小了63%。

目录

单片机 BMP280大气压强与温度传感器使用详解 目录 模块引脚及相关参数相关寄存器说明数据处理基本过程测量的基本流程STC8A8K64S4A12单片机程序(51单片机,STM32等改一下就行了)


模块引脚及相关参数 本次使用的模块型号为GY-BM E/P 280,淘宝上到处可以买到,这是对德国博世公司的BMP280芯片的一个应用封装(实物图片和封装基本电路都放在下面)。采用的主控芯片为STC8A8K64S4A12单片机,所以写的代码都是最底层的,比较适合愉快的钥匙看(代码贴在后面)。引脚说明:
Pin1:VCC(3.3V供电)
Pin2:GND
Pin3:SCL(I2C通信模式时钟信号)
Pin4:SDA(I2C通信模式数据信号)
Pin5:CSB(SPI通信模式下用到的引脚,本次没用到,可以悬空)
Pin6:SDO(传感器地址控制位,接GND的时候I2C中器件地址为0xEC,接高电平为0xEC+ 1,本次接GND)传感器测试范围:
温度:-45℃~+85℃
大气压强:0~20000hPa(百帕)测量主要模式:
Sleep Mode:作电流达到uA级别,典型值为0.1uA,最大值为0.3uA,所有测量工作都停止。
Normal Mode: 正常工作,相关工作间隔时间可以通过寄存器控制。
Forced Mode:主控发起一次采集命令,传感器采集一次信号,然后进入Sleep Mode,等待下次唤起(本次没用到)。


相关寄存器说明

BMP280传感器内部所有寄存器及其地址如下图所示:

测量控制寄存器(ctrl_meas)(0xF4):
Bit7~Bit5:osrs_t[2:0] 控制温度采样模式,主要是采样数据的位数(位数越大,精度越高),具体配置如下(本次三位都配置为1,最大采样位数20Bit):

Bit4~Bit2:osrs_p[2:0] 控制大气压强采样模式,主要是采样数据的位数(位数越大,精度越高),具体配置如下(本次三位都配置为1,最大采样位数20Bit):

Bit1~Bit0:mode[1:0] 传感器工作模式控制,00为Sleep Mode,01/10为Forced Mode,11为 Normal Mode(本次配置为11)。配置寄存器(config)(0xF5):
Bit7~Bit5:t_sb[2:0] 设置Normal Mode下的转换间隔时间,具体配置如下(本次配置为000,0.5ms转换一次)

Bit4~Bit2:filter[2:0] 设置传感器接收外界信号时的,前端滤波电路的滤波系数的,我也没仔细研究,就设置了个000,有兴趣的童鞋可以自己研究一下,datasheet上说和稳定度有关,可以有效减少外界环境的干扰:

Bit0:spi3w_en 与SPI模式有关,本次没用到,没设置。身份编号寄存器(id)(0xD0):
寄存器内固定值为0x58,读取0xD0数据的时候,传感器返回0x58,代表身份辨认完毕。复位寄存器(reset)(0xE0):
写入0xB6时,所有寄存器(除身份编号寄存器)数据全部清零。状态寄存器(status)(0xF3):
具体定义如下,感兴趣的童鞋自己研究,本次没用到:

数据处理基本过程

该传感器是使用测量值和校准值(初始化中获得),通过公式计算得出的,相关公式在datasheet中已经贴出了,还给了样本数据(公式挺复杂的,建议先把公式抄到程序中,然后用样本数据传进去,测试一遍结果对不对,保证公式没抄错)。
数据处理中有个坑,请注意,就是读取补偿值数据的时候,下图的数据存储位是LSB/MSB,即数据是反过来存储的,低位字节在前,高位字节在后,所以处理数据的时候要注意,具体可以见我的代码中bmp280_MultipleReadTwo()函数:

公式的话,datasheet中也很模糊,配合datasheet中的图片,凑合看吧:

long bmp280_GetValue(void){ long adc_T; long adc_P; long var1, var2, t_fine, T, p; adc_T = bmp280_MultipleReadThree(BMP280_TEMP_ADDR); adc_P = bmp280_MultipleReadThree(BMP280_PRESS_ADDR); if(adc_P == 0) { return 0; } //Temperature var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2); var2 = ((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T) /131072.0-((double)dig_T1)/8192.0))*((double)dig_T3); t_fine = (unsigned long)(var1+var2); T = (var1+var2)/5120.0; //Pressure var1 = ((double)t_fine/2.0)-64000.0; var2 = var1*var1*((double)dig_P6)/32768.0; var2 = var2 +var1*((double)dig_P5)*2.0; var2 = (var2/4.0)+(((double)dig_P4)*65536.0); var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0; var1 = (1.0+var1/32768.0)*((double)dig_P1); p = 1048576.0-(double)adc_P; p = (p-(var2/4096.0))*6250.0/var1; var1 = ((double)dig_P9)*p*p/2147483648.0; var2 = p*((double)dig_P8)/32768.0; p = p+(var1+var2+((double)dig_P7))/16.0; return p;}
测量的基本流程 初始化
包括I2C初始化(和传感器通信用),串口初始化(和上位机通信用,查看数据),传感器初始化,两个通信协议就不说了,不会的童鞋可以先去看看相关教程,下面主要说说传感器初始化: 数据全部清零:写数据0xB6到地址0xE0;读芯片ID:读地址0xD0;设置测量控制寄存器:写数据0xFF到地址0xF4(测量数据位20Bit,Normal Mode);设置配置寄存器:写数据0x00到地址0xF5(测量间隔时间0.5ms,滤波器我没仔细看,感兴趣童鞋自己研究);读取补偿值数据I2C循环读取传感器参数,代入公式计算获得结果,并且将结果通过串口输出到上位机。

 代码下载(可直接使用):https://download.csdn.net/download/qq_42043397/25136098

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。