여기에서는 이전 포스트에 이어서 ACD에 관련된 레지스터들에 대해서 알아보도록 하겠다.
[ADCH:ADCL] 레지스터
A/D 변환 결과는 10비트이기 때문에 SFR 두 개가 필요한데 ADCH과 ADCL 두개의 레지스터가 변환된 값이 저장되는 레지스터이다. 변환값의 상위 바이트와 하위 바이트를 저장하는데 각각 사용되고 ADC의 최대 분해능이 10비트이기 때문에 이중에 10개의 비트만이 변환 값을 저장하는데 사용된다. 뒤에 설명할 ADMUX 레지스터의 ADLAR 비트의 값에 따라 저장하는 방식은 두 가지가 있는데 이를 [그림 1]과 [그림 2]에 도시하였다.
[그림 1] ADLAR='0' 일 때 변환 결과를 저장하는 방식 (우측 정렬)
[그림 2] ADLAR='1' 일 때 변환 결과를 저장하는 방식 (좌측 정렬)
변환 값을 10비트 모두 사용하고자 한다면 [그림 1]과 같이 ADLAR='0'으로 설정한 후 상위 6개의 비트는 무시하고 사용하면 된다. 하지만, 변환 결과를 8비트만 쓰고 싶을 때에는 [그림 2]와 같이 ADLAR='1'로 설정한 후 ADCH 값만을 취하여 사용하면 된다. 이후로는 16비트 메모리 [ADCH:ADCL]을 줄여서 ADC라고 표기한다. A/D 변환 결과는 다음과 같은 식으로 계산할 수 있다.
여기서 Vin 은 선택된 입력핀의 전압값이고 Vref 는 기준전압이다.
ADCSRA 레지스터
ADCSRA (ADC Control and Status Register) 레지스터는 ADC의 전반적인 동작을 제어하는 기능을 수행한다. 구조는 다음과 같다.
[그림 3] ADCSRA 레지스터의 구조
• ADEN (ADc ENable) 비트는 ‘1’로 설정해야 ADC의 모든 동작이 허용된다. ‘0’으로 설정하면 ADC의 모든 동작이 금지되며 만약 변환 중에 ‘0’으로 클리어되면 변환이 즉시 중지된다.
• ADSC (ADc Start Conversion) 비트가 ‘1’로 세트되면 ADC가 시작된다. 연속 변환 모드에서는 이 비트가 세트되면 첫 번째 변환이 수행된 이후 자동으로 계속 변환이 수행된다. ADEN 비트가 ‘1’로 설정된 이후의 최초의 변환은 ADC의 초기화 때문에 25 클럭이 소요되고 두 번째 변환부터는 13클럭이 소요된다. 변환이 진행 중이라면 이 비트를 읽으면 ‘1’ 값이 읽혀지고 변환이 완료되면 ‘0’값으로 되돌아간다.
• ADFR (ADc Free Running select) 비트는 ADC를 연속 변환 모드로 설정한다. 연속 변환 모드에서는 ADC 변환이 자동으로 연속적으로 일어나므로 임의의 시점에서 최신 변환 결과를 읽어들일 수 있다.
• ADIF (ADc Interrupt Flag) 비트는 A/D 변환이 완료되어 ADC 레지스터 값이 갱신되고 나면 ‘1’로 세트되며, 만약 ADIE 비트가 ‘1’로 세트된 상태라면 인터럽트를 요청하게 된다. 해당 ISR이 호출되면 ADIF 비트는 자동으로 ‘0’으로 리셋되며, 만약 사용자가 강제로 이 비트를 ‘0’으로 클리어하려면 이 비트에 ‘1’을 써주어야 한다.
• ADIE (ADc Interrupt Enable) 비트를 ‘1’로 설정하면 A/D 변환완료 인터럽트를 허용한다. 실제로 인터럽트가 발생하려면 SREG 레지스터의 I비트가 ‘1’로 설정되어 있어야 한다.
• ADPS2:0 비트들은 ADC에 인가되는 클럭의 분주비를 선택한다. A/D변환기에서 사용하는 클럭은 10비트 연속 변환 모드가 정상적으로 수행되기 위해서 50~200KHz 범위 이내이어야 한다고 데이터쉬트에 기록되어 있다. 따라서 본 실습키트의 경우처펌 시스템클럭이 16MHz일 때에는 정상적인 A/D변환을 위해서는 <표 8.3.1>에 표시한 바와 같이 ADSP2:0='110' 혹은 ADSP2:0='111' 이어야 한다.
단, 10비트보다 낮은 분해능으로 사용할 경우에는 200KHz보다 더 높은 주파수를 사용할 수 있다고 되어 있다.
[표 1] ADC로 인간되는 클럭의 분주비
ADSP2 | ADSP1 | ADSP0 | 분주비 | clksys=16MHz 일 경우 |
0 | 0 | 0 | 2 | 8,000KHz |
0 | 0 | 1 | 2 | 8,000KHz |
0 | 1 | 0 | 4 | 4,000KHz |
0 | 1 | 1 | 8 | 1,000KHz |
1 | 0 | 0 | 16 | 500KHz |
1 | 0 | 1 | 32 | 250KHz |
1 | 1 | 0 | 64 | 125KHz |
1 | 1 | 1 | 128 | 62.5KHz |
ADMUX 레지스터
ADMUX (ADc MUltipleXer selection register) 레지스터는 ADC의 입력 핀을 선택하는 기능과 기준 전압원을 선택하거나 변환 결과를 레지스터에 저장하는 형식을 지정하는 기능을 수행한다.
[그림 4] ADMUX레지스터의 구조
• REFS1:0 두 비트는 A/D 변환의 기준 전압을 선택한다.
[표 2] ADC 기준 전압 선택
REFS1 | REFS0 | 기준전압 선택 |
0 | 0 | AREF에 인가되는 전압 |
0 | 1 | AVCC에 인가되는 전압 (1) |
1 | 0 | - |
1 | 1 | 내부 2.56V 전압 (1) |
(1) AREF핀에 외부 전압을 인가하지 않고 GND와 0.1uF의 커패시터를 연결할 것.
• ADLAR (ADc Left Adjust Result) 비트는 ‘1’로 설정되면 A/D 변환 결과가 ADC레지스터에 저장될 때 <그림 8.2.2>와 같이 정렬되고 ‘0’으로 설정되면 <그림 8.2.1.>과 같이 정렬된다.
• MUX3:0 비트들은 ADC의 입력핀을 선택한다. PDIP패키지는 외부 핀이 ADC5번까지만 있고, TQFP/MLF 패키지는 ADC7번까지 있다.
[표 3] 입력 채널 선택
MUX3:0 | 단극성입력 (single ended input) | 비고 |
0000 | ADC0 | PDIP 패키지 |
0001 | ADC1 |
0010 | ADC2 |
0011 | ADC3 |
0100 | ADC4 |
0101 | ADC5 |
0110 | ADC6 | TQFP/MLF 패키지에만 있음 |
0111 | ADC7 |
1000 ~1101 | - | |
1110 | 1.30V (VBG) | |
1111 | 0V (GND) | |