MS5607使用中的问题,温度低于20℃,数值不对

2023-11-07

MS5607使用中的问题,温度低于20℃

马后炮:因为是网上找的代码,懒得看手册,导致后面低于20摄氏度还会有问题,只好认真的看了手册,发现我的代码是ms5611的,照着手册重新改写后就木有问题了!!!不能省的地方就别省了。

公司使用MS5607设计压力传感器,在网上找了一段MS5607的代码,平时用着挺好的,可是测试拿到高低温试验箱中测试我的程序,低于20℃后,压力值直接就起飞了,几十万,哈哈哈,惊喜!

下面是原来的代码:

uint16_t		Cal_C[7]; //用于存放PROM中的6组数据
uint32_t		D1_Pres, D2_Temp; // 存放数字压力和温度
float			Pressure; //温度补偿大气压
float			dT, Temperature, Temperature2; //实际和参考温度之间的差异,实际温度,中间值

double OFF, SENS; //实际温度抵消,实际温度灵敏度
float Aux, OFF2, SENS2; //温度校验值
uint32_t ex_Pressure; //串口读数转换值
uint8_t exchange_num[8];

char MS56XX_GetTemperature ( uint8_t OSR_Temp )
{
	D2_Temp = MS56XX_Do_Conversion ( OSR_Temp );
	
	osDelay ( 10 );
	
	dT	= D2_Temp - ( ( ( uint32_t ) Cal_C[5] ) << 8 );
	
	Temperature	= 2000 + dT * ( ( float ) Cal_C[6] ) / 8388608; //算出温度值的100倍,2001表示20.01°
	
	return 1;
}

char MS56XX_GetPressure ( uint8_t OSR_Pres )
{
	D1_Pres = MS56XX_Do_Conversion ( OSR_Pres );
	
	osDelay ( 10 );
	
	OFF	=  ( ( int64_t )Cal_C[2] << 17 ) + ( ( int64_t ) Cal_C[4] * dT ) / 64.0;
	SENS 		= ( ( int64_t ) Cal_C[1] << 16 ) + ( ( int64_t ) Cal_C[3] * dT ) / 128.0;
	//温度补偿
	if ( Temperature < 2000 ) // second order temperature compensation when under 20 degrees C
	{
		Temperature2 = ( dT * dT ) / 0x80000000;
		Aux			= ( Temperature - 2000 ) * ( Temperature - 2000 );
		OFF2 		= 2.5 * Aux;
		SENS2		= 1.25 * Aux;

		if ( Temperature < -1500 )
		{
			Aux			= ( Temperature + 1500 ) * ( Temperature + 1500 );
			OFF2 		= OFF2 + 7 * Aux;
			SENS2		= SENS + 5.5 * Aux;

		}
	}
	else		//(Temperature > 2000)
	{
		Temperature2 = 0;
		OFF2 		= 0;
		SENS2		= 0;
	}

	Temperature = Temperature - Temperature2;
	OFF			= OFF - OFF2;
	SENS 		= SENS - SENS2;
	Pressure = ( D1_Pres * SENS / 2097152 - OFF ) / 32768;

	Temperature /= 100;
	Pressure /= 100;

	return 1;
}

现在的问题是,低于20℃后,压力值直接就起飞了。

所以,先看看和温度相关的计算。

dT	= D2_Temp - ( ( ( uint32_t ) Cal_C[5] ) << 8 );
  •  

D2_Temp和Cal_C[5] )都是无符号数,但是这里用的减法,却没法出现负值,所以要修改一下。

char MS56XX_GetTemperature ( uint8_t OSR_Temp )
{
	D2_Temp = MS56XX_Do_Conversion ( OSR_Temp );

	osDelay ( 10 );

	if(D2_Temp > ( ( ( uint32_t ) Cal_C[5] ) << 8 ))
	{
		dT	= D2_Temp - ( ( ( uint32_t ) Cal_C[5] ) << 8 );
	}
	else
	{
		dT	= ( ( ( uint32_t ) Cal_C[5] ) << 8 ) - D2_Temp;
		dT *= -1;
	}
	Temperature	= 2000 + dT * ( ( float ) Cal_C[6] ) / 8388608; //算出温度值的100倍,2001表示20.01°

	return 1;
}

