0

atmega2560を使用して温度センサーtmp36から温度を読み取っています。温度センサーのデジタル値を読み取り、2 つの atmega2560 マイクロコントローラーで読み取り可能な形式に変換した後、異なる答えが得られます。なぜこのような答えが得られるのか。? コードの一部を以下に示します。

float temp;   // global variable

{
unsigned long temp_volt;
unsigned char temp_h, temp_l;
unsigned int temp_buf;

temp_l=ADCL;
temp_h=ADCH;
temp_buf=((int)temp_h<<8)|temp_l;


temp_volt =(((unsigned long)temp_buf*256*10)/1023) - 993;   //  subtract offset gain    
temp = ((float)temp_volt*1000/1014*100/196)/10;       //  adjust the gain 
printf("temp_buf: %d, temp_volt: %d, temp: %0.2f\r\n", temp_buf, temp_volt, temp);
}

私が得た1つのATMEGA2560の回答は次のとおりです。

temp_buf: 55、temp_volt: 447、temp: 22.4

別の ATMEGA2560 で得たものは次のとおりです。

temp_buf: 53、temp_volt: -861、temp: 0.00

このため、この調整を行いました

temp_volt =(((unsigned long)temp_buf*256*100)/1023) - 904;

同じコードを使用しているのに、2 つのマイクロコントローラーの動作が異なるのはなぜですか?

4

1 に答える 1

0

temp_volt と temp_buf の double 型を使用して、整数演算のためにデータを失わないようにします。たとえば、7/4 = 1 と 7.0/4.0 = 1.75 です。

double temp_volt;
double temp_buf;

そしてあなたの計算は次のとおりです:

temp_volt =temp_buf*256.0*10.0)/1023.0) - 993.0;   //  subtract offset gain    
temp = ((float)temp_volt*1000.0/1014.0*100.0/196.0)/10.0;       //  adjust the gain 

結果をintとして必要な場合は、最終ステップでそれを行います。

 temp_volt =(double)(int)(temp_buf*256.0*10.0)/1023.0) - 993.0);
于 2014-10-10T06:57:20.463 に答える