请考虑以下代码:
unsigned int beta;
unsigned int theta;
unsigned int m = 4;
unsigned int c = 986;
unsigned int Rpre = 49900;
unsigned int getUAnalog(unsigned char channel) // to get the PT1000 Signal
{
unsigned int result;
unsigned int f_temp;
//select channel and initiate conversion
ADCSC1 |= (channel & 0b11111);
//wait until conversion is complete
while(!ADCSC1_COCO);
f_temp = ADCRH;
f_temp <<= 8;
f_temp += ADCRL;
beta = (((f_temp) / (4096*28))*1000); // warning: possible loss of data.
theta = ((((beta)*(Rpre))/(1-beta))*1000);
result = (theta-c)/(m);
return result;
}
我在CodeWarrior版本5.9.0上使用MC9S08DZ60(http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08DZ60.pdf)和PT1000温度传感器。此函数用于计算温度和返回“结果”。但“beta”和“theta”值仍为0.无变化。
此外,我收到警告为C2705:可能的数据丢失。 “结果”的值不对。请帮忙,因为我不知道出了什么问题!!
提前致谢!
答案 0 :(得分:3)
您的4096*28
不符合16位无符号整数,并且会被截断,导致错误的结果,这就是您收到警告的原因。
但最重要的是......
此
beta = (((f_temp) / (4096*28))*1000); // warning: possible loss of data.
theta = ((((beta)*(Rpre))/(1-beta))*1000);
result = (theta-c)/(m);
相当于
beta = (((f_temp) / (4096*28))*1000);
theta = ((((beta)*(49900))/(1-beta))*1000);
result = (theta-986)/(4);
反过来相当于:
result = ((((((((f_temp) / (4096*28))*1000))*(49900))/(1-(((f_temp) / (4096*28))*1000)))*1000)-986)/(4)
如果您plot it,您会看到discontinuity at f_temp
= 14336/125 ≈ 115和the range of result
is from -986/4 (≈-247) at f_temp
=0 to ≈-4*109 at f_temp
=115 or -∞ at f_temp
=14336/125。
这表明你做错了什么(你有错误的公式或常数)或者你没有给我们足够的信息(f_temp
的有效范围会很好)。由于result
的范围,使用整数算法进行这些计算会有问题。