恩,问题就这么解决了。


以上是ms5611的,我贴出来Ms5607的,其实就是改动了计算公式:

/************************************************************
* 函数名:MS56XX_GetTemperature
* 描述 : 读取数字温度
* 输入	:过采样率
* 输出	:无
*/
char MS56XX_GetTemperature ( uint8_t OSR_Temp )
{
	D2_Temp = MS56XX_Do_Conversion ( OSR_Temp );

	if(D2_Temp == 0)
		return 0;
	
	osDelay ( 10 );

	if(D2_Temp > ( ( ( uint32_t ) Cal_C[5] ) << 8 ))
		dT	= D2_Temp - ( ( ( uint32_t ) Cal_C[5] ) << 8 );
	else
	{
		dT	= ( ( ( uint32_t ) Cal_C[5] ) << 8 ) - D2_Temp;
		dT *= -1;
	}
	Temperature	= 2000 + ( dT * Cal_C[6] ) / (0x00000001 << 23); //算出温度值的100倍,2001表示20.01°

	return 1;
}


/************************************************************
* 函数名:MS56XX_GetPressure
* 描述 : 读取数字气压
* 输入	:过采样率
* 输出	:无
*/
char MS56XX_GetPressure ( uint8_t OSR_Pres )
{
	D1_Pres = MS56XX_Do_Conversion ( OSR_Pres );

	if(D1_Pres == 0)
		return 0;
	
	osDelay ( 10 );
	
	OFF	=  ( ( int64_t )Cal_C[2] * (0x00000001 << 17) ) + ( ( int64_t ) Cal_C[4] * dT ) / 64.0;
	SENS 		= ( ( int64_t ) Cal_C[1] * (0x00000001 << 16) ) + ( ( int64_t ) Cal_C[3] * dT ) / 128.0;

	//温度补偿
	
	if ( Temperature < 2000 ) // second order temperature compensation when under 20 degrees C
	{
		T2 = ( dT * dT ) / (( uint64_t )0x0000000001 << 31);
		Aux			= ( Temperature - 2000 ) * ( Temperature - 2000 );
		OFF2 		= 61 * Aux / 16;
		SENS2		= 2 * Aux;
		if ( Temperature < -1500 )
		{
			Aux			= ( Temperature + 1500 ) * ( Temperature + 1500 );
			OFF2 		= OFF2 + 15 * Aux;
			SENS2		= SENS2 + 8 * Aux;
		}
	}
	else		//(Temperature > 2000)
	{
		T2 = 0;
		OFF2 		= 0;
		SENS2		= 0;
	}

	Temperature = Temperature - T2;
	OFF			= OFF - OFF2;
	SENS 		= SENS - SENS2;
	//P = D1 * SENS - OFF = (D1 * SENS / 2 21 - OFF) / 2 15
	Pressure = ( D1_Pres * SENS / (0x00000001 << 21) - OFF ) / (0x00000001 << 15);

	Temperature /= 100;
	Pressure /= 100;

	return 1;
}

https://blog.csdn.net/zhxlx/article/details/93984496 

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

