气压传感器BMP180的简单应用

2024-03-21 23:44

本文主要是介绍气压传感器BMP180的简单应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、BMP180
    • 1.介绍
    • 2.主要特点:
    • 3. 典型应用:
    • 4. 原理图
    • 5. 典型应用电路
    • 6. 测量流程
    • 7. 工作模式
  • 二、软件
    • 1.初始化
    • 2.获取原始温度
    • 3.获取真实温度
    • 4.获取原始气压
    • 5.获取真实气压
    • 6.海拔高度的换算
  • 三、总结


一、BMP180

1.介绍

BMP180是一款高精度、小体积、超低能耗的压力传感器,可以应用在移动设备中。它的性能卓越,绝对精度最低可以达到0.03hPa,并且耗电极低,只有3μA。BMP180采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连。

在这里插入图片描述

2.主要特点:

  1. 压力范围:300-1100hPa(海拔9000米~-500米)
  2. 电源电压:1.8V-3.6V(VDDA),1.62V~3.6V(VDDD)
  3. LCC8封装:无铅陶瓷载体封装(LCC)
  4. 尺寸:3.6mmx3.8x0.93mm
  5. 低功耗:5μA,在标准模式
  6. 高精度:低功耗模式下,分辨率为0.06hPa(0.5米)
  7. 高线性模式下,分辨率为0.03hPa(0.25米)
  8. 含温度输出
  9. I2C接口
  10. 温度补偿
  11. 无铅,符合RoHS规范
  12. MSL 1反应时间:7.5ms
  13. 待机电流:0.1μA
  14. 无需外部时钟电路

3. 典型应用:

  1. GPS精确导航(航位推算,上下桥检测等)
  2. 室内室外导航
  3. 休闲、体育和医疗健康等监测
  4. 天气预报
  5. 垂直速度指示(上升/下沉速度)
  6. 风扇功率控制

4. 原理图

在这里插入图片描述
从原理图可以看出,SCL和SDA是I2C总线的通信引脚,VDD和GND用来接电源的正负极,接3.3V即可。

5. 典型应用电路

BMP180的压力和温度数据,必须通过传感器的校准数据进行补偿计算,校准数据可以通过读取其内部的EEPROM存储器来获取。

BMP180由一个压阻传感器、一个模数转换器和一个控制单元组成与E2PROM和串行I2C接口。如下图所示:

在这里插入图片描述

6. 测量流程

在这里插入图片描述

7. 工作模式

它有4钟工作模式,由过采样率(OSRS)表示,其实就是最大转换时间的不同,如

  1. 超低功耗(ultra low power)= 0,最大转换时间为4.5ms;
  2. 标准(standard) = 1,最大转换时间为7.5ms;
  3. 高精度(high)= 2,最大转换时间为13.5ms;
  4. 超高精度(ultra high resolution))= 3,最大转换时间为25.5ms。

在这里插入图片描述

二、软件

以下代码来自野火–F407_霸天虎开发板。

1.初始化

BMP180的从机地址为0x77

在这里插入图片描述

示例代码如下:

#define BMP180_I2C_ADDR          0x77
#define BMP180_PROM_START__ADDR  0xaa
#define BMP180_PROM_DATA__LEN    22/*** @brief	初始化,获取校准参数			* @note		在第一次转换前要先调用这个函数,然后用于真实值计算*/
static void bmp180Init(void)
{uint8_t data[22];		/*	从器件中读取22个校准数据	*/i2cRead(BMP180_I2C_ADDR, BMP180_PROM_START__ADDR, BMP180_PROM_DATA__LEN, data);/*parameters AC1-AC6*/calParam.ac1 = (data[0] << 8) | data[1];calParam.ac2 = (data[2] << 8) | data[3];calParam.ac3 = (data[4] << 8) | data[5];calParam.ac4 = (data[6] << 8) | data[7];calParam.ac5 = (data[8] << 8) | data[9];calParam.ac6 = (data[10] << 8) | data[11];/*parameters B1,B2*/calParam.b1 = (data[12] << 8) | data[13];calParam.b2 = (data[14] << 8) | data[15];/*parameters MB,MC,MD*/calParam.mb = (data[16] << 8) | data[17];calParam.mc = (data[18] << 8) | data[19];calParam.md = (data[20] << 8) | data[21];
}

2.获取原始温度

要获得温度数据,必须先向控制寄存器(地址0xF4)写0x2E,然后等待至少4.5ms,才可以从地址0xF6和0xF7读取十六位的温度数据。

