HAL库硬件IIC驱动气压传感器BMP180

环境

1、keilMDK 5.38
2、STM32CUBEMX

初始配置

在这里插入图片描述
默认即可。

程序

1、头文件

#ifndef __BMP_180_H
#define __BMP_180_H#include "main.h"typedef struct
{float fTemp;		/*温度,摄氏度*/float fPressure;	/*压力,pa*/float fAltitude;	/*高度,米*/
}BMP180Data_T;extern BMP180Data_T g_tBMP180;void BMP180_Init(void);void BMP180_StartTempSample(void);	/*开始温度采集*/
void BMP180_GetTemp(BMP180Data_T *tpBMP180);			/*最少等待4.5ms,才能获取温度*/void BMP180_StartPressureSample(void);
void BMP180_GetPressureAltitude(BMP180Data_T *tpBMP180);
#endif

2、C文件

#include "bmp180.h"
#include "i2c.h"
#include "math.h"#define BMP180_COM_PORT 	hi2c1	/*通讯端口*/#define	BMP180_ADDR 		0xEE 	/*定义器件在IIC总线中的从地址*/
#define BMP180_CALIB_REG	0xAA	/*校准寄存器开始地址*/
#define BMP180_MADDR_W 		0xF4 	/*写入地址*/
#define BMP180_MADDR_R 		0xF6 	/*读取地址*/#define SEA_PRESSURE		101325.0f	/*海平面气压,pa*/BMP180Data_T g_tBMP180;uint16_t BMP180_CMD_WD = 0X2E;	/*温度控制寄存器,设置后,读取温度需要延迟4.5ms*///uint16_t BMP180_CMD_QY = 0x34;  //气压,需要延迟4.5ms
//uint16_t BMP180_CMD_QY = 0x74;  //气压,需要延迟7.5ms
//uint16_t BMP180_CMD_QY = 0xB4;  //气压,需要延迟13.5ms
uint16_t BMP180_CMD_QY = 0xF4;  /*气压控制寄存器值,设置后,读取气压需要延迟25.5ms*/
int osrs;//定义BMP初始化变量
typedef struct {int16_t AC1;int16_t AC2;int16_t AC3;uint16_t AC4;uint16_t AC5;uint16_t AC6;int16_t B1;int16_t B2;int16_t MB;int16_t MC;int16_t MD;int32_t B5;
} BMP180_Calibration_TypeDef;
BMP180_Calibration_TypeDef BMP180_Calibration;/** I2C气压读取 **/
//初始化所有默认值
void BMP180_Init()
{uint8_t buffer[22];if(BMP180_CMD_QY == 0x34){osrs = 0;}else if(BMP180_CMD_QY == 0x74){osrs = 1;}else if(BMP180_CMD_QY == 0xb4){osrs = 2;}else if(BMP180_CMD_QY == 0xF4){osrs = 3;}	HAL_I2C_Mem_Read(&BMP180_COM_PORT, BMP180_ADDR, BMP180_CALIB_REG, I2C_MEMADD_SIZE_8BIT, (uint8_t *)buffer, 22, 3000);BMP180_Calibration.AC1 = (buffer[0]  << 8) | buffer[1];BMP180_Calibration.AC2 = (buffer[2]  << 8) | buffer[3];BMP180_Calibration.AC3 = (buffer[4]  << 8) | buffer[5];BMP180_Calibration.AC4 = (buffer[6]  << 8) | buffer[7];BMP180_Calibration.AC5 = (buffer[8]  << 8) | buffer[9];BMP180_Calibration.AC6 = (buffer[10]  << 8) | buffer[11];BMP180_Calibration.B1 = (buffer[12]  << 8) | buffer[13];BMP180_Calibration.B2 = (buffer[14]  << 8) | buffer[15];BMP180_Calibration.MB = (buffer[16]  << 8) | buffer[17];BMP180_Calibration.MC = (buffer[18]  << 8) | buffer[19];BMP180_Calibration.MD = (buffer[20]  << 8) | buffer[21];
}
//温度计算
int16_t BMP180_Calc_WD(uint16_t UT)
{BMP180_Calibration.B5  = (((int32_t)UT - (int32_t)BMP180_Calibration.AC6) * (int32_t)BMP180_Calibration.AC5) >> 15;BMP180_Calibration.B5 += ((int32_t)BMP180_Calibration.MC << 11) / (BMP180_Calibration.B5 + BMP180_Calibration.MD);return (BMP180_Calibration.B5 + 8) >> 4;
}
//气压计算
int32_t BMP180_Calc_QY(uint32_t UP, uint8_t oss)
{int32_t B3,B6,X3,p;uint32_t B4,B7;B6 = BMP180_Calibration.B5 - 4000;X3 = ((BMP180_Calibration.B2 * ((B6 * B6) >> 12)) >> 11) + ((BMP180_Calibration.AC2 * B6) >> 11);B3 = (((((int32_t)BMP180_Calibration.AC1) * 4 + X3) << oss) + 2) >> 2;X3 = (((BMP180_Calibration.AC3 * B6) >> 13) + ((BMP180_Calibration.B1 * ((B6 * B6) >> 12)) >> 16) + 2) >> 2;B4 = (BMP180_Calibration.AC4 * (uint32_t)(X3 + 32768)) >> 15;B7 = ((uint32_t)UP - B3) * (50000 >> oss);if (B7 < 0x80000000) p = (B7 << 1) / B4; else p = (B7 / B4) << 1;p = p + (((((p >> 8) * (p >> 8) * 3038) >> 16) + ((-7357 * p) >> 16) + 3791) >> 4);return p;
}
//海拔计算
float BMP180_Calc_HB(int32_t Pa)
{
//	return 44330 * (1 - pow( Pa/ SEA_PRESSURE, 1.0f / 5.255f));return 44330 * (1 - pow( Pa/ SEA_PRESSURE, 0.190295F));
}/*
****************************************************************************************
* 说明:开始温度采集
* 输入:无
* 输出:无
****************************************************************************************
*/
void BMP180_StartTempSample(void)
{HAL_I2C_Mem_Write(&BMP180_COM_PORT, BMP180_ADDR, BMP180_MADDR_W, I2C_MEMADD_SIZE_8BIT, (uint8_t *)&BMP180_CMD_WD, 1, 100);
}/*
****************************************************************************************
* 说明:获取温度
* 输入:无
* 输出:浮点温度值,摄氏度,
****************************************************************************************
*/
void BMP180_GetTemp(BMP180Data_T *tpBMP180)
{uint8_t ucTemp[2];uint16_t usTemp;float fTemp;HAL_I2C_Mem_Read(&BMP180_COM_PORT, BMP180_ADDR, BMP180_MADDR_R, I2C_MEMADD_SIZE_8BIT, ucTemp, 2, 100);usTemp = (ucTemp[0]<<8) | ucTemp[1];fTemp = BMP180_Calc_WD(usTemp) / 10.0f;tpBMP180->fTemp = fTemp;
}/*
****************************************************************************************
* 说明:开始压力采集
* 输入:无
* 输出:无
****************************************************************************************
*/
void BMP180_StartPressureSample(void)
{HAL_I2C_Mem_Write(&BMP180_COM_PORT, BMP180_ADDR, BMP180_MADDR_W, I2C_MEMADD_SIZE_8BIT, (uint8_t *)&BMP180_CMD_QY, 1, 100);
}/*
****************************************************************************************
* 说明:获取压力和高度
* 输入:无
* 输出:浮点压力数据,高度数据
****************************************************************************************
*/
void BMP180_GetPressureAltitude(BMP180Data_T *tpBMP180)
{uint8_t ucTemp[3];uint32_t ulPressure;int32_t lPressure;HAL_I2C_Mem_Read(&BMP180_COM_PORT, BMP180_ADDR, BMP180_MADDR_R, I2C_MEMADD_SIZE_8BIT, ucTemp, 3, 1000);//做气压运算ulPressure = ((ucTemp[0] << 16) + (ucTemp[1] <<8) + ucTemp[2]) >> (8 - osrs);lPressure = BMP180_Calc_QY(ulPressure,osrs); //气压值tpBMP180->fPressure	= (float)lPressure;//计算海拔tpBMP180->fAltitude = BMP180_Calc_HB(lPressure);	
}

