ADC(Analog-to-Digital Converter) 사용하기 - 3
이번에는 ADC를 깨워주는 ADC_init()함수를 작성해보자.
#define ADC_CR (*((volatile unsigned int *)0xFFFD8000))// Control Register :546P |
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를 초기화시키는 작업이 끝난다.