1

请考虑以下代码:

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 警告:可能丢失数据。“结果”的价值是不对的。请帮助,因为我不知道出了什么问题!

提前致谢!

4

1 回答 1

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)

如果您绘制它,您会看到在= 14336/125 ≈ 115处存在不连续性,f_temp并且的范围result从 =0 处的 -986/4 (≈-247)到=115 或 -∞处f_temp的 ≈-4*10 9f_tempf_temp=14336/125处。

这表明要么你做错了什么(你有错误的公式或常数),要么你没有给我们足够的信息(有一个或多个有效范围f_temp会很好)。由于result.

于 2013-04-11T15:40:24.323 回答