使用

包含头文件后,先初始化BMP180
在这里插入图片描述

注意

1、温度的转换-读取时间是4.5ms间隔,压力的转换-读取时间,根据配置的不一样,延时时间不一样。
在这里插入图片描述
2、读取压力的时候,有些文章里面用的是“|”运算,结果不对,应该是“+”运算。
错误代码:

((uint32_t)REG_Data[0] << 16 | (uint32_t)REG_Data[1] <<8 | (uint32_t)REG_Data[2]) >> (8 - OSS);

正确运算:
在这里插入图片描述

结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

沈阳乐晟睿浩科技有限公司抖音小店展望未来

在当今数字化浪潮汹涌的时代&#xff0c;电子商务以其独特的魅力和无限潜力&#xff0c;正深刻改变着人们的消费习惯与商业模式。抖音小店作为短视频与电商深度融合的产物&#xff0c;凭借其庞大的用户基础、精准的内容推送机制以及独特的购物体验&#xff0c;迅速崛起为电商领…

【论文复现】自动化细胞核分割与特征分析

本文所涉及所有资源均在这里可获取。 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 论文复现 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整…

ESP32 gptimer通用定时器初始化报错:assert failed: timer_ll_set_clock_prescale

背景&#xff1a;IDF版本V5.1.2 &#xff0c;配置ESP32 通用定时器&#xff0c;实现100HZ&#xff0c;占空比50% 的PWM波形。 根据乐鑫官方的IDF指导文档设置内部计数器的分辨率&#xff0c;计数器每滴答一次相当于 1 / resolution_hz 秒。 &#xff08;ESP-IDF编程指导文档&a…

