STM32F103C8T6读取气压计MS5611,I2C读取模式

2023-05-16

笔者最近想用气压计模块来测一下相对高度,使用的元器件如下图所示
所使用的最小系统板 **

所使用的气压计模块

在这里插入图片描述
  其实读取还是蛮简单的,根据核心板引脚图选择I2c接口,然后借鉴正点原子的模拟i2c程序,再根据datesheet里的图写出读气压计温度和大气压的程序,高度可由经验公式直接给出,笔者一开始对这个经验公式是持怀疑态度的,因为空气变化无常,咋可能根据这得出精确的高度,MS5611高度精度是10cm,已经很精确了。不过后来看来公式推导之后,发现还是很有道理了,自己想不通是自己菜,物理学家早就搞定了这些东西。
 大气压与海拔高度公式推导

#include "MS5611.h"
#include "math.h"
#include "i2c.h"

//气压计状态机
#define SCTemperature    0x01	  //开始温度转换
#define CTemperatureing  0x02 //正在转换温度
#define SCPressure  		 0x03	    //开始气压转换
#define SCPressureing    0x04	  //正在转换气压


 
/*
C1 压力灵敏度 SENS|T1
C2  压力补偿  OFF|T1
C3	温度压力灵敏度系数 TCS
C4	温度系数的压力补偿 TCO
C5	参考温度 T|REF
C6 	温度系数的温度 TEMPSENS
*/
uint32_t  Cal_C[7];	        //用于存放PROM中的6组数据1-6
double MSbaro_h;
double OFF_;
float Aux;
/*
dT 实际和参考温度之间的差异
TEMP 实际温度	
*/
uint64_t dT,TEMP;

uint32_t yali,Pressure_old,qqp;				//大气压
/*
OFF 实际温度补偿
SENS 实际温度灵敏度
*/
uint64_t OFf,SENS;
uint32_t D1_Pres,D2_Temp;	// 数字压力值,数字温度值

uint32_t TEMP2,T2,OFF2,SENS2;	//温度校验值
uint32_t Pres_BUFFER[20];     //数据组
uint32_t Temp_BUFFER[10];     //数据组




/*******************************************************************************
  * @函数名称	MS561101BA_RESET
  * @函数说明   复位MS5611
  * @输入参数   无
  * @输出参数   无
  * @返回参数   无
*******************************************************************************/
void MS561101BA_RESET(void)
{
		IIC_Start();
		IIC_Send_Byte(0xEE);//CSB接地,主机地址:0XEE,否则 0X77
	  IIC_Wait_Ack();
    IIC_Send_Byte(0x1E);//发送复位命令
	  IIC_Wait_Ack();
    IIC_Stop();
	
}
/*******************************************************************************
  * @函数名称	MS5611_init
  * @函数说明   初始化5611
  * @输入参数  	无
  * @输出参数   无
  * @返回参数   无
*******************************************************************************/
u8 MS5611_init(void)
 {	 
  u8  inth,intl;
  int i;
  for (i=1;i<=6;i++) 
	{
 
		IIC_Start();
    IIC_Send_Byte(0xEE);
		IIC_Wait_Ack();
		IIC_Send_Byte(0xA0 + (i*2));
		IIC_Wait_Ack();
    IIC_Stop();
		delay_us(5);
		IIC_Start();
		IIC_Send_Byte(0xEE+0x01);  //进入接收模式
		delay_us(1);
		IIC_Wait_Ack();
		inth = IIC_Read_Byte(1);  		//带ACK的读数据
		delay_us(1);
		intl = IIC_Read_Byte(0); 			//最后一个字节NACK
		IIC_Stop();
    Cal_C[i] = (((uint16_t)inth << 8) | intl);
	}
	 return !Cal_C[0];
 }


/**************************实现函数********************************************
*函数原型:unsigned long MS561101BA_getConversion(void)
*功  能:    读取 MS561101B 的转换结果 
*******************************************************************************/
unsigned long MS561101BA_getConversion(uint8_t command)
{
 
			unsigned long conversion = 0;
			u8 temp[3];
	
	    IIC_Start();
			IIC_Send_Byte(0xEE); 		//写地址
			IIC_Wait_Ack();
			IIC_Send_Byte(command); //写转换命令
			IIC_Wait_Ack();
			IIC_Stop();

			delay_ms(10);
			IIC_Start();
			IIC_Send_Byte(0xEE); 		//写地址
			IIC_Wait_Ack();
			IIC_Send_Byte(0);				// start read sequence
			IIC_Wait_Ack();
			IIC_Stop();
		 
			IIC_Start();
			IIC_Send_Byte(0xEE+0x01);  //进入接收模式
			IIC_Wait_Ack();
			temp[0] = IIC_Read_Byte(1);  //带ACK的读数据  bit 23-16
			temp[1] = IIC_Read_Byte(1);  //带ACK的读数据  bit 8-15
			temp[2] = IIC_Read_Byte(0);  //带NACK的读数据 bit 0-7
			IIC_Stop();
			
			conversion = (unsigned long)temp[0] * 65536 + (unsigned long)temp[1] * 256 + (unsigned long)temp[2];
			return conversion;
 
}