在这里插入图片描述

#define BMP180_I2C_ADDR           0x77
#define BMP180_T_MEASURE          0x2E                // temperature measurent 
#define BMP180_CTRL_MEAS_REG      0xF4
#define BMP180_ADC_OUT_MSB_REG    0xF6/*** @brief	获取未偏移的原始温度数据,需要等待4.5ms才转换完成		* @note		本函数要被循环调用*					用到了systick的millis函数获取时间。	*	@retval convDone:		ture:转换完成			_FAIL:转换未完成*/
static uint8_t bmp180GetUT(void)
{uint8_t data[2]; static uint8_t convDone = _FAIL;	//静态变量,用于标志是否转换完成static uint32_t convTime=0;		//静态变量,用于记录开始转换用了多长时间		if(convTime==0)								//第一次调用本函数{		convDone = _FAIL;						//重置标志位		i2cWrite(BMP180_I2C_ADDR, BMP180_CTRL_MEAS_REG, BMP180_T_MEASURE);		//控制开始转换温度convTime= millis();					//记录开始转换时刻}	if((millis()-convTime) > 5)		//温度转换需要4.5ms	{i2cRead(BMP180_I2C_ADDR, BMP180_ADC_OUT_MSB_REG, 2, data);						//读取温度转换的数据bmp180Val.ut = (data[0] << 8) | data[1];																	//温度数据格式convDone 	= _SUCCESS;						//转换完成标志convTime	= 0;							//重置转换时间}return convDone;
}

3.获取真实温度

在这里插入图片描述

 /*** @brief	计算真实温度值		* @note		datasheet有公式* @param	ut:未偏移的原始温度数据,由bmp180_get_ut	函数得到	* @retval	temperature:真实的温度值,单位:0.1摄氏度*/
static void bmp180CalTemperature(void)
{int16_t temperature;int32_t x1, x2;/*	根据转换公式计算参数	*/x1 = (((int32_t) bmp180Val.ut - (int32_t) calParam.ac6) * (int32_t) calParam.ac5) >> 15;x2 = ((int32_t) calParam.mc << 11) / (x1 + calParam.md);bmp180Val.paramB5 = x1 + x2;/*	计算真实温度值	*/temperature = (( bmp180Val.paramB5 + 8) >> 4);  // 温度值单位: 0.1 Cbmp180Val.temperature = temperature; //计算完才赋值,减少上层函数调用get时,交给上层中间数据的概率
}

4.获取原始气压

要获得气压数据,必须先向控制寄存器(地址0xF4)写0x34(0x74、0xB4、0xF4),然后等待至少4.5ms,才可以从地址0xF6和0xF6读取16位的气压数据。
在这里插入图片描述

#define BMP180_I2C_ADDR           0x77
#define BMP180_P_MEASURE          0x34                // pressure measurement
#define BMP180_CTRL_MEAS_REG      0xF4
#define BMP180_ADC_OUT_MSB_REG    0xF6/*** @brief	获取未偏移的原始压力数据* @note		获取压力前调用,等待时间:*					模式0,4.5ms 模式1,7.5ms	模式2,13.5ms 模式3,25.5ms	*					用到了systick的millis函数获取时间。*					本函数要被循环调用*	@retval convDone:		ture:转换完成			_FAIL:转换未完成*/
static uint8_t bmp180GetUP(void)
{uint8_t data[3]; //uint8_t ctrl=0x0f;static uint8_t convDone = _FAIL;	//静态变量,用于标志是否转换完成static uint32_t convTime = 0;		//静态变量,用于记录开始转换用了多长时间		if(convTime == 0)								//第一次调用本函数{		convDone = _FAIL;						//重置标志位	BMP180_CTRL_MEAS_REG	i2cWrite(BMP180_I2C_ADDR,BMP180_CTRL_MEAS_REG ,(BMP180_P_MEASURE + (OSS<< 6)));	//开始压力转换convTime = millis();					//记录开始转换时刻}if((millis()-convTime) > OSS_TIME)		//判断是否转换完成{i2cRead(BMP180_I2C_ADDR, BMP180_ADC_OUT_MSB_REG, 3, data);bmp180Val.up = (((uint32_t) data[0] << 16) | ((uint32_t) data[1] << 8) | (uint32_t) data[2]) >> (8 - OSS);convDone 	= _SUCCESS;						//转换完成标志convTime	= 0;							//重置转换时间}	return convDone;
}