Jest项目实战(4):将工具库顺利迁移到GitHub的完整指南

开源代码&#xff1a;将工具库迁移到GitHub 随着项目的成熟和完善&#xff0c;将其开源不仅可以获得更多的用户和贡献者&#xff0c;还能促进项目本身的发展。GitHub作为全球最大的开源协作平台&#xff0c;自然成为了大多数开发者的首选。本文将引导您完成将工具库迁移至GitH…

C#线程池

目录 前言 线程 线程池 线程池的工作原理 重要方法 C#线程池总结 前言 线程池是一种多线程处理形式&#xff0c;它允许开发者将任务添加到队列中&#xff0c;然后线程池会自动管理线程的创建、分配和回收&#xff0c;以执行这些任务。线程池中的线程都是后台线程&#xf…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例&#xff0c;以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b) {return a b; }int main() {int result a…

【IC验证】systemverilog的设计特性

systemverilog的设计特性 一.概述二.面向硬件的过程语句块1.说明2.always_comb2.always_latch3.always_ff 三.关系运算符1.说明2.例子 四.inside判定符1.说明2.例子 五.条件分支语句&#xff08;1&#xff09;说明&#xff08;2&#xff09;例子&#xff08;case和unique case的…

计算不停歇,百度沧海数据湖存储加速方案 2.0 设计和实践

数据湖这个概念&#xff0c;从 2012 年产生到现在已经有十余年的时间&#xff0c;每家公司对它内涵的解读都不太一样。但是数据湖的主要存储底座有从传统的 HDFS 向对象存储演进的趋势。 传统的大数据计算场景&#xff0c;比如 MapReduce、Spark、Hive 这些大数据组件都是基于…

信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)