/**************************实现函数********************************************
*函数原型:void MS561101BA_GetTemperature(void)
*功  能:    读取 温度转换结果 
*******************************************************************************/

void MS561101BA_GetTemperature(void)
{
	
	D2_Temp = MS561101BA_getConversion(0x58);
	delay_ms(10);
	dT=D2_Temp - (((uint32_t)Cal_C[5])<<8);
	TEMP=2000+dT*((uint32_t)Cal_C[6])/8388608;
}

///***********************************************
//  * @brief  读取气压
//  * @param  None
//  * @retval None
//************************************************/
void MS561101BA_getPressure(void)
{
	D1_Pres= MS561101BA_getConversion(0x48);
	delay_ms(10);
	
	OFF_=(uint32_t)Cal_C[2]*65536+((uint32_t)Cal_C[4]*dT)/128;
	SENS=(uint32_t)Cal_C[1]*32768+((uint32_t)Cal_C[3]*dT)/256;

	if(TEMP<2000)
	{
		Aux = (2000-TEMP)*(2000-TEMP);
		T2 = (dT*dT) / 0x80000000; 
		OFF2 = 2.5f*Aux;
		SENS2 = 1.25f*Aux;
		
		TEMP = TEMP - T2;
		OFF_ = OFF_ - OFF2;
		SENS = SENS - SENS2;	
	}
	
  yali= (D1_Pres*SENS/2097152-OFF_)/32768;
	MSbaro_h = 44330*(1-pow(((double)(yali))/((double)(101325)),1.0/5.255));
}
以上.c代码

