ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS20

А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