1 编制目的 2 系统运行维护 2.1 系统运维内容 2.2 日常运行维护方案 2.2.1 日常巡检 2.2.2 状态监控 2.2.3 系统优化 2.2.4 软件系统问题处理及升级 2.2.5 系统数据库管理维护 2.2.6 灾难恢复 2.3 应急运行维护方案 2.3.1 启动应急流程 2.3.2 成立应急小组 2.3.3 应急处理过程 …

【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0

目录 一、相关面试题 1. HTTP 与 HTTPS 有哪些区别&#xff1f; 2. HTTPS 的工作原理&#xff1f;&#xff08;https 是怎么建立连接的&#xff09; &#xff08;1&#xff09;ClientHello &#xff08;2&#xff09;SeverHello &#xff08;3&#xff09;客户端回应 &a…

使用文心快码生成口算题,妈妈再也不用担心我的学习了

2024年10月NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。百度文心快码总经理臧志分享了《AI原生研发新范式的实践与思考》&#xff0c;探讨了大模型赋能下的研发变革及如何在公司和行业中落地&#xff0c;AI原生研发新范式的内涵和推动经验。 …

C#笔记 —— 事件

事件的语法 访问修饰符 event 委托类型 事件名&#xff1b; 例&#xff1a; public event Action myEvent; 事件的使用 事件的使用跟委托基本上一模一样&#xff0c; 1.但是事件不能在类外部直接赋值&#xff0c;只能使用 或 - 添加或删除函数&#xff1b; 2.事件不能在类…

JavaScript3*3表格实现每次点击只红一行

<script> window.onload function () { var myTd document.getElementsByTagName("td"); var currentlyHighlightedRow null; // 用于存储当前高亮显示的行 for (var i 0; i < myTd.length; i) { myTd[i].onclick function () { …

物理验证Calibre LVS | SMIC Process过LVS时VNW和VPW要如何做处理?

SMIC家工艺的数字后端实现PR chipfinish写出来的带PG netlist如下图所示。我们可以看到标准单元没有VNW和VPW pin的逻辑连接关系。 前几天小编在社区星球上分享了T12nm ananke_core CPU低功耗设计项目的Calibre LVS案例&#xff0c;就是关于标准单元VPP和VBB的连接问题。 目前…

基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解

摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定船舶监造系统的总体功能模块。然后&#xff0c;详…

线性表之链表详解

欢迎来到我的&#xff1a;世界 希望作者的文章对你有所帮助&#xff0c;有不足的地方还请指正&#xff0c;大家一起学习交流 ! 目录 前言线性表的概述链表的概述 内容链表的结构链表节点的定义 链表的基本功能单向链表的初始化链表的插入操作头插操作尾插操作 链表的删除操作头…

Vue2 doc、excel、pdf、ppt、txt、图片以及视频等在线预览

Vue2 doc、excel、pdf、ppt、txt、图片等在线预览 安装使用目录结构直接上代码src\components\FileView\doc\index.vuesrc\components\FileView\excel\index.vuesrc\components\FileView\img\index.vuesrc\components\FileView\pdf\index.vuesrc\components\FileView\ppt\index…

全星魅-物联网定位终端-北斗定位便携终端-北斗有源终端

在当今快速发展的物流运输行业中&#xff0c;精准定位与实时监控已成为确保货物安全与高效运输的关键因素。为了满足这一需求&#xff0c;QMCZ10作为一款集4G&#xff08;LTE Cat1&#xff09;通讯技术与智能定位功能于一体的终端产品&#xff0c;应运而生。它不仅具备普通定位…

交换机属性-持久化和自动删除等

交换机属性-持久化和自动删除 1、交换机属性2、交换机(Exchange)的持久化属性2.1、RabbitConfig配置类&#xff08;关键代码&#xff09;2.2、发送消息2.3、启动类2.4、application.yml配置文件2.5、pom.xml配置文件2.6、测试 3、交换机(Exchange)的自动删除属性3.1、RabbitCon…