우리가 사용하고 있는 MCU는 atmega128 이다
참고로 이 MCU는 portA 부터 G까지 있는데
그 중에 F 0~7까지 총 8개의 ADC를 제공한다
ADC는 analog digital converter의 약자인데 아날로그 신호를 디지털신호로 바꿔준다
어떤과정을 거치는지 자세히는 모르지만 통신에서 많이 듣고 배웠던 PCM, 샘플링, 양자화같은걸 하지 않을까 생각중;;;
여기에는 총 3개의 레지스터가 사용되더라
ADMUX register
ADCSRA register
ADCH & ADCL register
이 레지스터들은 다 다루기는 힘들고...책자를 살펴보는게 좋을듯
간단하게
ADMUX는 A/D 컨버터의 아날로그 입력채널을 선택하는 기본기능과 전압소스를 선택하고 변환결과 레지스터저장형식을 지정하고
ADCSRA는 A/D컨버터의 동작을 설정하거나 동작 상태를 표시하는 기능을 수행하고
ADCH 및 ADCL 는 A/D 컨버터의 변환 결과를 저장한다
코드비젼으로 코딩을 할려고 하면 read_adc()라는 함수가 생긴다. (어제 이거 분석하다가 머리가 아팠음;;;)
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
while((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
{
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
while((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
까먹기전에 후닥 대충 정리부터...
일단 첫번째줄은 입력값과 미리정해놓은 전압소스를 or 연산하는데 그 이유는 입력에 따라 몇번 핀을 사용할것인지 정하는것이다
PORTF에 0번을 사용하고 싶으면 입력이 0x00 이고 1번포트는 0x01 2번포트는 0x02 3번은 0x03 이런식으로..
담줄에 0x40과 OR연산을 하는 이유는 A/D 컨버터를 시작하라는 뜻이다..
그리고 while안은 무한루프인데 A/D 컨버터가 끝나면 0x10이 부분에 비트가 1로 설정이 되서 빠져나오게된다..
아직 이해가 안되는 줄이 바로 4번째줄 소스... 왜 0x10이랑 OR연산을 하는지 감이 안잡힌다
책에서는 그 비트가 1로 설정이되면 인터럽트가 설정됐을경우 발생한다고 그러는데;;; 아직 이해가 부족..
후에 ADCH값을 return 해준다
바로 이게 digital 값이다 8비트를 사용할경우 0부터 255중에 있을것이고
10비트를 사용할경우 0부터 1023까지...
나는 센서를 4~5개 이상사용할것이기 때문에 ADC 핀을 8개정도 사용을 해서 그에 따른 값으로
이벤트처리를 할것이다..
후닥 공부해야지 ^-^