Перейти к содержанию

Output compare — режим сравнения таймера

Иногда нужно не измерить момент, а назначить его: переключить вывод через 250 мкс после начала периода или получить прерывание в заданной точке счёта. Для этого канал таймера переводят в режим сравнения.

Обновлено Редакция GAW

Output compare (режим сравнения) — режим канала таймера, в котором таймер непрерывно сравнивает счётчик с регистром канала (CCRx у STM32, OCR1x у AVR) и при совпадении выполняет заданное действие: ставит выход в активный или неактивный уровень, переключает его, взводит флаг и, если разрешено, вызывает прерывание или запрос DMA. Разрешение по времени — один такт счётчика (RM0090, разд. 17.3.9).

Действия при совпадении (STM32)

OCxMЧто делает выход OCxREF
000ничего (frozen), но флаг ставится
001становится активным
010становится неактивным
011переключается (toggle)
100 / 101принудительно неактивен / активен; сравнение со счётчиком продолжается и ставит флаг (RM0090, разд. 17.3.8)

Режимы 110 и 111 — это уже ШИМ. Событие обновления на OCxREF в режиме сравнения не влияет. Пример RM0090 — переключение вывода: OCxM = 011, OCxPE = 0, CCxP = 0, CCxE = 1, после чего включают счётчик битом CEN.

Частота в режиме toggle

Выход переключается один раз за период счёта, поэтому период меандра — два периода счёта. Для STM32 (наш вывод из описания режима):

fOUT=fCNT2 (ARR+1)f_\text{OUT} = \frac{f_\text{CNT}}{2\,(ARR + 1)}

У AVR то же даёт режим CTC с переключением вывода при каждом совпадении: f = fclk / (2 · N · (1 + OCR)), где N — предделитель (DS40002061B, разд. 15.7.2). Частоты и делители для обоих семейств считает калькулятор таймера.

AVR

У ATmega328P 16-битный компаратор Timer1 сравнивает TCNT1 с OCR1A и OCR1B; флаг OCF1x ставится на следующем такте таймера, а при OCIE1x = 1 вызывается прерывание (разд. 16.7). Блок A, кроме того, может задавать вершину счёта TOP, то есть период. Что делает вывод при совпадении, задают биты COM1x вместе с режимом WGM — таблицы режимов собраны в статье «Таймеры AVR».

Не путать

С захватом входа: там регистр канала заполняет сам таймер по внешнему фронту.

Частые вопросы

Чем output compare отличается от ШИМ?

ШИМ — частный случай сравнения: в PWM mode 1 и 2 выход зависит от того, больше счётчик или меньше CCRx, и меняется дважды за период. В «чистом» output compare выход меняется один раз — в момент совпадения: ставится, сбрасывается или переключается (RM0090, разд. 17.3.9). Поэтому режим toggle даёт меандр с периодом в два периода счёта.

Можно ли менять CCRx на ходу?

Да. Если предзагрузка выключена (OCxPE = 0), новое значение действует сразу, и так строят последовательности импульсов с разными интервалами. Если включена, CCRx обновится только по событию обновления (RM0090, разд. 17.3.9). При записи «на ходу» значение, меньшее текущего счётчика, совпадёт только в следующем периоде — это наш вывод из того, как работает сравнение.

Зачем режим frozen, если выход не меняется?

Чтобы получить флаг и прерывание в заданной точке счёта без вывода на ножку. Сравнение продолжает работать и ставит CCxIF (RM0090, разд. 17.3.8–17.3.9), поэтому один таймер может давать несколько прерываний с разными задержками внутри периода — по одному на канал.

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 17.3.9 — при совпадении CCRx и счётчика выход сохраняет уровень (OCxM = 000), становится активным (001), неактивным (010) или переключается (011); ставится CCxIF, возможны прерывание и запрос DMA; разрешение — один такт счётчика; событие обновления на OCxREF не влияет; без предзагрузки (OCxPE = 0) CCRx можно менять в любой момент; пример — toggle (OCxM = 011); 17.3.8 — принудительные уровни 100/101
  2. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — разд. 16.7 — 16-битный компаратор Timer1 сравнивает TCNT1 с OCR1x, флаг OCF1x ставится на следующем такте таймера, прерывание при OCIE1x; OCR1A может задавать TOP; разд. 15.7.2 — в CTC переключение OC0A при каждом совпадении (COM0A1:0 = 1)

Нашли ошибку?