请考虑以下代码:
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;
}
我使用MC9S08DZ60 (http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08DZ60.pdf)与pt1000温度传感器在CodeWarrior版本5.9.0。该函数用于计算temp并返回"result"。但是"beta"one_answers"theta"的值仍然是0。没有变化。
我也得到警告作为C2705:可能丢失的数据。result的值不正确。请帮忙,因为我不知道出了什么问题!!
提前感谢!
您的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)
如果你把它画出来,你会发现在f_temp
=14336/125≈115处有一个不连续,result
的范围从f_temp
=0时的-986/4(≈-247)到f_temp
=115时的≈-4*109或f_temp
=14336/125时的-∞。
这表明要么你做错了(你有错误的公式或常数),要么你没有给我们足够的信息(f_temp
的有效范围(s)将是很好的)。由于result
的范围,使用整数算法进行这些计算是有问题的。