АDEN - бит разрешения, 0 - АЦП выключен, 1 - АЦП включен.
ADSC - бит запуска преобразования, в режиме однократного преобразования единица должна записываться при каждом запуске, в циклическом режиме - один раз для запуска первого преобразования.
ADFR - бит режима преобразования, 1 - циклический режим, 0 - однократный.
ADIF - флаг прерывания, устанавливается после завершения преобразования и записи кода в выходной регистр АЦП. Очищается автоматически при вызове вектора прерывания либо записью 1 в этот бит. АБ1Е - бит разрешения прерывания АЦП, 1 разрешает прерывание. АБР82, АБР81, АБР820 - биты управления тактовой частотой АЦП, определяют коэффициент деления тактовой частоты микроконтроллера следующим образом:
0 - коэффициент деления 2,
1 - коэффициент деления 2,
10 - коэффициент деления 4,
11 - коэффициент деления 8,
100 - коэффициент деления 16,
101 коэффициент деления 32,
110- коэффициент деления 64,
111- коэффициент деления 128.
Дополнительное снижение уровня помех для повышения точности преобразования можно получить, если на время преобразования АЦП приостановить работу процессора в микроконтроллере переходом в режим "idle". Возврат в рабочее состояние должна обеспечивать подпрограмма обработки прерывания АЦП. Более подробную информацию о работе АЦП можно найти в руководствах фирмы АТМЕL.
Для управления работой АЦП подпрограмма его вектора прерывания должна выполнить чтение результатов завершенного цикла преобразования из выходных регистров, определить через регистр мультиплексора номер следующего входного канала и произвести запуск следующего цикла преобразования.
Простенькая программка иллюстрирует работу ШИМ в режиме Fast PWM таймера Timer1 и АЦП. Написана на ассемблере, компилируется в AVR Studio. Для микроконтроллера ATmega8, который тактируется внутренним RC - генератором на 1МГц.
Исходный текст программы на ассемблере, под AVR Studio:
01.; Atmega8, crystal 1MHZ (internal)
02.; Timer Counter 1
03.; Fast PWM & ADC
04.
05..include "m8def.inc"
06.
07..def wreg =R16
08..def duration =R17
09..def wreg2 =R18
10.
11.
12.init:
13.
14. ldi wreg,low(RAMEND)
15. out SPL,wreg
16.
17. ldi wreg,high(RAMEND); Stack Pointer = $45F
18. out SPH,wreg
19.
20. cli; запретить прерывания
21.
22.
23. ldi wreg, 0b10000011; Вкл. Ацп, Однокр. преобр., Прерывание запрещено, СК/8 (125 kHz)
24. out ADCSR, wreg
25.
26. ldi wreg, 0b01101110; AVcc, Внеш. конд. на Aref, Выравн. по лев. краю, channel 1.23V bg
27. out ADMUX, wreg
28.
29. rcall adc_convert
30.
31.
32.;******************* TIMER1 ***********************
33.
34. ldi wreg,0x00
35. out PORTB,wreg; Запись 0 в порт
36.
37. ldi wreg,0b00000010; PortB.1 (OC1A) - Output
38. out DDRB,wreg
39.
40.
41. ldi wreg, 0b10000001; неинв. 8 битный ШИМ
42. out TCCR1A, wreg
43.
44. ldi wreg, 0b00001001; CK/1
45. out TCCR1B, wreg
46.
47. ldi wreg, 0b00000000
48. out TIMSK, wreg
49.
50.
51.main:
52.
53. ldi wreg, 250; 25mS
54. rcall delay
55.
56. ldi wreg, 0b01100101; ADC Channel 5 (PortC.5; pin 28)
57. rcall adc_convert
58.
59. ldi wreg2, 0x00
60. out OCR1AH, wreg2
61.
62. out OCR1AL, wreg
63.
64.
65.rjmp main
66.
67.
68.
69.;*********************** DELAYS **************************
70.
71.delay:; 0.1mS * wreg
72. ldi duration, 24
73. cycle:
74. nop
75. dec duration
76. brne cycle
77. dec wreg
78. brne delay
79.ret
80.
81.
82.;********************** AD CONVERTION *******************
83.
84.adc_convert:
85.
86. out ADMUX, wreg; wreg contains channel
87.
88. sbi ADCSR, ADSC; Start Convertion
89. sbic ADCSR, ADSC
90. rjmp PC-1
91. in wreg, ADCL; просто формальность (первым всегда читается ADCL)
92.
93. in wreg, ADCH; wreg contains result
94.
95.ret