#include <mega128.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
float ntc_val;
float temperature;
float sensor_adc = 0;
signed int dis_temperature = 0;
void main(void)
{
PORTA=0x00;
DDRA=0xff;
PORTB=0x00;
DDRB=0xff;
PORTC=0x00;
DDRC=0xff;
PORTD=0x00;
DDRD=0xff;
// ADC 설정
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: ADC Stopped
ACSR=0x80;
SFIOR=0x00;
ADMUX=0x40;
ADCSRA=0x8D;
while (1)
{
//ADC 값 읽어 오기
ADMUX = 0x40;
ADCSRA |= 0x40;
while ((ADCSRA & 0x10)==0);
sensor_adc = (float)(ADCW);
// NTC_R(NTC RESISROT VALUE Ohm)
// ADC 값 읽어 다가 NTC_R 저항값 산출
// NTC_R /(NTC_R + 10000(분앖저항값 Ohm)) = ADC / 1023(10biT Resolustion)
// NTC_R 에관해 풀이 하면
// NTC_R = 10000*ADC / 1023-ADC
ntc_val = (10000 * sensor_adc) / (1023 - sensor_adc);
//NTS 시리즈 써미스터 데이터 시트에 온도에 따른 저항 테이블 값을 토대로 함수를 추출
//(706.6 * ntc_val(NTC_RESISTOR Ohm) ^ -0.1541) ? 146
// ! 좀더 정밀한 온도값을 원할 경우 테이블 값을 저장해 비교 하는 방식을 사용 하세요.
temperature = (706.6 * pow(ntc_val,-0.1541)) - 146;
//온도를 소수점 한자리까지 표현 하기 위해 10을 곱한후 정수형 변환
dis_temperature = (signed int)(temperature);
if(dis_temperature>30)
PORTC=0x01;
else if(dis_temperature>20)
PORTC=0x02;
else
PORTC=0x04;
}
}
'프로그래밍 > AVR Atmega' 카테고리의 다른 글
Atmega 온도센서 및 세그먼트 표시 (0) | 2017.10.19 |
---|---|
Atemga 세그먼트 출력 (0) | 2017.10.19 |
atmega128 인터럽트 (0) | 2017.10.19 |