Phase Correct PWM (ШИМ с коррекцией фазы)
У таймеров AVR два основных режима ШИМ. Fast PWM считает только вверх и даёт вдвое большую частоту, а Phase Correct считает вверх и вниз: частота ниже, зато импульс всегда стоит симметрично в середине периода.
Обновлено Редакция GAW
Phase Correct PWM (ШИМ с коррекцией фазы) — режим таймера AVR, в котором счётчик идёт от нуля до вершины TOP и обратно, а выход переключается при совпадении со значением сравнения на подъёме и на спуске. Импульс получается симметричным относительно середины периода, а частота — вдвое ниже, чем у Fast PWM при тех же предделителе и TOP (DS40002061B, разд. 15.7.4). У STM32 тот же принцип называется center-aligned mode — ШИМ с выравниванием по центру.
Fast PWM и Phase Correct
| Fast PWM | Phase Correct PWM | |
|---|---|---|
| Счёт | 0 → TOP, сброс | 0 → TOP → 0 |
| Частота | fclk / (N · (1 + TOP)) | fclk / (2 · N · TOP) |
| Положение импульса | от начала периода | симметрично относительно середины |
| Флаг TOV | в TOP | в нуле (BOTTOM) |
| Где удобен | источники питания, ЦАП на ШИМ | двигатели, мосты |
Формулы — в тех же обозначениях, что в статье о ШИМ и о таймерах AVR; N — предделитель. Характеристики режимов — по DS40002061B, разд. 15.7.3–15.7.4.
Почему симметрия важна
В Fast PWM при смене заполнения сдвигается только задний фронт, и середина импульса «гуляет». В Phase Correct фронты расходятся от середины периода в обе стороны. Когда несколько выходов одного таймера управляют плечами H-моста или фазами двигателя, их импульсы оказываются центрированы друг относительно друга. Microchip рекомендует двухнаклонные режимы для управления двигателями именно из-за симметрии. У расширенных таймеров STM32 TIM1 и TIM8 центрированный ШИМ доступен вместе с комплементарными выходами и мёртвым временем (RM0090, разд. 17.2).
На Arduino
У Arduino Uno выводы на Timer1 и Timer2 работают в Phase Correct с частотой 490,2 Гц, а выводы 5 и 6 на Timer0 — в Fast PWM с частотой 976,56 Гц (наш расчёт по формулам при 16 МГц и N = 64). Частоты по выводам и делителям для Uno, Mega и Leonardo показывает калькулятор ШИМ Arduino.
Частые вопросы
Чем Phase Correct PWM лучше Fast PWM?
Симметрией. В Fast PWM все импульсы начинаются в начале периода, и при смене заполнения сдвигается только задний фронт. В Phase Correct импульс растёт от середины периода в обе стороны, и его центр всегда на месте. Microchip пишет, что из-за этой симметрии двухнаклонные режимы предпочтительны для управления двигателями (DS40002061B, разд. 15.7.4). Цена — вдвое меньшая частота.
Какая частота у Phase Correct PWM?
f = f_clk / (2 · N · TOP), где N — предделитель. При TOP = 0xFF это f_clk / (N · 510): у Arduino Uno при 16 МГц и N = 64 выходит 490,2 Гц — с такой частотой работают выводы 9, 10 (Timer1) и 3, 11 (Timer2), а Fast PWM с теми же N и TOP даёт f_clk / (N · 256) ≈ 976,56 Гц на выводах 5 и 6 (наш расчёт; распределение выводов — как в калькуляторе ШИМ Arduino).
Что такое Phase and Frequency Correct?
Режим 16-битного Timer1 ATmega328P: тот же двухнаклонный счёт, но новые значения TOP и OCR1x применяются в нижней точке счёта. Поэтому импульс остаётся симметричным и при смене частоты на ходу (DS40002061B, разд. 16.9.5).
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — разд. 15.7.3 — Fast PWM (WGM = 3 или 7): счёт от BOTTOM до TOP, однонаклонный, частота может быть вдвое выше, чем у Phase Correct; 15.7.4 — Phase Correct (WGM = 1 или 5): двухнаклонный счёт BOTTOM → TOP → BOTTOM, TOP = 0xFF или OCR0A; в неинвертирующем режиме выход сбрасывается при совпадении на счёте вверх и ставится на счёте вниз; меньшая максимальная частота, но из-за симметрии такие режимы предпочтительны для управления двигателями; TOV0 ставится в BOTTOM; f = f_clk / (N · 510) при TOP = 0xFF; 16.9.4–16.9.5 — у Timer1 Phase Correct и Phase and Frequency Correct
- STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 17.2, 18.2 — у TIM1, TIM8 и TIM2…TIM5 ШИМ с выравниванием по фронту и по центру (center-aligned); 17.3.2 — режим счёта вверх и вниз (center-aligned), поле CMS
Нашли ошибку?
Смотрите также
- ШИМPWM: среднее напряжение через коэффициент заполнения
- Таймеры AVRTimer0/1/2, режимы WGM, предделители, формулы ШИМ, захват, примеры
- Частота ШИМ ArduinoЧастоты analogWrite по таймерам, выводы, смена делителя, millis() и tone()
- Мёртвое времяПауза между ключами полумоста против сквозного тока
- H-мостЧетыре ключа для смены полярности на нагрузке