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 附带源码)相关推荐

  1. [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 ...

  2. Android APP:Preference使用详解和实例(附源码)

    Android APP:Preference使用详解和实例 一.Preference 是Android app中重要的控件之一,Settings 模块大部分都是通过Preference 实现的,这里将 ...

  3. C++文件操作详解,实用文件辅助类源码分享,建议收藏自用!

    学习C++的小伙伴,应该会经常遇见对文件进行操作的需求,例如读写文件,作为一个使用频率较高的操作,我们每次重复地编写代码,就是浪费劳动力了,所以作者将自己常用的文件操作封装成了一个类,需要的小伙伴自取 ...

  4. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析

    前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙--HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...

  5. 一分钟详解PCL-1.8.1从源码搭建开发环境四(VTK库的编译)

  6. java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  7. Python 进阶之路 (八) 最用心的推导式详解 (附简单实战及源码)

    什么是推导式 大家好,今天为大家带来问我最喜欢的Python推导式使用指南,让我们先来看看定义~ 推导式(comprehensions)是Python的一种独有特性,推导式是可以从一个数据序列构建另一 ...

  8. word2vec 中的数学原理详解(六)若干源码细节

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...

  9. java toast_详解Android中的Toast源码

    Toast源码实现 Toast入口    我们在应用中使用Toast提示的时候,一般都是一行简单的代码调用,如下所示: [java] view plaincopyprint?在CODE上查看代码片派生 ...

最新文章

  1. linux-RPM安装
  2. diff git 代码实现_Git diff 算法
  3. [Oracle整理]CASE-END
  4. mysql必知必会--用通配符进行过滤
  5. 一个程序猿必须掌握的HTML的常识
  6. 配置suse syslog服务器
  7. windows中的一个小bug
  8. 数据库学生学籍管理系统
  9. 魔兽争霸3 the oracle,疯狂SQL之魔兽争霸
  10. 表达的方式:评价很让人难受
  11. 该不该从大学退学的讨论
  12. 用C语言/C++实现一个基础的电话簿
  13. CString、CStringA 和 CStringW
  14. 科学计算机怎么算锥度,如何计算锥度值?比如说1:20等于多少度?请说说具体步骤!-锥度的计算公式-数学-贾儆刹同学...
  15. Android之WebView
  16. APP又被下架?手把手教你整改合规
  17. anaconda 上实现Tensorflow MASK R-CNN Demo Windows (CPU版)
  18. 跟你聊聊员工的离职成本,细算下来超级恐怖!
  19. 【问题收集】slam中常见make问题错误 相关总结
  20. Blender 3D环境场景创建教程

热门文章

  1. win10 重新安装桌面工具
  2. ubuntu11.04上搭建Android推送服务器
  3. 从0开始的网络学习——IP、DNS、服务器
  4. 浅谈我亲历的京东发展史
  5. 判断应不应该离职,不能只看这两点
  6. 典型微型计算机系统的硬件,微型计算机系统原理及应用
  7. java开发面试题与答案详解
  8. JQuery事件----冒泡机制的思考
  9. 如何改变网文大神们一睁眼就欠读者6000字的局面
  10. win7系统安装时提示找不到任何设备驱动程序的四种解决方法图文教程