关于温度气压传感器MS5611计算公式—温度低于20℃时出错问题的解决办法及验证结果

一、情况说明

       气压传感器MS5611:当温度大于或等于20度时,大家参照网上一般例程程序计算得到的温度和大气压力是正确的,但是当温度低于20度时,网上大部分程序计算得到的温度和大气压力可能都会出错。

二、原因分析

      原例程温度计算公式:

dT = D2_Temp - ((u32)C[5]<<8); 

T = 2000 + dT*C[6]/8388608; 

C[5]为参考温度|TREF,当温度值低于20度时有问题。因为D2_Temp和Cal_C[5] )都是无符号数,无符号数之间使用减法,不对变量做任何处理的话,dT就一直没法得到负值,就没法得到最终正确的温度和气压值。

   三、解决办法

1、参照一些朋友的方法,加上if判断语句:小于20℃    dT *= -1;就 可以解决(具体代码简单自己编一下或搜一下);

2、后来我做了验证试验,添加if语句完全可用,只是CODE会多过百字节;
后来进一步研究了一下,其实有2类4种方法任选其一,都可简单避免这个问题(已放冰箱低温验证过),无需添加if语句。(以下代码,仅供切磋)!
 

void MS5611_GetT(u8 OSR_Temp)                  //获取转换后的温度值	(新代码)
{    						    
    D2_Temp = MS5611_DO_CONVERSION(OSR_Temp); //OSR_Temp= MS5611_D2_OSR_1024/4096;
    delay_ms(10);					          //转换命令中已有延时,可有可无;

//用原代码只改1句(任选1种):
  dT= (s32)D2_Temp - (s32)C[5]*256;       //OK!只将两个都强制转换为s32:结果就对了!已验证;code少114B
  dT= (s32)D2_Temp - (s32)((u32)C[5]<<8); //OK!只将两个都强制转换为s32:结果就对了!已验证;code少117B

//最后我干脆在前面将D1和D2都定义为S32了(ADC数据本身无符号整数,才24位,定义为S32对其他运算都不会有任何影响)(任选1种):
  dT= D2_Temp - (s32)C[5]*256;       //OK!D1和D2都定义为S32,只改(s32)C[5]*256:结果也对!已验证;code少114B
  dT= D2_Temp - (s32)((u32)C[5]<<8); //OK!D1和D2都定义为S32,只改(s32)((u32)C[5]<<8):结果也对!已验证;code少117B;
  
  T = 2000 + dT*C[6]/8388608;               //算出温度值的100倍,2001表示20.01℃; 
   
}

/*** 试验记录(原例程):
     ---------------------------------------
     T0=28.0℃     P0=   1003.6hPa  H0=   81m  (广州)
     T =142903.8℃ P = 348589.4hPa  H =19053m  ▲H =18972m 
     ---------------------------------------
     试验记录(新代码):
     T0=28.0℃     P0=   1003.6hPa  H0=   81m  (广州)
     T =-5.8℃     P =   1003.6hPa  H0=   81m  ▲H =0m
     ---------------------------------------
***/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值