класс 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. Обновляются только переданные аргументы; остальные сохраняют свои предыдущие значения. Смысл каждого аргумента см. в конструкторе.

deinit() 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.