一、情况说明
气压传感器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
---------------------------------------
***/