5.获取真实气压

在这里插入图片描述

 /*** @brief	计算真实压力数据		* @note		datasheet有公式	* @param	up:未偏移的原始压力数据,由bmp180GetUp函数得到* @retval	pressure:真实的压力值,单位:Pa*/
static void bmp180CalPressure(void)
{int32_t  pressure,x1, x2, x3, b3, b6;uint32_t b4, b7;/*	根据公式计算参数	*/b6 = bmp180Val.paramB5 - 4000;// *****calculate B3************x1 = (b6 * b6) >> 12;x1 *= calParam.b2;x1 >>= 11;x2 = (calParam.ac2 * b6);x2 >>= 11;x3 = x1 + x2;b3 = (((((int32_t)calParam.ac1) * 4 + x3) << OSS) + 2) >> 2;// *****calculate B4************x1 = (calParam.ac3 * b6) >> 13;x2 = (calParam.b1 * ((b6 * b6) >> 12) ) >> 16;x3 = ((x1 + x2) + 2) >> 2;b4 = (calParam.ac4 * (uint32_t) (x3 + 32768)) >> 15;b7 = ((uint32_t)(bmp180Val.up - b3) * (50000 >> OSS));if (b7 < 0x80000000) {pressure = (b7 << 1) / b4;}else { pressure = (b7 / b4) << 1;}x1 = pressure >> 8;x1 *= x1;x1 = (x1 * SMD500_PARAM_MG) >> 16;x2 = (pressure * SMD500_PARAM_MH) >> 16;/*	计算真实压力值	*/pressure += (x1 + x2 + SMD500_PARAM_MI) >> 4;   // 压力值单位: Pabmp180Val.pressure = pressure; //计算完才赋值,减少错误地把中间数据交给上层的概率 (上层使用get函数获取数据)
}

6.海拔高度的换算

BMP180传感器提供温度和压力的绝对测量值,但不提供海拔高度的直接输出。

由于大气压力随高度升高而降低。

在这里插入图片描述
由上图我们可知,气压与海平面的高度具有近似线性的反比,因此如果我们测量了某地的气压,我们可以使用简单的数学运算从海平面计算海拔高度。

 /*** @brief		更新气压、温度计数据	* @note			本函数要被循环调用,整个转换时间30ms* @param		tempData,温度数据指针,若数据更新了,本函数会把tempData的isNew标志置1* @retval	*/
static void bmp180TempUpdate(SENSOR_DATA_T *tempData)
{static uint8_t state = 0;isNew = tempData ->isNew;			//isNew静态变量用来同步tempData的isNew变量//isNew静态变量同步得的信息在后面会在presUpdate和altiUpdate函数使用	switch(state){case 0:if(bmp180GetUT() == _SUCCESS)		//温度转换state++;						//温度转换完成,进入压力转换状态break;					case 1:if(bmp180GetUP() == _SUCCESS)		//压力转换state++;						//压力转换完成,开始真实值计算break;					case 2:bmp180CalTemperature();			//真实值计算bmp180CalPressure();bmp180Val.altitude = (1.0f - pow(bmp180Val.pressure / 101325.0f, 0.190295f)) * 44330.0f; //根据压力值计算海拔高度公式由datasheet而来,	单位为:米																																																	      //公式中的1hPa=0.01Pa,由传感器算出的压力值单位为Pa,代码这里在使用datasheet的公式时化了单位	tempData->isNew = isNew = _SUCCESS ;	//更新数据状态state = 0;				break;}
}

通过当地的气象服务中可以得到海平面压力P0,利用传感器读取的压力P和该海平面压力P0的值,通过上面的公式可以计算传感器所在位置的高度。

注意:海平面压力P0的值不是固定的,跟所属区域及环境温度和天气情况的变化而变化。


三、总结

今天主要讲了气压传感器BMP180的简单应用。

感谢你的观看!

在这里插入图片描述

这篇关于气压传感器BMP180的简单应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/834109

相关文章

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

CSS3 布局样式及其应用举例

《CSS3布局样式及其应用举例》CSS3的布局特性为前端开发者提供了无限可能,无论是Flexbox的一维布局还是Grid的二维布局,它们都能够帮助开发者以更清晰、简洁的方式实现复杂的网页布局,本文给... 目录深入探讨 css3 布局样式及其应用引言一、CSS布局的历史与发展1.1 早期布局的局限性1.2