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 (наш вывод из описания режима):
У 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), поэтому один таймер может давать несколько прерываний с разными задержками внутри периода — по одному на канал.
Источники
- 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
- 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)
Нашли ошибку?
Смотрите также
- Канал захвата/сравненияРегистр CCRx таймера: запоминает счётчик или сравнивается с ним
- Таймеры STM32Тактирование, PSC/ARR, ШИМ, мёртвое время, захват, энкодер, OPM, синхронизация
- Таймеры AVRTimer0/1/2, режимы WGM, предделители, формулы ШИМ, захват, примеры
- Режим CTC (сброс при совпадении)Счётчик таймера обнуляется при совпадении с регистром сравнения
- ШИМPWM: среднее напряжение через коэффициент заполнения