Таймеры ATmega8A
В микроконтроллере предусмотрено три таймера: 8-битный Timer/Counter0
, 16-битный Timer/Counter1
, 8-битный Timer/Counter2
.
Два последних способны работать с Waveform Generator, WG
-- генератором функций. WG
умеет делать ШИМ -- широтно-импульсную модуляцию.
Будем вести речь о TC1
и TC2
, поскольку глобально TC0
отличается от TC2
лишь только отсутствием WCG
. На рис. показаны структурные схемы таймеров.


Значение в таймере хранится в регистре TCNTn
. Оно непрерывно сравнивается со значениями констант (табл.), которые определяют режимы работы таймера. Константа BOTTOM
-- начальное значение таймера. MAX
-- максимально допустимое значение в таймере (определяется разрядностью). TOP
служит "промежуточным" максимумом, по которому генерируются прерывания и выставляются флаги.
Таймер | Константа | Значение |
---|---|---|
TC1 | TOP | OCR1A, ICR1, одно из 0x00FF, 0x01FF, 0x03FF |
BOTTOM | 0 | |
MAX | 0xFFFF | |
TC2 | TOP | OCR2 |
BOTTOM | 0 | |
MAX | 0xFF |
Регистры OCRnx
, ICRn
служат для установки т.н. TOP
-значения таймера -- значения, по достижении которого таймером может генерироваться прерывание, выставляться специальный флаг и т.д. Эти флаги и прерывания могут быть использованы как непосредственно в коде, так и для управления WG
, чем и полезны. То, какой имеено регистр будет использован для установки TOP
-значения таймера, определяется режимами его работы, т.е. настраивается отдельно.
Широтно-импульсная модуляция
Pulse-Width Modulation (PWM), или Широтно-импульсная модуляция (ШИМ) -- процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте (Wikipedia).
Аппарат PWM
уже реализован в ATmega8A
в паре с 16-битным таймером Timer/Counter1
(с 8-битным асинхронным таймером Timer/Counter2
). В зависимости от режима работы и выбранного таймера можно сразу получить PWM
с выхода OC1A
(OC1B
), соответствующего пину PB1
(PB2
). Непосредственное управление шириной импульса может осуществляться через пару регистров OCR1A
, OCR1B
(регистр OCR2
), где хранится 16-битное (8-битное) целое, при достижении счетчиком которого (в зависимости от режима) происходит генерация соответствующего прерывания. При этом возможен как сброс счетчика, так и продолжение счета до переполнения (генерация соответствующего прерывания) или достижения следующего (например, измененного программой) указанного значения.
Пример настройки Fast PWM
на базе Timer/Counter2
Fast PWM
-- один из режимов PWM
, доступных для генерирования. PWM
генерируется генератором функций Waveform Generator
. Для настройки совместной работы WG
и Timer/Counter2
можно использовать следующий код:
#define PRESCALE 0
/* Setup non-inverting Fast PWM and prescale */
TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(PRESCALE<<CS20);
TCCR2
-- статусный регистр Timer/Counter2
. WGM
, COM
определяют режим PWM
. CS
задает величину деления частоты (если необходимо). В большинстве приложений (управление светодиодом, вентилятором) требуется частота порядка нескольких килогерц, что как раз и обеспечивается таймером (при частоте осциллятора микроконтроллера 1МГц частота ШИМ будет порядка 4кГц = 1МГц / 256).
Управление шириной ШИМ производится записью в 8-битный регистр OCR2
необходимого значения.
ШИМ будет доступен на ножке PB3/OC2
микроконтроллера.
Настройка ШИМ для Timer/Counter1
будет отличаться. Необходимо учитывать особенности таймера, например его разрядность. Регистр OCR1A
используется для установки значения TOP
таймера, потому определяет разрешение ШИМ. Поскольку частота ШИМ при 1МГц частоте осциллятора микроконтроллера равна всего лишь 15Гц, то для получения ШИМ частотой порядка кГц придется принимать специальные меры.
Замечания
- В даташитах весьма смутно описаны режимы работы
Timer/Counter1
. В частности, не понятно, о какойPWM
может идти речь, если значениеTOP
фиксировать на, например,0xFF
. Судя по даташитам, здесь мы уже не можем управлять заполнением ШИМ (т.е. значениемTOP
) записью в регистрOCR1A
... но так ли это? Из остального текста ясно, что регистрOC1A
, который как раз и являетсяIO
-регистром (данные с которого поступают на ножкуPB3/OC1A
), изменяется (устанавливается в 1 / сбрасывается в 0 / меняется на противоположное значение) как раз в момент достижения таймером значения в регистреOCR1A
, а не при достижении таймером значенияTOP
. Вполне возможно, что допустимо управлять ШИМ при помощиOCR1A
, даже если значениеTOP
таймера фиксировано.