MS5607使用中的问题,温度低于20℃,数值不对 的相关文章

  • stm32F407中arr与psc以及pwm之间的关系

    stm32F407pwm控制 A Stm32F407主频 xff08 即CPU的时钟频率 xff09 xff1a 168MHZ B arr是计数 xff0c 从0到设定值 xff0c 然后返回至0重新开始计数 xff08 也可以看成pwm的
  • 基于stm32f407通过USB配置CH340

    1 在设备枚举的case ENUM SET CONFIGURATION 设置配置 状态后 xff0c 配置CH340的波特率 xff0c 然后跳过CBW和CSW协议 xff1b 直接采用批量传输的方式进行数据传输
  • STM32F407以太网DMA描述符和数据链路层收发数据

    本文主要介绍STM32F407单片机MAC内核的DMA描述符 xff0c 以及如何实现以太网二层的数据收发 这一篇先实现数据链路层的正常收发 xff0c 下一篇再去介绍如何把LWIP移植到单片机上 大部分资料都是把LWIP移植和以太网卡驱动
  • STM32F407-串口数据传送

    一 串口基础 1 常用的串口相关寄存器 USART SR状态寄存器USART DR数据寄存器USART BRR波特率寄存器 2 串口操作相关库函数 xff08 省略入口参数 xff09 void USART Init 串口初始化 xff1a
  • STM32F407-ADC(模数转换)

    一 硬件 STM32F407开发板 xff0c 杜邦线 通过通道获取板载电压的模拟输入信号转变为数字信号 xff0c 并通过转换变成电压 STM32F407有3个ADC xff0c 每个ADC有16个通道 xff0c 下表为ADC通道对应的
  • STM32F407控制42,57两个步进电机用传感器限制位置

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • 基于STM32F407的七要素气象站(气象传感器)CR-WS数据处理实现

    一 七要素气象站介绍 1 七要素气象站介绍 开发板还是采用STM32F407 485连线 xff1a 如果买了变送器就按照下图连线 xff1a 没有买变送器的话 xff0c 直接从气象站上拉线 xff0c 红正黑负 xff0c 黄485 A
  • STM32F407__串口转422总线__一主多从通信

    从机的422原理图如下所示 xff1a 主机的422原理图 xff1a 一 通信大体原理 在通信过程中 xff0c 主机向总线上发送数据 xff0c 从机都能从总线上接收到数据 xff0c 根据设置的地址 xff0c 选在是否是本板需要的数
  • 基于STM32F407时钟配置学习

    STM32F4x系列时钟树如下 xff1a 1 系统时钟SYSCLK 在STM32F407中 xff0c 除了一些特定的时钟 xff08 例如 xff0c USB OTG FS时钟 xff0c I2S时钟 xff09 外 xff0c 系统所
  • MS5611气压计数据测试报告

    气压计测得气压和温度值为模拟量 xff0c ms5611气压计会自动将模拟量转换成数字量 xff0c 对于不同的精度 xff0c 转换时间也不相同 本测试选用的精度为最高的OSR 61 4096 xff0c 如下表所示 xff0c 转换时间
  • 亲测+STM32F407+freertos+cumax+串口空闲中断和can接收发送

    STM32F407 freertos cumax 串口空闲中断和can接收发送 本人最近再学习使用cumax软件搭建stm32f4的freertos系统 废话不多说 首先介绍一下主要的硬件和软件配置 Cumax 采用Version6 1 1
  • MS5611气压传感器中文资料

    MS5611是新一代高分辨率气压传感器 xff0c 分辨率可达10cm 其内置24位AD转换器 xff0c 支持IIC和SPI通讯协议 xff0c 传输速率可达20MHz 其转换时间可以设置 测量 工作范围 xff1a 10 1200mba
  • STM32F4 使用SPI读取气压计MS5611的数据并转化为大气压强

    ms5611是同时支持I2C和SPI通信协议的气压计芯片 已经很普遍的被用在飞行器控制板上作为高度传感器 开发过stm32的朋友都知道它的硬件I2C是由bug的 xff0c 一般使用的都是自己编写的软件I2C通信协议 但是其硬件SPI通信却
  • STM32F407的UART4配置

    复用PC10 PC11作为串口四的TX RX void uart4 init u32 bound GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitStructu
  • BMP085气压传感器驱动 &MS5611经验

    BMP085是新一代的小封装气压传感器 主要用于气压温度检测 在四轴飞行器上可以用作定高检测 该传感器属于IIC总线接口 依然沿用标准IIC驱动程序 使用该传感器需要注意的是我们不能直接读出转换好的二进制温度数据或者气压数据 必须先读出一整
  • Micropython应用篇四---F407VE Black开发板IIC OLED1306

    Micropython应用篇四 F407VE Black开发板IIC OLED1306显示 最近一段时间做Keil例程比Micropython多很多 无论如何 Micropython Arduino作为嵌入式入门篇也发过一些文章 包括公司的
  • 气压计MS5611编程操作流程

    文章更新版本 时间 备注 修订人 V0 1 发布于 2019 09 21 11 03 46 初始版本 libo 文章目录 一 开发笔记 二 初始化与工作流程 1 从PROM读取出厂校准值 2 启动温度AD转换 读取AD值 3 启动气压AD转
  • STM32F407单片机通用24CXXX读写程序(KEIL),兼容24C系列存储器(24C01到24C512),支持存储器任意地址跨页连续读写多个页

    一 AT24CXXX容量 AT24C01 AT24C02 AT24C04 AT24C08 AT24C16 AT24C32 AT24C64 AT24C128 AT24C256 不同的xxx代表不同的容量 AT24CXXX bit容量 Byte
  • 单片机串口实现字符串命令解析---使用函数指针(类似哈希表)

    通常情况下串口通信用的大多数都是用十六进制数据来传输指令 比如最常见的modbus的通信 如读保持寄存器指令 01 03 00 00 00 01 84 0A 这种十六进制的指令在这里就不讨论了 想要详细了解可以看往期的文章 串口相关文章链接
  • STM32F407 USART3串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一

