Таймеры ATmega8A

В микроконтроллере предусмотрено три таймера: 8-битный Timer/Counter0, 16-битный Timer/Counter1, 8-битный Timer/Counter2.

Два последних способны работать с Waveform Generator, WG -- генератором функций. WG умеет делать ШИМ -- широтно-импульсную модуляцию.

Будем вести речь о TC1 и TC2, поскольку глобально TC0 отличается от TC2 лишь только отсутствием WCG. На рис. показаны структурные схемы таймеров.

`Timer/Counter1`
Рис.1. `Timer/Counter1`
`Timer/Counter2`
Рис.2. `Timer/Counter2`

Значение в таймере хранится в регистре 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Гц, то для получения ШИМ частотой порядка кГц придется принимать специальные меры.

Замечания

  1. В даташитах весьма смутно описаны режимы работы Timer/Counter1. В частности, не понятно, о какой PWM может идти речь, если значение TOP фиксировать на, например, 0xFF. Судя по даташитам, здесь мы уже не можем управлять заполнением ШИМ (т.е. значением TOP) записью в регистр OCR1A... но так ли это? Из остального текста ясно, что регистр OC1A, который как раз и является IO-регистром (данные с которого поступают на ножку PB3/OC1A), изменяется (устанавливается в 1 / сбрасывается в 0 / меняется на противоположное значение) как раз в момент достижения таймером значения в регистре OCR1A, а не при достижении таймером значения TOP. Вполне возможно, что допустимо управлять ШИМ при помощи OCR1A, даже если значение TOP таймера фиксировано.

results matching ""

    No results matching ""