电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
可以计算海拔高度的BMP180气压传感器,你会使用吗?
分 享
扫描二维码分享
可以计算海拔高度的BMP180气压传感器,你会使用吗?
BMP180
气压传感器
海拔高度
嵌入式从0到1
关注
发布时间: 2021-03-11
丨
阅读: 1097
需要测量大气压力和温度的朋友可以玩玩BMP180这个传感器。 这款传感器出自博世,应用非常广泛! ### 实现目标 * 使用普通IO口模拟IIC总线驱动BMP180传感器 * 利用核心板的串口1打印输出当前温度、气压和海拔高度 ### 所需工具及环境 * 所用模块 ![](https://img-blog.csdnimg.cn/2021030321180548.png) * Keil 5 * STM32F103RET6核心板PCB工程文件(本平台自制专用核心板) * 面包板及少许杜邦线 ## 传感器简介 BMP180是Bosch(博世) Sensortec的一种高精度数字气压和温度传感器,使用BMP180可以测量环境温度、压力和高度的测量。BMP180的超低功耗,低电压电子元件经过优化,具有高精度和稳定性,适用于移动电话,PDA,GPS导航设备和户外设备。 它由压阻传感器、模数转换器,带E2PROM和串行I2C接口的控制单元组成。 BMP180传感器对压力和温度的原始数据测量必须使用校准数据补偿温度影响和其他参数保存到EEPROM中。 ![](https://img-blog.csdnimg.cn/20210303211831242.png) BMP180提供未补偿的原始压力值和温度值,在E2PROM中存储了176位的校准参数,使用这些参数可以补偿传感器的偏移量、温度依赖性等参数。 ## 传感器特点 BOSCH BMP180是测量压力和海拔高度最常用的传感器之一。该模块的特点如下: * 压力测量范围为300至1100hPa(海拔9000米 ~ -500米) * 芯片电压1.8V~3.6V(VDDA),1.62V~3.6V(VDD),模块的VIN输入5V(3.3V亦可) * 高精度:低功耗模式下,分辨率为0.06hPa(0.5米),高线性模式下,分辨率为0.03hPa(0.25米) * 低功耗(标准模式下为5μA) * 内部温度传感器,精度为0.5°C * 支持I2C协议进行通信 * 温度补偿,完全校准 > **注意**:1Pa=0.01hPa=0.01mbar 。 ## 应用场景 * GPS精准导航(航位推算,上下桥检测等) * 航模等一些需要高度数据的场合 * 天气预报 * 垂直速度指示(上升/下沉速度) ## 接线图 ### 实物图 ![](https://img-blog.csdnimg.cn/20210303211901546.png) ### 具体接线图 ![](https://img-blog.csdnimg.cn/20210303211916272.png) 在**myiic.h**文件中,具体引脚定义如下: ``` #define IIC_SCL PAout(6) //SCL #define IIC_SDA PAout(7) //输出SDA #define READ_SDA PAin(7) //输入SDA ``` ## 测量流程 ![](https://img-blog.csdnimg.cn/20210303211941136.png) UT =温度数据(16位) UP =压力数据(16到19位) ## 具体实现 ### 基础源码 ![](https://img-blog.csdnimg.cn/20210303212001898.png) ### 写入数据 #### 写入数据时序 开始测量温度值UT和压力值UP的时序图如下所示。在启动后,主机发送器件地址写入,寄存器地址和控制寄存器数据。当接收到数据时,BMP180每8个数据位发送一个确认(ACKS)。主机在最后一次ACKS后发送停止条件。 ![](https://img-blog.csdnimg.cn/20210303212018964.png) #### 设备地址 ![](https://img-blog.csdnimg.cn/20210303212035894.png) 写操作对应地址**0XEE**(write) 读操作对应地址**0XEF**(read) #### 相关寄存器 ![](https://img-blog.csdnimg.cn/2021030321205080.png) 开始温度和压力测量的寄存器地址为:**0xF4**; 寄存器**0xF4**的**bit5**为**Sco**,开始测量位,当该位为“1”的时候,数据正在转换,当转换结束的时候该位为“0”; 寄存器**0xF4**的**bit6~bit7**为**Oss**,用于控制压力测量的过采样率, (00b: single,01b: 2 times, 10b: 4 times, 11b: 8 times). 软件复位寄存器为:**0xE0**,如果该寄存器写入**0xB6**,则完成BMP180的软件复位; 芯片ID寄存器为:**0xD0**,该值固定位**0x55**,读出该值可以用于判断I2C总线通讯是否正常。 ### 多个字节的读取 ![](https://img-blog.csdnimg.cn/20210303212103526.png) ### 测量温度和压力 启动温度和压力测量的寄存器:**0xF4**,可以写入如下值: ![](https://img-blog.csdnimg.cn/20210303212118976.png) #### 测量温度 由上表我们可以知道,要想测量温度,需要往**0xF4**寄存器,写入值**0x2E**,即开启温度测量,延时之后,读取**0xF6**寄存器的值即可求得温度值。 ``` //从BMP180读取未修正的温度 long BMP_Read_UT(void) { long temp = 0; BMP_WriteOneByte(0xF4,0x2E); delay_ms(5); temp = (long)BMP_ReadTwoByte(0xF6); return temp; } ``` #### 测量压力 由上表我们可以知道,要想测量压力,需要往**0xF4**寄存器,写入值**0x34**(oss值不同此值不同),即开启压力测量过程,延时之后,读取**0xF6**寄存器的值即可求得压力值。 ``` //从BMP180读取未修正的大气压 long BMP_Read_UP(void) { long pressure = 0; BMP_WriteOneByte(0xF4,0x34); delay_ms(5); pressure = (long)BMP_ReadTwoByte(0xF6); pressure &= 0x0000FFFF; return pressure; } ``` ### 校准系数 Calibration coefficients 上面得到的温度值和压力值是未经过校准的值,如果要想得到相对准确的值,需要经过校准,校准系数保存在E2PROM中。 BMP180中有一个176位的E2PROM,它被划分为11个字(WORD),每个字16位,对应11个校准系数,每个传感器模块都有单独的系数,在第一次计算温度和压力时,主机读取E2PROM数据,通过读取的值,看是否存在值为0x0000或者0XFFFF的字,判断数据通讯是否正常。 ![](https://img-blog.csdnimg.cn/20210303212144576.png) 根据上图中寄存器的值,获取校准系数的函数如下,获得的校准系数保存至变量中待用: ``` //从BMP180的获取校准系数 void BMP_ReadCalibrationData(void) { bmp180.AC1 = BMP_ReadTwoByte(0xAA); bmp180.AC2 = BMP_ReadTwoByte(0xAC); bmp180.AC3 = BMP_ReadTwoByte(0xAE); bmp180.AC4 = BMP_ReadTwoByte(0xB0); bmp180.AC5 = BMP_ReadTwoByte(0xB2); bmp180.AC6 = BMP_ReadTwoByte(0xB4); bmp180.B1 = BMP_ReadTwoByte(0xB6); bmp180.B2 = BMP_ReadTwoByte(0xB8); bmp180.MB = BMP_ReadTwoByte(0xBA); bmp180.MC = BMP_ReadTwoByte(0xBC); bmp180.MD = BMP_ReadTwoByte(0xBE); } ``` ### 压力和温度的校准流程 ![](https://img-blog.csdnimg.cn/2021030321220562.png) ## 海拔高度的换算 BMP180传感器提供温度和压力的绝对测量值,但不提供海拔高度的直接输出。 由于大气压力随高度升高而降低。 ![](https://img-blog.csdnimg.cn/20210303212227301.png) 由上图我们可知,气压与海平面的高度具有近似线性的反比,因此如果我们测量某地的气压,我们可以使用简单的数学运算从海平面计算海拔高度。 ![](https://img-blog.csdnimg.cn/20210303212240863.png) 通过当地的气象服务中可以得到海平面压力P0,利用传感器读取的压力P和该海平面压力P0的值,通过下面的公式可以计算传感器所在位置的高度。 注意:**海平面压力P0**的值不是固定的,跟所属区域及环境温度和天气模式的变化而变化。 ## 结果展示 ![](https://img-blog.csdnimg.cn/2021030321225147.png) ## 欢迎关注 专注于嵌入式知识分享,让你学习路上不迷路,更多技术干货,请关注【嵌入式从0到1】。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
2
)
嵌入式从0到1
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交