BMP180气压传感器详解与示例(STM32 附带源码)
BMP180气压传感器详解与示例(STM32 附带源码)
- 简介
- 工作模式
- 校准数值
- 测试流程
- 第一步:微处理器读取校准数值
- 第二步:读取温度、气压初始值
- 第三步:计算温度、气压
- 第四步:计算海拔高度
- 测试结果
- 获取工程源码
简介
BMP180是一款高精度的气压传感器,具有低功耗、低噪声等特点,广泛使用在气压、海拔测量。其内部附带温度传感器,可对气压测量值进行补偿,使用I2C通信方式。此次用到的器件有:STM32最小系统板、BMP180气压传感器模块。
工作模式
BMP180共有四种工作模式,每种模式有不同的采样数量、转换速度和噪声等参数的不同。可以通过写入ctrl_meas寄存器来设置模式,默认为第一个ultra low power超低功耗。
校准数值
BMP180的气压和温度数值并不是可以直接读取的,每个不同的传感器中,都有自己独特的校准数值,存储在内置的E2PROM存储器中。当微处理器读取传感器的原始温度和气压数值后,再根据E2PROM中的校准数值进行转换,才能得到真正的温度、气压数据。每个校准数值的存储位置如下,微处理器通过这些地址读取校准数值。
测试流程
工程建立非常简单,使用STM32CubeMX直接生成,只用到了I2C通信和串口显示结果。配置图如下
第一步:微处理器读取校准数值
把16位的校准数值读取到微处理器中,可以看到一共有11个数值。需要注意的是高位存储在MSB地址,低位存储在LSB地址。例如数值AC1,高八位存储在0xAA地址,低八位存储在0xAB地址。
void bmp180_get_cal_param(){bmp_param.AC1 = Reg_Read16(EEPROM_ADDR_MSB[0],EEPROM_ADDR_LSB[0]);bmp_param.AC2 = Reg_Read16(EEPROM_ADDR_MSB[1],EEPROM_ADDR_LSB[1]);bmp_param.AC3 = Reg_Read16(EEPROM_ADDR_MSB[2],EEPROM_ADDR_LSB[2]);bmp_param.AC4 = Reg_Read16(EEPROM_ADDR_MSB[3],EEPROM_ADDR_LSB[3]);bmp_param.AC5 = Reg_Read16(EEPROM_ADDR_MSB[4],EEPROM_ADDR_LSB[4]);bmp_param.AC6 = Reg_Read16(EEPROM_ADDR_MSB[5],EEPROM_ADDR_LSB[5]);bmp_param.B1 = Reg_Read16(EEPROM_ADDR_MSB[6],EEPROM_ADDR_LSB[6]);bmp_param.B2 = Reg_Read16(EEPROM_ADDR_MSB[7],EEPROM_ADDR_LSB[7]);bmp_param.MB = Reg_Read16(EEPROM_ADDR_MSB[8],EEPROM_ADDR_LSB[8]);bmp_param.MC = Reg_Read16(EEPROM_ADDR_MSB[9],EEPROM_ADDR_LSB[9]);bmp_param.MD = Reg_Read16(EEPROM_ADDR_MSB[10],EEPROM_ADDR_LSB[10]);
}
第二步:读取温度、气压初始值
温度初始值读取步骤:(1)往寄存器0xf4写入0x2e,等待4、5ms;(2)读0xf6(高八位)和0xf7(低八位)两个寄存器;(3)进行换算: UT=MSB <<8 +LSB。
气压初始值读取步骤:(1)往寄存器0xf4写入0x34(如果不是默认的工作模式,需要加上oss左移六位的结果,oss为设置工作模式的寄存器0xf4的bit7、bit6位),等待4、5ms;(2)读0xf6(16-23位)、0xf7(8-15位)和0xf8(0-7位)三个寄存器;(3)进行换算: UP=MSB <<16 + LSB<<8 + XLSB >> (8-oss(这个同温度初始值读取一样))。
UT读取
uint8_t data = 0x2e;HAL_I2C_Mem_Write (&hi2c1 ,DEVICE_ADDER ,CTRL_MEAS ,1,&data ,1,1000); HAL_Delay(10); int32_t UT = Reg_Read16(0xf6,0xf7);
UP读取
data = 0x34;HAL_I2C_Mem_Write (&hi2c1 ,DEVICE_ADDER ,CTRL_MEAS ,1,&data ,1,1000);HAL_Delay(10);int32_t UP = Reg_Read32(0xf6,0xf7,0xf8) >> 8 ;
第三步:计算温度、气压
根据第一步读出来的校准系数和第二步读出来的UT、UP进行换算,最后得出来的T(温度,每个数值代表0.1摄氏度),p(气压,每个数值代表1帕)。具体过程如下图
温度换算
int32_t X1 = (UT-bmp_param.AC6)* bmp_param.AC5 >> 15;int32_t X2 = (bmp_param.MC << 11) / (X1 + bmp_param.MD);int32_t T = (X1 + X2 +8) >> 4 ;
气压换算(比较复杂)
int32_t B6 = X1 + X2 - 4000;X1 = (B6 * B6 >> 12) * bmp_param.B2 >> 11;X2 = bmp_param.AC2 * B6 >> 11;int32_t X3 = X1 + X2;int32_t B3 = (((bmp_param.AC1 << 2) + X3) + 2) >> 2;X1 = bmp_param.AC3 * B6 >> 13;X2 = (B6 * B6 >> 12) * bmp_param.B1 >> 16;X3 = (X1 + X2 + 2) >> 2; uint32_t B4 = bmp_param.AC4 * (uint32_t)(X3 + 32768) >> 15;uint32_t B7 = ((uint32_t)UP - B3) * 50000;int32_t p;if(B7 < 0x80000000){p = (B7 << 1) / B4; }else{p = B7/B4 << 1;}X1 = (p >> 8) * (p >> 8);X1 = (X1 * 3038) >> 16;X2 = (-7375 * p) >> 16;p = p + ((X1 + X2 + 3791) >> 4);
第四步:计算海拔高度
根据手册提供公式,可以根据气压计算出海拔高度,但此式过于复杂。
在3000M范围内,每升高12M,大气压减小1mmHg,大约133Pa。0海拔高度大约是101325 pa,所以据此可以进行简单近似的计算:altitude = (101325 - p) /133 * 12。
测试结果
不同楼层的高度
这是最低功耗,也是精度最低的工作模式。可以看见精度并不是非常的高,但可以满足一般测量。如需要精度高的测量可以试一下其它工作模式。
获取工程源码
关注下方公众号,回复 “BMP180” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!
BMP180气压传感器详解与示例(STM32 附带源码)相关推荐
- [Linux运维基础]全家桶详解!Linux中RPM包、wget下载、YUM安装、tar包、zip等包管理方式区别与参数详解,附wget下载源码包编译安装方法
文章目录 一.RPM.tar.gz 1.rpm包格式 2.rpm包管理 3.tar包管理参数 二.wget 1.wget参数 2.wget下载源码包后编译安装 三.YUM 1.YUM工作原理 2. Y ...
- Android APP:Preference使用详解和实例(附源码)
Android APP:Preference使用详解和实例 一.Preference 是Android app中重要的控件之一,Settings 模块大部分都是通过Preference 实现的,这里将 ...
- C++文件操作详解,实用文件辅助类源码分享,建议收藏自用!
学习C++的小伙伴,应该会经常遇见对文件进行操作的需求,例如读写文件,作为一个使用频率较高的操作,我们每次重复地编写代码,就是浪费劳动力了,所以作者将自己常用的文件操作封装成了一个类,需要的小伙伴自取 ...
- 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙--HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...
- 一分钟详解PCL-1.8.1从源码搭建开发环境四(VTK库的编译)
- java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动
在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...
- Python 进阶之路 (八) 最用心的推导式详解 (附简单实战及源码)
什么是推导式 大家好,今天为大家带来问我最喜欢的Python推导式使用指南,让我们先来看看定义~ 推导式(comprehensions)是Python的一种独有特性,推导式是可以从一个数据序列构建另一 ...
- word2vec 中的数学原理详解(六)若干源码细节
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...
- java toast_详解Android中的Toast源码
Toast源码实现 Toast入口 我们在应用中使用Toast提示的时候,一般都是一行简单的代码调用,如下所示: [java] view plaincopyprint?在CODE上查看代码片派生 ...
最新文章
- linux-RPM安装
- diff git 代码实现_Git diff 算法
- [Oracle整理]CASE-END
- mysql必知必会--用通配符进行过滤
- 一个程序猿必须掌握的HTML的常识
- 配置suse syslog服务器
- windows中的一个小bug
- 数据库学生学籍管理系统
- 魔兽争霸3 the oracle,疯狂SQL之魔兽争霸
- 表达的方式:评价很让人难受
- 该不该从大学退学的讨论
- 用C语言/C++实现一个基础的电话簿
- CString、CStringA 和 CStringW
- 科学计算机怎么算锥度,如何计算锥度值?比如说1:20等于多少度?请说说具体步骤!-锥度的计算公式-数学-贾儆刹同学...
- Android之WebView
- APP又被下架?手把手教你整改合规
- anaconda 上实现Tensorflow MASK R-CNN Demo Windows (CPU版)
- 跟你聊聊员工的离职成本,细算下来超级恐怖!
- 【问题收集】slam中常见make问题错误 相关总结
- Blender 3D环境场景创建教程