класс PWM – широтно-импульсная модуляция¶
Класс PWM выводит широтно-импульсно модулированный сигнал на Pin. Это современный, кроссплатформенный API для PWM; на STM32 OpenMV cam он оборачивает нижележащий механизм каналов pyb.Timer, поэтому каждый экземпляр PWM занимает один канал таймера.
Пример использования:
from machine import PWM, Pin
# 50 Hz PWM on a header pin with a 12.5 % duty.
pwm = PWM(Pin("P7"), freq=50, duty_u16=8192)
pwm.duty_u16(32768) # change duty to 50 %
pwm.init(freq=5000, duty_ns=5000) # re-init at 5 kHz, 5 us pulse
pwm.duty_ns(3000) # 3 us pulse
pwm.deinit()
Конструкторы¶
- class machine.PWM(dest: Pin | int, *, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None, invert: bool = False)¶
Создаёт объект
PWM, управляющийdest(объектомPinна OpenMV cam). Именованные аргументы эквивалентны вызовуinit()сразу после создания:freq– частота PWM в Гц.duty_u16– коэффициент заполнения как отношениеduty_u16 / 65535.duty_ns– ширина импульса в наносекундах.invert– еслиTrue, инвертирует полярность вывода.
Одновременно может быть передан не более чем один из
duty_u16/duty_ns. Установкаfreqможет повлиять на другие экземплярыPWM, которые используют общий нижележащий таймер (актуально для STM32 – каждый канал данного TIM работает на одной и той же частоте).Методы¶
- init(*, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None) None¶
Перенастраивает вывод PWM. Обновляются только переданные аргументы; остальные сохраняют свои предыдущие значения. Смысл каждого аргумента см. в конструкторе.
- freq() int¶
- freq(value: int, /) None
Получает или задаёт частоту PWM.
Без аргумента возвращает текущую частоту в Гц.
С единственным аргументом
valueустанавливает частоту в это значение в Гц. Может вызватьValueError, если частота выходит за пределы диапазона, достижимого нижележащим таймером.
- duty_u16() int¶
- duty_u16(value: int, /) None
Получает или задаёт коэффициент заполнения как беззнаковое 16-битное значение в диапазоне от
0до65535.Без аргумента возвращает текущий коэффициент заполнения.
С единственным аргументом
valueустанавливает коэффициент заполнения равнымvalue / 65535периода.0– всегда низкий уровень,65535– всегда высокий уровень.
- duty_ns() int¶
- duty_ns(value: int, /) None
Получает или задаёт ширину импульса напрямую в наносекундах.
Без аргумента возвращает текущую ширину импульса.
С единственным аргументом
valueустанавливает время высокого уровня каждого цикла равнымvalueнаносекунд. Полезно для выводов серво-типа, где значимой величиной является ширина импульса, а не коэффициент заполнения.
Ограничения¶
Частота PWM и разрешение коэффициента заполнения взаимозависимы на любом аппаратном таймере: на высоких частотах в период укладывается меньше шагов счётчика, поэтому меньше младших битов
duty_u16оказываются значимыми.Достижимая частота PWM зависит от источника тактирования таймера и предделителя. STM32 TIM2 / TIM5 являются 32-битными на большинстве микросхем (а на STM32N6 также TIM3 / TIM4), что даёт более широкие диапазоны частоты и коэффициента заполнения; остальные таймеры 16-битные. Точные диапазоны см. в соответствующем справочном руководстве по MCU.
На STM32 несколько каналов
PWMна одном TIM используют общую частоту. Установкаfreq()на одном экземпляре изменяет вывод каждого другого канала, подключённого к этому TIM.