клас 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-бітне значення у діапазоні 065535.

Без аргументу – повертає поточний коефіцієнт заповнення.

З одним аргументом value – встановлює коефіцієнт заповнення як value / 65535 від періоду. 0 – завжди низький рівень, 65535 – завжди високий рівень.

duty_ns() int
duty_ns(value: int, /) None

Отримати або встановити ширину імпульсу безпосередньо у наносекундах.

Без аргументу – повертає поточну ширину імпульсу.

З одним аргументом value – встановлює тривалість високого рівня кожного циклу у value наносекунд. Корисно для виходів типу сервоприводу, де ширина імпульсу є значущою величиною, а не відношення заповнення.

Обмеження

  • Частота PWM та роздільна здатність коефіцієнта заповнення взаємозалежні для кожного апаратного таймера: на високих частотах у одному періоді вміщується менше кроків лічильника, тому менше молодших бітів duty_u16 є значущими.

  • Досяжна частота PWM залежить від джерела тактування та попереднього дільника таймера. STM32 TIM2 / TIM5 є 32-бітними на більшості мікросхем (а також TIM3 / TIM4 на STM32N6), що забезпечує ширший діапазон частот і коефіцієнтів заповнення; решта таймерів – 16-бітні. Точні діапазони дивіться у відповідному довідковому посібнику MCU.

  • На STM32 кілька каналів PWM на одному TIM використовують спільну частоту. Встановлення freq() на одному екземплярі змінює вихід кожного іншого каналу, підключеного до цього TIM.