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; /*温度,摄氏度*/float fPressure; /*压力,pa*/float fAltitude; /*…...
探索Python音频处理的奥秘:Pydub库的魔法
文章目录 探索Python音频处理的奥秘:Pydub库的魔法第一部分:背景介绍第二部分:Pydub是什么?第三部分:如何安装Pydub?第四部分:Pydub的简单函数使用方法1. 打开音频文件2. 播放音频3. 导出音频文…...
LeetCode 热题100(七)【链表】(2)
目录 7.6合并两个有序链表(简单) 7.7两数相加(中等) 7.8删除链表的倒数第N个节点(中等) 7.9两两交换链表中的节点(中等) 7.10k个一组翻转链表(困难) 7.6…...
计算机网络 TCP/IP体系 网络层
一. 网络层的基本概念 网络层主要负责将数据从源端主机发送到目的端主机。在这一过程中,网络层要解决的关键问题是数据包的路由选择,即确定数据包通过互联网的最佳路径。 1.1 网络层的信息类型 数据包:这是网络层传输的主要形式,…...
迈入国际舞台,AORO M8防爆手机获国际IECEx、欧盟ATEX防爆认证
近日,深圳市遨游通讯设备有限公司(以下简称“遨游通讯”)旗下5G防爆手机——AORO M8,通过了CSA集团的严格测试和评估,荣获国际IECEx及欧盟ATEX防爆认证证书。2024年11月5日,CSA集团和遨游通讯双方领导在遨游…...
实习作假:阿里健康实习做了RABC中台,还优化了短信发送流程
最近有二本同学说:“大拿老师,能帮忙看下简历吗?” 如果是从面试官的角度来看,这个同学的实习简历是很虚假的。 但是我们一直强调的是:校招的实习简历是不能出现明显的虚假。 首先,你去公司做事情&#…...
Unity中IK动画与布偶死亡动画切换的实现
在Unity游戏开发中,Inverse Kinematics(IK)是创建逼真角色动画的强大工具。同时,能够在适当的时候切换到布偶物理状态来实现死亡动画等效果,可以极大地增强游戏的视觉体验。本文将详细介绍如何在Unity中利用IK实现常规…...
java导出word文件(手绘)
文章目录 代码细节效果图参考资料 代码细节 使用的hutool的WordUtil,WordUtil对poi进行封装,但是这一块的官方封装的很少,很多细节都没有。代码中是常见的绘制段落,标题、表格等常用api Word07Writer writer WordUtil.getWriter(…...
ssm070基于SSM框架的校园代购服务订单管理系统的设计与实现+vue(论文+源码)_kaic
毕业设计 题 目: 校园代购服务订单管理系统 作 者: 学 号: 所属学院: 专业年级: 学校导师: 职 称: 班级导师: 职 称: 完成时间…...
Java项目实战II基于Spring Boot的秒杀系统设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在互联网电商蓬勃发展的今天࿰…...
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查询 背景与目标 在数据分析中,我们通常需要从多个数据源中获取信息,以便进行深入的分析。这时,BigQuery提供的JOIN、UNION和子查询等复杂SQL语句非常实用。本文将以Google BigQuery的公共数据集为例,介绍如何…...
【SQL实验】高级查询(难点.三)含附加数据库操作
完整代码在文章末尾【代码是自己的解答,并非标准答案,也有可能写错,文中可能会有不准确或待完善之处,恳请各位读者不吝批评指正,共同促进学习交流】 将素材中的“学生管理”数据库附加到SQL SERVER中,完成以…...
qt QFileSystemModel详解
1、概述 QFileSystemModel是Qt框架中的一个关键类,它继承自QAbstractItemModel,专门用于在Qt应用程序中展示文件系统的数据。这个模型提供了一个方便的接口,使得开发者可以轻松地在应用程序中集成文件和目录的树形结构,并通过视图…...
element plus中修改el-table的样式
文章目录 前情提要相关环境package.jsonvue代码结果 方式一直接看代码 方式二直接看代码 前情提要 因为项目中用到el-table的时候,需要将el-table表格的样式进行修改,将整个表格的背景颜色从白色变成透明,使得表格变得透明之后,展…...
深入理解封装与接口:Java程序设计的核心思想与最佳实践
目录 一、封装的优点 二、接口与默认方法 三、总结 在面向对象编程(OOP)中,封装(Encapsulation)是一个核心概念,Java对其进行了良好的支持。封装不仅有助于提高代码的安全性,还能够增强代码的…...
linux 下调试 mpu6050 三轴加速度
供自己备忘; 1. 参考资料: 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语言心型代码解析
方法一 心型极坐标方程 爱心代码你真的理解吗 笛卡尔的心型公式: for (y 1.5; y > -1.5; y - 0.1) for (x -1.5; x < 1.5; x 0.05) 代码里面用了二个for循环,第一个代表y轴,第二个代表x轴 二个增加的单位不同,能使得…...
【LeetCode】【算法】647. 回文子串
LeetCode 647.回文子串 题目描述 给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串是字符串中的由连续字符组成的一个序列。 思路 思路:中心拓展法 中心拓展法的意思是说…...
介绍6种常见的基于知识图谱推荐算法的类型和各自的优缺点
基于知识图谱的推荐算法有多种,每种算法各有其优点和缺点。下面是一些常见的基于知识图谱的推荐算法及其分析: 基于邻域的协同过滤(Collaborative Filtering) 描述:通过分析用户之间的相似性或项目之间的相似性来进行…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
