当前位置: 首页 > news >正文

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);

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

结果

在这里插入图片描述

相关文章:

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; /*温度&#xff0c;摄氏度*/float fPressure; /*压力&#xff0c;pa*/float fAltitude; /*…...

探索Python音频处理的奥秘:Pydub库的魔法

文章目录 探索Python音频处理的奥秘&#xff1a;Pydub库的魔法第一部分&#xff1a;背景介绍第二部分&#xff1a;Pydub是什么&#xff1f;第三部分&#xff1a;如何安装Pydub&#xff1f;第四部分&#xff1a;Pydub的简单函数使用方法1. 打开音频文件2. 播放音频3. 导出音频文…...

LeetCode 热题100(七)【链表】(2)

目录 7.6合并两个有序链表&#xff08;简单&#xff09; 7.7两数相加&#xff08;中等&#xff09; 7.8删除链表的倒数第N个节点&#xff08;中等&#xff09; 7.9两两交换链表中的节点&#xff08;中等&#xff09; 7.10k个一组翻转链表&#xff08;困难&#xff09; 7.6…...

计算机网络 TCP/IP体系 网络层

一. 网络层的基本概念 网络层主要负责将数据从源端主机发送到目的端主机。在这一过程中&#xff0c;网络层要解决的关键问题是数据包的路由选择&#xff0c;即确定数据包通过互联网的最佳路径。 1.1 网络层的信息类型 数据包&#xff1a;这是网络层传输的主要形式&#xff0c…...

迈入国际舞台,AORO M8防爆手机获国际IECEx、欧盟ATEX防爆认证

近日&#xff0c;深圳市遨游通讯设备有限公司&#xff08;以下简称“遨游通讯”&#xff09;旗下5G防爆手机——AORO M8&#xff0c;通过了CSA集团的严格测试和评估&#xff0c;荣获国际IECEx及欧盟ATEX防爆认证证书。2024年11月5日&#xff0c;CSA集团和遨游通讯双方领导在遨游…...

实习作假:阿里健康实习做了RABC中台,还优化了短信发送流程

最近有二本同学说&#xff1a;“大拿老师&#xff0c;能帮忙看下简历吗&#xff1f;” 如果是从面试官的角度来看&#xff0c;这个同学的实习简历是很虚假的。 但是我们一直强调的是&#xff1a;校招的实习简历是不能出现明显的虚假。 首先&#xff0c;你去公司做事情&#…...

Unity中IK动画与布偶死亡动画切换的实现

在Unity游戏开发中&#xff0c;Inverse Kinematics&#xff08;IK&#xff09;是创建逼真角色动画的强大工具。同时&#xff0c;能够在适当的时候切换到布偶物理状态来实现死亡动画等效果&#xff0c;可以极大地增强游戏的视觉体验。本文将详细介绍如何在Unity中利用IK实现常规…...

java导出word文件(手绘)

文章目录 代码细节效果图参考资料 代码细节 使用的hutool的WordUtil&#xff0c;WordUtil对poi进行封装&#xff0c;但是这一块的官方封装的很少&#xff0c;很多细节都没有。代码中是常见的绘制段落&#xff0c;标题、表格等常用api Word07Writer writer WordUtil.getWriter(…...

ssm070基于SSM框架的校园代购服务订单管理系统的设计与实现+vue(论文+源码)_kaic

毕业设计 题 目&#xff1a; 校园代购服务订单管理系统 作 者&#xff1a; 学 号&#xff1a; 所属学院&#xff1a; 专业年级&#xff1a; 学校导师&#xff1a; 职 称&#xff1a; 班级导师&#xff1a; 职 称&#xff1a; 完成时间…...

Java项目实战II基于Spring Boot的秒杀系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在互联网电商蓬勃发展的今天&#xff0…...

FastAPI —— 请求参数验证

1.hello world 给后端船数据 hello world 接口给后端传 COVID-19 感染数据_高性能 FastAPI 框架入门精讲-慕课网 #!/usr/bin/python3 # -*- coding:utf-8 -*- # __author__ __Jack__from typing import Optionalfrom fastapi import FastAPI from pydantic import BaseModel…...

第七篇: BigQuery中的复杂SQL查询

BigQuery中的复杂SQL查询 背景与目标 在数据分析中&#xff0c;我们通常需要从多个数据源中获取信息&#xff0c;以便进行深入的分析。这时&#xff0c;BigQuery提供的JOIN、UNION和子查询等复杂SQL语句非常实用。本文将以Google BigQuery的公共数据集为例&#xff0c;介绍如何…...

【SQL实验】高级查询(难点.三)含附加数据库操作

完整代码在文章末尾【代码是自己的解答&#xff0c;并非标准答案&#xff0c;也有可能写错&#xff0c;文中可能会有不准确或待完善之处&#xff0c;恳请各位读者不吝批评指正&#xff0c;共同促进学习交流】 将素材中的“学生管理”数据库附加到SQL SERVER中&#xff0c;完成以…...

qt QFileSystemModel详解

1、概述 QFileSystemModel是Qt框架中的一个关键类&#xff0c;它继承自QAbstractItemModel&#xff0c;专门用于在Qt应用程序中展示文件系统的数据。这个模型提供了一个方便的接口&#xff0c;使得开发者可以轻松地在应用程序中集成文件和目录的树形结构&#xff0c;并通过视图…...

element plus中修改el-table的样式

文章目录 前情提要相关环境package.jsonvue代码结果 方式一直接看代码 方式二直接看代码 前情提要 因为项目中用到el-table的时候&#xff0c;需要将el-table表格的样式进行修改&#xff0c;将整个表格的背景颜色从白色变成透明&#xff0c;使得表格变得透明之后&#xff0c;展…...

深入理解封装与接口:Java程序设计的核心思想与最佳实践

目录 一、封装的优点 二、接口与默认方法 三、总结 在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;封装&#xff08;Encapsulation&#xff09;是一个核心概念&#xff0c;Java对其进行了良好的支持。封装不仅有助于提高代码的安全性&#xff0c;还能够增强代码的…...

linux 下调试 mpu6050 三轴加速度

供自己备忘&#xff1b; 1. 参考资料&#xff1a; b 站视频 https://www.bilibili.com/video/BV1cL4y1x7FA/?spm_id_from333.337.search-card.all.click&vd_sourced7a07b8689c9e646f0214227c06f304c csdn 其它博客 https://blog.csdn.net/qq_65198598/article/detail…...

C语言心型代码解析

方法一 心型极坐标方程 爱心代码你真的理解吗 笛卡尔的心型公式&#xff1a; for (y 1.5; y > -1.5; y - 0.1) for (x -1.5; x < 1.5; x 0.05) 代码里面用了二个for循环&#xff0c;第一个代表y轴&#xff0c;第二个代表x轴 二个增加的单位不同&#xff0c;能使得…...

【LeetCode】【算法】647. 回文子串

LeetCode 647.回文子串 题目描述 给你一个字符串s&#xff0c;请你统计并返回这个字符串中回文子串的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串是字符串中的由连续字符组成的一个序列。 思路 思路&#xff1a;中心拓展法 中心拓展法的意思是说&#xf…...

介绍6种常见的基于知识图谱推荐算法的类型和各自的优缺点

基于知识图谱的推荐算法有多种&#xff0c;每种算法各有其优点和缺点。下面是一些常见的基于知识图谱的推荐算法及其分析&#xff1a; 基于邻域的协同过滤&#xff08;Collaborative Filtering&#xff09; 描述&#xff1a;通过分析用户之间的相似性或项目之间的相似性来进行…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

高抗扰度汽车光耦合器的特性

晶台光电推出的125℃光耦合器系列产品&#xff08;包括KL357NU、KL3H7U和KL817U&#xff09;&#xff0c;专为高温环境下的汽车应用设计&#xff0c;具备以下核心优势和技术特点&#xff1a; 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计&#xff0c;确保在…...