2007. 2. 27. 18:15

아날로그 디지털 변환기(A/D 컨버터)는 센서와 같은 소자에서 들어오는 아날로그 값을 디지털 값으로 변경하는 기능을 가지고 있으며, 실제 제어기를 구성할 때 없어서는 안될 소자이다.
Atmega128의 경우 10비트 축차 근사형의 A/D 컨버터를 8개 내장하고 있다.
실질적으로 A/D 컨버터는 한개이며, 채널을 바꿔가며 아날로그 신호를 입력받을 수 있다.

A/D 컨버터를 제어하기 위한 레지스터로는
- 아날로그 디지털 멀티플렉서 선택 레지스터(ADMUX)와
- 아날로그 디지털 컨버터 제어 상태 레지스터(ADCSR)가 있다.

① ADMUX는 A/D 신호를 입력받을 채널을 0에서 7까지 선택한다.
② 변환 채널이 선택되면 ADCSR을 설정하여 컨버전 프리스케일러 설정, 컨버터 완료 인터럽트를 설정한다.
③ 모든 설정이 끝나면 전역 인터럽트 플래그를 '셋'하여 인터럽트를 활성화한다.
④ 아날로그 디지털 변환 완료 인터럽트 처리 루틴을 구성한 후,
⑤ ADCSR의 6번 비트를 셋시켜 A/D 변환을 시작하게 한다.

변환이 시작한 후 변환 완료 플래그를 주기적으로 점검하거나 아날로그 디지털 변환 완료 인터럽트를 이용하여 A/D 컨버전 이후의 데이터 처리 루틴을 구성할 수 있다. 변환이 종료되어 변환 데이터를 저장할 때, 반드시 하위 데이터를 먼저 읽어서 저장해야 한다. 왜냐하면, 상위 데이터를 먼저 읽으면, 하위 데이터에 쓰레기 값이 들어갈 수 있기 때문이다.


프로그램 예제
가변저항을 통해서 들어오는 전압의 변화(0~5V)를 측정하여, 포트A로 그 측정값을 출력하는 프로그램

#include <iom128.h>
#include <ina90.h>
#include <sig-avr.h>
#include <interrupt.h>
#define   SYSTEM_CLOCK  16000000   // CLOCK (X-tal frequency)
#define ADSC 0x40
typedef unsigned char BYTE;
BYTE ad_l, ad_h;
SIGNAL(SIG_ADC)    
{
ad_l = inp(ADCL);
ad_h = inp(ADCH);
outp(ad_l, PORTA);
outp(ADSC|inp(ADCSR), ADCSR);
}
void Port_Init(void)
{ //Port_A setting up output
outp(0xFF, DDRA);
}

void ADC_Init(int channel)
{ // Setting ADMUX, ADCSR
// Single Mode
ADMUX = channel;
ADCSR = 0xC9;                        // 0b11001001, Polling method
}

 

int main(void)
{ // External Memory Disable
outp(0x00, MCUCR);
Port_Init();
ADC_Init(0);
sei();

 

while(1)
                {
                }

 

return 0;

}

Posted by Paul Hwang