BASIC4MCU | 질문게시판 | atmega128 adc 온도계 값 lcd에 나타내기 한번만 도와주세요ㅠ
페이지 정보
작성자 파이라닝 작성일2021-12-15 19:55 조회1,182회 댓글2건본문
int ADC_read (void)
{
ADCSRA |= (1<<ADSC);
while((ADCSRA & 0x10) == 0x00);
_delay_ms(2000);
return ADCH;
}
int main(void)
{
DDRD = 0x8F; // 스위치
PORTD = 0xFF;
DDRE = 0xFF; //output
DDRC = 0x00; //input
int adc_result;
float Vin;
int tem;
char buff[20];
char calendar[20];
char time[20];
LCD_init();
UART0_init();
TIMSK = 0x01; // R/W 선택 TIMER 0 사용
TCCR0 =0x04; // 분주비 64
TCNT0 =6; // 6에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
sei();
ADMUX = (1 << REFS0) | (1<<ADLAR) | (1 << REFS1);
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
while (1)
{
if ((PIND & 0x01)== 0x00)
{
mode++;
if(mode >=3)mode =0;
}
switch(mode)
{
case 0:
LCD_clear();
LCD_write_string("Current Time:");
sprintf(time,"%2dH %2dM %2dS",hour,min,sec);
LCD_goto_XY(1,0);
LCD_write_string(time);
_delay_ms(1000);
break;
case 1:
LCD_clear();
LCD_write_string("Today:");
sprintf(calendar,"%2dY %2dM %2dD",year,month,day);
LCD_goto_XY(1,0);
LCD_write_string(calendar);
_delay_ms(1000);
break;
case 2:
adc_result = ADC_read();
Vin = adc_result * 2.56/1024;
tem = (int)(Vin*100);
itoa(tem, buff, 10);
LCD_clear();
LCD_write_string("Current temp:");
LCD_goto_XY(1,0);
LCD_write_string(buff);
_delay_ms(1000);
}
}
}
스위치를 눌렀을 때 lcd 화면에 시계와 날짜는 잘 나타납니다.그런데 온도계 값이 정확하게 나오지 않네요ㅠㅠ정확한 온도가 나오지 않고 0으로 떨어졌다가 8~9로 올라갔다가 계속 이러는데뭐가 문제일까요??ㅠㅠ손으로 온도계를 잡으면 14까지는 값이 올라가네요ㅠ근데 정확한 온도가 아닌거 같습니다ㅠ
댓글 2
조회수 1,182master님의 댓글
master 작성일
adc_result = ADC_read();
adc_result 을 시리얼모니터나 LCD에 출력해서 온도가 제대로 읽히는지 계산해보세요
master님의 댓글
master 작성일
ADC값이 비 정상적이라면 온도센서에 문제가 있는 것이고
ADC값이 정상적이라면 계산 코드에 문제가 있는 것입니다.