2014-10-10 3 views
0

atmega2560을 사용하여 온도 센서 tmp36에서 온도를 읽습니다. 온도 센서 디지털 값을 읽고 두 개의 atmega2560 마이크로 컨트롤러에서 판독 가능한 형태로 변환 한 후에 나는 다른 해답을 얻습니다. 왜 이런 종류의 대답을 얻습니까? ? 코드의 조각은 현재 다음과 같습니다 : 내가 가진 하나 개 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); 
} 

은 다음과 같습니다

temp_buf : 55, temp_volt : 447, 온도 : 나는이 뭐가 다른 ATMEGA2560에 22.4

:

temp_buf : 53, temp_volt : -861, 온도 :이 때문에 0.00

나는이 조정을

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

왜 동일한 코드를 사용할 때 두 개의 마이크로 컨트롤러가 다르게 동작합니까?

+0

나는 그 코드가 다른 이유에서 온다고 말하고 싶습니다. 그것을 다운로드하고 비교하십시오. 그러나 두 번째 평가에서는 float 상수 * 1000.0/1014.0 * 100.0/196.0 *을 사용해야합니다. 또한 선언 된 방법 * temp_buf, temp_volt *, 그들은 * unsigned int *입니까? 이상적으로는 디버거를 실행하고 런타임에 검사하십시오. 그렇지 않으면 컴파일 된 asm 코드를 확인하십시오. 구형 gcc 4.3.2는 때때로 버그입니다. – TMa

답변

0

당신이 돈 있도록 temp_volt 및 temp_buf에 대한 double 형을 가지고, t 때문에 정수 연산의 데이터가 손실, 예를 들어, 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

하드웨어 오류가 있음을 알게되었습니다. 앰프가 전압을 충분히 공급하지 못했습니다. 그러나 조언은 유형 변환 문제에 도움이되었습니다. 내가 부호없는 long 형으로 캐스팅 한 이유는 십진수 값이 잘리지 않도록 값을 스케일하는 것이 었습니다. 두 변수를 사용하면 편리한 것 같습니다. –