Embedded 실습/AT91SAM7S256

ADC(Analog-to-Digital Converter) 사용하기 - 3

중동콜링 2013. 5. 1. 22:17

이번에는 ADC를 깨워주는 ADC_init()함수를 작성해보자.

#define ADC_CR   (*((volatile unsigned int *)0xFFFD8000))// Control Register :546P
#define ADC_CHER (*((volatile unsigned int *)0xFFFD8010))// Channel Enable Register
#define ADC_MR   (*((volatile unsigned int *)0xFFFD8004))// Mode Register

#define SWRST 0 // ADC_CR P.547
#define START 1

#define CH0 0
#define CH1 1
#define CH2 2
#define CH3 3
#define CH4 4
#define CH5 5
#define CH6 6
#define CH7 7

#define LIGHT CH4

#define LOWRES 4 // 0 : 10 bit, 1 : 8 bit resolution
#define PRESCAL 8 // 분주비

void ADC_init()
{
    PMC_PCER = 1 << ADC_ID; // 전원공급

    ADC_CR = 1 << START; // ADC CONTROL REGISTER -> SOFTWARE RESET
    ADC_CHER = 1 << LIGHT; // ADC CH04활성화
    ADC_MR = (5 << PRESCAL)|(0 << LOWRES); // 5를 왼쪽으로 미는 PRESCAL,
                                           // 4MHz Conversion Time 10bit resolution
}

PMC_PCER은 앞의 포스트에서 이미 알아보았고,
ADC_CR, ADC_CHER, ADC_MR 레지스터에 대해 알아보자.

ADC_CR 레지스터는 1번 bit에 1을 세팅할 경우 아날로그-디지털 컨버팅을 시작하는 레지스터이다.



ADC_CHER 레지스터는 ADC핀이 사용가능하도록 설정하는 레지스터이므로 

자신이 사용할 핀을 활성화 해주어야 한다. 

내 경우는 4번핀을 사용하기로 하였으므로 

#define CH4 4

#define LIGHT CH4

 ADC_CHER = 1 << LIGHT; // ADC CH04활성화

와 같이 설정해 주었다.


ADC_MR 레지스터는 ADC의 모드를 설정하는 레지스터로 

LOWRES 비트는 해상도를 설정하는 비트이고

PRESCAL 비트는 분주기를 설정하는 비트로 CPU의 클럭 주파수를 쪼개어 속도를 늦출 수 있는 비트이다.


#define LOWRES 4 // 0 : 10 bit, 1 : 8 bit resolution
#define PRESCAL 8 // 분주비

 ADC_MR = (5 << PRESCAL)|(0 << LOWRES); // 5를 왼쪽으로 미는 PRESCAL, 
                                        // 4MHz Conversion Time 10bit resolution



위의 코드에서는 해상도를 0으로 설정하여 4번째 비트인 LOWRES까지 비트연산으로 값을 대입하였고,

PRESCAL은 ADCClock = MCK/((PRESCAL+1)*2) 의 공식에서 5를 비트연산으로 8번째 비트까지 

시프트 해 주었다.


이와 같이 


전원을 공급해주고,             PMC_PCER = 1 << ADC_ID; // 전원공급

컨버젼을 시작시킨 후,          ADC_CR = 1 << START; // ADC CONTROL REGISTER -> SOFTWARE RESET
핀을 활성화시키고,             ADC_CHER = 1 << LIGHT; // ADC CH04활성화
해상도와 분주비를 설정해주면,    ADC_MR = (5 << PRESCAL)|(0 << LOWRES);


ADC를 초기화시키는 작업이 끝난다.