```这个是.h代码c
#ifndef __MS5611_H_
#define __MS5611_H_

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "i2c.h"


/* 函数申明 -----------------------------------------------*/

#define MS561101BA_ADC_RD          0x00
#define	MS561101BA_PROM_RD 	       0xA0
#define MS561101BA_PROM_CRC        0xAE

#define MS561101BA_SlaveAddress    0xEE  //MS5611的地址
#define MS561101BA_RST             0x1E  //cmd 复位

#define	MS561101BA_D2_OSR_4096   	 0x58	// 9.04 mSec conversion time ( 110.62 Hz)
#define	MS561101BA_D1_OSR_4096   	 0x48

#define MS5611_OSR256					 		 0x40
#define MS5611_OSR512					 		 0x42
#define MS5611_OSR1024					   0x44
#define MS5611_OSR2048					   0x46
#define MS5611_OSR4096					   0x48
#define FILTER_num 20

u8  MS5611_init(void);
float Get_High(void);
void Filter_Hight(unsigned int set_hight);
void Hight_PwmOut(void);
void MS561101BA_getPressure(void);
void MS561101BA_getTemperature(void);
void MS561101BA_RESET(void);



unsigned long MS561101BA_getConversion(uint8_t command);
void MS561101BA_GetTemperature(void);

extern uint64_t dT,TEMP;
extern uint32_t yali;
extern uint32_t  Cal_C[7];

#endif


引脚定义图,图中标出了核心板的i2c接口
 至于i2c直接借鉴正点原子的模拟i2c就可以了,不过要记得改下引脚
 最后再说几句,对于我这种不是专业学电的,对于单片机这种的了解,基本上是在前人的基础上,改改引脚,再加上点C语言学习的大学,对于底层的一些通讯协议,只停留在了解的程度上,要是自己编的话,那真是好难啊!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103C8T6读取气压计MS5611,I2C读取模式 的相关文章

  • 三维模型转变为点云模型的好工具——CloudCompare使用小记

    普通三维模型能够直观地展示物体的三维全貌 xff0c 但是在一些场合需要将三维模型变为相应的点云模型进行展示 xff0c 而使用激光雷达等传感器采集到的点云信息往往只能反应模型表面的情况 xff0c 或是使用PCL库中的可执行文件进行转换
  • MyString(字符串类)实现

    字符串类 xff08 MyString xff09 说明文档 一 MyString 类的组成 1 1 私有成员 char data 字符型指针 int length 整型字符串长度 1 2 共有成员 1 2 1 构造与析构函数 MyStri
  • ROMFS的建立

    参考 xff1a VxWorks 7 File Systems Programmer s Guide
  • MyMatrix(二维矩阵类)实现

    二维矩阵类 xff08 MyMatrix xff09 说明文档 一 MyMatrix 类的组成 1 1 私有成员 int row 二维矩阵行数 int col 二维矩阵列数 T data 二维矩阵数据 1 2 共有成员 1 2 1 构造与析
  • 基于CUDA和TCP通信的大数据双机加速计算(CUDA加速、内存优化、TCP多机协同)

    1 环境 技术简介 1 1 程序运行环境 1 server端计算机 操作系统 xff1a Ubuntu 18 04 5 LTS 运行环境 xff1a VSCode或Bash终端 2 client端计算机 操作系统 xff1a Ubuntu
  • RGB888转换为RGB565格式

    RGB888转换为RGB565格式 RGB888用unsigned int 32位字节存储 00000000R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2
  • Keil5界面配置

    配置一 xff1a 绿色 Specification for text selection and caret line selection fore 61 00FFFF selection back 61 004000 caret for
  • Linux内核调试环境(centos+gdb+qemu)

    一 写在前面 主要介绍qemu在Centos中的安装过程 xff0c 以及遇到的一些麻烦 网上教程好多都是在Ubuntu环境下的安装 xff0c 但是公司给的环境大都是Centos xff0c 没办法花了一天的时间 xff0c 磕磕绊绊弄好
  • Linux中修改系统启动项grub

    在修改grub时看到很多资料 xff0c 上来就是直接修改 etc default grub配置文件中的GRUB DEFAULT配置项 xff0c 但是有时候修改不成功 xff0c 本文简单说明一下修改的原理 注 xff1a 根据本人机器上
  • C语言调用cJSON库解析json

    一 源代码文件下载 自己使用时可以只需要其中的cJSON c和cJSON h文件就可以了 xff0c 只需要将cJSON和自己的main文件一起编译即可 下载地址 xff1a cJSONFiles zip 互联网文档类资源 CSDN下载 二
  • Java学习记录 (一)

    使用 BufferedReader 按行读入文档内容 InputStream input file span class token operator 61 span null span class token punctuation sp
  • cmake学习5:如何将自己的库作为第三方库给别人使用

    前言 自己在使用cmake进行编译工程的时候不太了解cmake的基本使用方法 有时候出现找不到第三方库的问题也不知如何排查 因此相对cmake有个稍微系统的认识 希望能用这个强大的工具来更好的为自己的工程服务 因此总结为了几篇博客 主要参考
  • C++头文件包含顺序

    Google C 43 43 编程风格指南 对于头文件的包含顺序是这样的 xff1a Names and Order of Includes link Use standard order for readability and to av
  • VLC Web插件踩坑记录

    VLC Web插件 问题描述 近期由于工作项目组人员变动 xff0c 来到新的项目组 xff0c Leader约谈前期也不安排过多任务 xff0c 但是有一个项目中现有的问题需要解决 项目中视频在线播放功能需要支持在线播放 avi媒体格式
  • cmake添加第三方库

    主要方法 将包含目录添加到构建中 span class token function include directories span span class token punctuation span D span class token
  • UART+DMA数据传输

    DMA的概念 DMA xff08 Direct Memory Access xff09 即直接内存访问 xff0c DMA传输方式无需CPU直接控制传输 xff0c 通过硬件为RAM I O设备开辟一条直接传输数据的通路 xff0c 能使C
  • asp.net core 3.1 应用部署到国产服务器 centos7 自动启动

    首先安装依赖 xff1a 注册 Microsoft 密钥 注册产品存储库 安装必需的依赖项 sudo rpm Uvh https packages microsoft com config centos 7 packages microso

随机推荐

  • Visual Studio2022 离线安装包下载

    首先去官网下载引导程序 xff1a https docs microsoft com en us visualstudio install create an offline installation of visual studio vi
  • MWC-电机、电池螺旋桨搭配

    原址 xff1a http blog sina com cn s blog 402c071e0102v2xv html 电池 电机 螺旋桨搭配 1 电机 1 电机KV值 xff1a 大KV配小桨 xff0c 小KV配大桨 KV值是每1V的电
  • linux系统发送http请求示例:

    http post示例 xff1a curl H 34 Content Type application json 34 X POST d 39 34 ChannelInfo 34 34 algoList 34 34 CarDetectio
  • 博途的多步过程控制, 寄存器寻址

    1 xff0c 实际生产中 xff0c 收到的开关信号往往是短信号 脉冲 2 Step 变化的逻辑和设备的逻辑分开 Step的变化逻辑在实际中往往是设备的反馈信号决定 xff0c 在此处用定时器信号代替 定时器的触发用Step的状态触发 x
  • 栈、堆、方法区存储的内容

    堆区 1 存储的全部是对象 xff0c 每个对象都包含一个与之对应的class的信息 class的目的是得到操作指令 2 jvm只有一个堆区 heap 被所有线程共享 xff0c 堆中不存放基本类型和对象引用 xff0c 只存放对象本身 栈
  • 【verilog】UART串口发送(FPGA)

    简述核心代码仿真测试 简述 串口发送是以一定速率发送单bit数据 xff0c 通常一组数据为10bit 空闲状态为高电平 xff0c 起始位为0 xff0c 中间以低位在前的方式发送8bit数据 xff0c 终止位为1 采用计数器 cnt
  • 栈的基础知识

    0 简介 最近在自己编写一些小的算法的时候 xff0c 深感自己的算法过于臃肿 碰巧Datawhale在新的一期组队学习中组织了数据结构与算法的课程学习 于是就参加了 xff0c 再次感谢Datawhale 首先跟大家分享一下两个自己感觉比
  • AD BOM表导出

    AD BOM表导出 在REPOERT下选择bill of materials 即进行BOM输出 输出操作网上有许多教程 xff0c 这里不进行叙述 xff0c 只提一下 xff0c 必须将Value选择打钩并上拉到展示纵队中 制作自己的模板
  • STM32 的OLED的使用

    7脚OLED依次有引脚 xff1a GND VCC D0 D1 RES DC CS七个脚 模块接口定义 xff1a 1 GND 电源地 2 VCC 电源正 xff08 3 xff5e 5 5V xff09 3 D0 OLED 的 D0 脚
  • 【转载】关于Visual Studio、VC和C++的那些事

    size 61 medium 首先 xff0c 这三个东西有什么区别呢 xff1f VC和C 43 43 是相同的吗 xff0c 有什么区别呢 xff1f 我刚开始学C 43 43 的时候也有这样的问题 xff0c 在这里我来替大家解释一下
  • Byte、bit 、和16进制之间的关系

    bit xff08 比特 xff09 byte xff08 字节 xff09 一 bit xff08 比特 xff09 计算机内存储和处理信息的最小单位是位 xff08 bit 或比特 xff09 xff0c 一个比特值可以是0或1 xff
  • ROS常见问题1——找不到包

    ROS常见问题1 找不到包 1 问题 每次打开终端会提示找不到相关包或者相关文件 比如在查看自己在catkin工作区间下创建的消息时提示找不到文件 xff1a 输入 xff1a span class hljs variable span r
  • 架空线路的基本结构及组成

    最近没有什么实时的新闻发 xff0c 所以小编就给大家整理了一些干货 准备好了吗 xff1f 具体是什么干货呢 xff1f 这句话问的好 xff0c 今天小编就给大家聊一聊电力巡检的基本知识 xff1a 架空线路的基本构成及组成 架空输电线
  • 微信小程序云开发,数据库数据的增加

    1 在wxml中添加一个按钮绑定事件 xff0c 添加数据 2 在云数据库中新建一个数据文件夹list 3 在JS中添加数据 4 在数据库中即可有增加的数据
  • Anaconda如何成功配置OpenCV的开发环境

    1 打开Anaconda的运行环境 xff1a 点击Anaconda Prompt运行 2 进入环境 使盘符在Anaconda 安装目录下 进入Scripts文件夹下 xff1b 3 找到相应路径位置 xff1a 4 敲代码运行到相应盘符
  • jupyter notebook快速入门使用详解及标记的使用(Markdown使用笔记)

    1 软件 xff08 终端的打开 xff09 打开软件之后 xff0c Jupyter Notebook 将在你的默认浏览器中打开 xff0c 网址为 xff1a http localhost 8888 tree 在某些情况下 xff0c
  • F3飞控的调试

    http www moz8 com thread 109506 1 1 html
  • 航模飞机设计基础知识

    部分引用源1 xff1a KSP飞机设计简易指南 http tieba baidu com p 2272016546 FAR进阶气动稳定性和控制教程 http bbs deeptimes org forum php mod 61 viewt
  • SLA技术3D打印机的原理

    SLA是Stereo lithography Appearance的缩写 xff0c 即立体光固化成型法 用特定波长与强度的激光聚焦到光固化材料表面 xff0c 使之由点到线 xff0c 由线到面顺序凝固 xff0c 完成一个层面的绘图作业
  • STM32F103C8T6读取气压计MS5611,I2C读取模式

    笔者最近想用气压计模块来测一下相对高度 xff0c 使用的元器件如下图所示 所使用的最小系统板 所使用的气压计模块 其实读取还是蛮简单的 xff0c 根据核心板引脚图选择I2c接口 xff0c 然后借鉴正点原子的模拟i2c程序 xff0c