我使用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;
爲什麼兩個微控制器在我是同一個代碼時表現不同?
我會說代碼是由於某種原因不同。下載它和差異。但第二次評估似乎應該使用浮點常量* 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