随机推荐

  • 送呆萌的她一个皮卡丘(Python实现)

    目录 1 呆萌的她 2 思维需要革新 3 送她的一个漂亮皮卡丘 4 Python完整代码奉上 1 呆萌的她 又是一季春风暖阳下 你是一湾一湾羞涩的春波 静静感受着 你垂下的枝膊 在我的脸上轻轻抚摸 一对春燕 低低掠过 涟漪乍起 是你浅浅的笑
  • 计算机的性能公式

    cpu执行时间 简称CPU时间 表示执行某一任务在CPU上所花费的时间 不包括等待I O或运行其他程序的时间 程序的cpu执行时间 cpu时钟周期数 时钟周期时间 cpu时钟周期数 主频 要想缩短cpu执行时间 最简单的方法就是缩短cpu的
  • 连表查询可以跟多个条件

    连表查询时后面条件可以跟多个条件 select from tabA a tabB b where a userID b userID and a userName b userName select from tabA a left joi
  • 基于JWT(JSON Web Token)的工程引入与落地实践

    JWT从认识 起飞到落地 1 JWT认识 1 1 什么是JWT 1 2 透明令牌与自包含令牌 2 JWT起飞 2 1 JWT的用处 2 2 JWT的原理 2 3 JWT的结构 2 3 1 JWT头 2 3 2 有效载荷 2 3 3 签名哈希
  • C语言中数组所占字节怎么算

    数组在内存中所占字节数可以使用sizeof操作符来计算 该操作符是专门用于检测类型或变量或数组在内存中所占有的空间 字节数 语法 sizeof x 其中x是类型名 变量名或数组名等 可以返回x所占字节数 C语言中计算一个数组占内存多少空间
  • 翻斗式雨量计的组成与工作原理

    雨量计也叫雨量记录仪 量雨计 测雨计 是常规的气象检测仪器 气象部门通过它来监测计量降雨量和降雨强度 常见的有虹吸式雨量计 翻斗式雨量计和称重式雨量计等 因为翻斗式雨量计方便携带安装 数据相对精确 因此在农业气象监测中广泛应用 1 翻斗式雨
  • lua的coroutine

    编辑器是IDEA lua协程学习汇总 lua协程 可以使用debug模式一步步查看程序的运行 coroutineFunction function a b coroutine yield 挂起正在运行的协程 传递给yield的参数将成为re
  • 墨者靶场(综合)

    初级 综合 表单暴力破解实训 第1题 提示 直接使用BurpSuite抓包跑数字 HTML前端代码分析 暗链 提示 打开页面 访问得到key值 SVN信息泄露漏洞分析 第1题 背景介绍 提示 1 使用dirsearch扫描地址 2 使用Na
  • click house索引

    稀疏索引 好处 范围查询过滤比较快 弊端 不适合点对点查询 索引必须依赖物理存储顺序 排序字段a b c 索引字段 a ab abc 索引字段必须是排序字段的前缀 语句级多线程 由于一条数据 不适合高qps的高频短查询 更适合低频的大数据复
  • PCL DBSCAN密度聚类

    目录 一 算法原理 1 密度聚类 2 参考文献 二 代码实现 三 结果展示 四 附 matlab验证代码 一 算法原理 1 密度聚类 密度聚类是将簇定义为密度相连的点的最大集合 能够把具有足够高密度的区域划分为簇 并可在噪声的空间数据库中发
  • Android面试常用面试题

    1 Android手机横竖屏切换的问题及其解决方案 默认情况下 横竖屏切换的时候 系统会销毁当前的Activity 然后新建一个Activity 显然 太浪费资源了 http www cnblogs com zhangkai281 arch
  • 机器学习(machine learning)之AdaBoost算法

    转载自 http blog csdn net haidao2009 article details 7514787 菜鸟最近开始学习machine learning 发现adaboost 挺有趣 就把自己的一些思考写下来 主要参考了http
  • TCP吞吐量的理论计算公式

    源 本篇文章本来是收录AIMD拥塞控制吞吐量的计算公式 Valve游戏公司开源GameNetworkingSockets 1 既支持可靠的数据传输 也支持不可靠的数据传输 数据的传输速率 是直接计算出来的 const int64 k nMi
  • HDLBits刷题_Verilog Language_Module pos

    学习内容 This problem is similar to the previous one module You are given a module named mod a that has 2 outputs and 4 inpu
  • 2019年TI电赛总结

    本人某不知名大学菜鸡一个 近几年比赛分析 首先 TI公司承办了未来好几年的电子设计竞赛 TI杯近几年出题还是很有技术的 省赛好多题目可以说是为国赛做准备的 所以想要参加国赛取得好成绩的同学 就要提前参加省赛或者做一做省赛的相关题目 之前不是
  • 使用.debug_info调试信息查看结构体、位域变量内存分配

    上一篇使用readelf查看了 debug info调试信息 现在我们对它进行分析 首先将调试信息保存到文档中 readelf wi test gt out txt 结构体分析 首先 我在结构体里定义了一个char型和一个double型 编
  • 容器的docker-compose怎样写agent.jar配置 -javaagent和其他环境配置怎么写

    在 Docker Compose 文件中配置 Java Agent 以及其他环境配置时 您需要将这些配置添加到 environment 字段中 以下是一个示例 演示了如何在 Docker Compose 文件中配置 Java Agent 和
  • 盘点各种边缘检测算子

    Sobel算子 原理 Sobel算子是一种基于梯度算子的边缘检测算子 它使用两个3x3的卷积核 分别对图像在水平和垂直方向进行卷积操作 然后将两个方向的梯度响应合并得到边缘强度 特点 Sobel算子简单易实现 计算效率高 对噪声有一定的抑制
  • MES系统的优势和上了MES系统后的成果

    1 辅助排产 2 状态监控 3 进度监控 4 效率统计 5 品质管理 在五大功能的保驾护航下 树字工厂机床管家云具有六大优势 1 花费低 2 上线快 3 使用易 4 功能全 完全具备MES的核心功能 智能辅助排产 进度监控 设备状态监控 生
  • MS5607使用中的问题,温度低于20℃,数值不对

    MS5607使用中的问题 温度低于20 马后炮 因为是网上找的代码 懒得看手册 导致后面低于20摄氏度还会有问题 只好认真的看了手册 发现我的代码是ms5611的 照着手册重新改写后就木有问题了 不能省的地方就别省了 公司使用MS5607设