клас 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-бітними на більшості мікросхем (а також TIM3 / TIM4 на STM32N6), що забезпечує ширший діапазон частот і коефіцієнтів заповнення; решта таймерів – 16-бітні. Точні діапазони дивіться у відповідному довідковому посібнику MCU.
На STM32 кілька каналів
PWMна одному TIM використовують спільну частоту. Встановленняfreq()на одному екземплярі змінює вихід кожного іншого каналу, підключеного до цього TIM.