2014-10-10 102 views
0

我使用atmega2560從溫度傳感器tmp36讀取溫度。在讀取兩個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); 
} 

在一個ATMEGA2560答案我得到的是:

temp_buf:55,temp_volt:447,溫度:22.4

在另一ATMEGA2560什麼,我得到的是:

temp_buf:53,temp_volt:-861,溫度:0.00

正因爲如此我做了這個調整

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

爲什麼兩個微控制器在我是同一個代碼時表現不同?

+0

我會說代碼是由於某種原因不同。下載它和差異。但第二次評估似乎應該使用浮點常量* 1000.0/1014.0 * 100.0/196.0 *。還怎麼聲明* temp_buf,temp_volt *,他們是* unsigned int *?理想情況下運行調試器並在運行時檢查。否則,檢查編譯的asm代碼,舊的gcc 4.3.2有時是越野車。 – TMa 2014-10-10 06:40:42

回答

0

有temp_volt和temp_buf雙類型,這樣你不;噸輸,因爲整數運算的數據,例如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); 
+0

我發現有硬件錯誤。放大器沒有充分發揮電壓。但是您的建議對類型轉換問題很有幫助。我鍵入cast到無符號長的原因是縮放值,以便十進制值不被截斷。使用雙變量seeems雖然方便.. – 2014-10-11 03:14:03