浮点运算异常

时间:2014-10-10 05:56:16

标签: avr atmega adc

我正在使用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,temp:22.4

在另一台ATMEGA2560上我得到的是:

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

因此我做了这个调整

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

为什么当我使用相同的代码时,两个微控制器的行为会有所不同?

1 个答案:

答案 0 :(得分: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);