ADC 해서 그값을 세그먼트에 나타내는 소스입니다..
#include <mega128.h>
#include <delay.h>
char seg_pat[16]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void AD_disp(int); // A/D 변환값 표시
void main(void)
{
int ad_val;
DDRB = 0xFF; // 포트 B 출력 설정
DDRF = 0xF0; // PF4-PF7 출력, PF0-PF3 입력
ADMUX = 0x0; // ADC0 단극성 입력 선택
ADCSRA = 0x87; // ADEN=1, 16MHz 256분주 -> 125kHz
delay_ms(5);
while(1){
ADCSRA = 0xC7; // ADEN=1, ADSC = 1 변환 시작
while((ADCSRA & 0x10) == 0); // ADIF=1이 될떄까지
ad_val = (int)ADCL + ((int)ADCH << 8); // A/D 변환값 읽기
AD_disp(ad_val); // A/D 변환값 표시
}
}
// A/D 변환값 표시
void AD_disp(int val)
{
float fval;
int ival, buf;
char N100, N10, N1;
fval = (float)val * 5.0 / 1023.0;
ival = (int)(fval * 100.0 + 0.5);
N100 = ival / 100; // 정수부 추출
buf = ival % 100;
N10 = buf / 10; // 소수 첫째 자리 추출
N1 = buf % 10; // 소수 둘째 자리 추출
PORTF = 0b11100000; // SEG 1(소수 둘째 자리 표시)
PORTB = seg_pat[N1];
delay_ms(1);
PORTF = 0b11010000; // SEG 2(소수 첫째 자리 표시)
PORTB = seg_pat[N10];
delay_ms(1);
PORTF = 0b10110000; // SEG 3(정수부 표시)
PORTB = seg_pat[N100];
delay_ms(1);
}
**************************************
fval = (float)val * 5.0 / 1023.0;
ival = (int)(fval * 100.0 + 0.5);
**************************************
이부분이 이해가 안가요..정말 답답합니다..고수님들 부탁점 할게요..ㅜㅜ
즉, 마이컴에 들어오는 값이 0 ~ 1023 (총갯수1024) 인데요. 그것이 0V ~ 5V를 표현합니다.
따라서 비례식으로 보시면 1의 변화량은 위와 같습니다.
AD 채널에 5V가 들어간다고 하면 1023이 나와야 하는데 위의 식에 대입해 보세요. val에 1023을 대입해 보시면
5V가 나옵니다. 머 그런뜻이에요.
ival = (int)(fval * 100.0 + 0.5); 이것은 예를들어 fval 이 2.456볼트가 나온다고 하면 100을 곱했으니 245.6가 되고
반올림 +0.5를 하니 246이 되겠네요.
이런 뜻입니다.
계산식같은 경우는 모를때 값을 대입해 보는것이 최고입니다.
^^
덕분에 알아갑니다 ㄳ 합니다^^: