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 の PT1000-Temperature Sensor でMC9S08DZ60 ( http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08DZ60.pdf ) を使用しています。この関数は、一時を計算して「結果」を返すことを目的としています。しかし、「ベータ」と「シータ」の値は 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があり、範囲は=0resultで -986/4 (≈-247) から=115 または -∞でf_temp≈-4*10 9f_tempf_tempあることがわかります。=14336/125

これは、あなたが何か間違ったことをしている (数式や定数が間違っている) か、十分な情報を提供していない (の有効な範囲f_tempがあると便利です) ことを示唆しています。そして、これらの計算に整数演算を使用すると、 の範囲が原因で問題が発生しますresult

于 2013-04-11T15:40:24.323 に答える