třída PWM – pulzně šířková modulace

Třída PWM vysílá pulzně šířkově modulovaný signál na Pin. Jedná se o moderní, napříč porty fungující API pro PWM; na STM32 OpenMV kamerách obaluje podkladovou mechaniku kanálů pyb.Timer, takže každá instance PWM zabírá jeden kanál časovače.

Příklad použití:

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

Konstruktory

class machine.PWM(dest: Pin | int, *, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None, invert: bool = False)

Vytvoří objekt PWM řídící dest (Pin na OpenMV kamerách). Argumenty klíčových slov jsou ekvivalentní volání init() ihned po vytvoření:

  • freq – frekvence PWM v Hz.

  • duty_u16 – střída jako poměr duty_u16 / 65535.

  • duty_ns – šířka pulzu v nanosekundách.

  • invert – pokud je True, invertuje polaritu výstupu.

Najednou lze předat nejvýše jeden z duty_u16 / duty_ns. Nastavení freq může ovlivnit ostatní instance PWM, které sdílejí stejný podkladový časovač (platí na STM32 – každý kanál daného TIM běží na stejné frekvenci).

Metody

init(*, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None) None

Překonfiguruje výstup PWM. Aktualizují se pouze dodané argumenty; ostatní si zachovají své předchozí hodnoty. Význam jednotlivých argumentů viz konstruktor.

deinit() None

Zakáže výstup PWM a uvolní kanál časovače, který zabíral.

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

Získá nebo nastaví frekvenci PWM.

Bez argumentu vrátí aktuální frekvenci v Hz.

S jedním argumentem value nastaví frekvenci na tuto hodnotu v Hz. Může vyvolat ValueError, pokud je frekvence mimo rozsah dosažitelný podkladovým časovačem.

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

Získá nebo nastaví střídu jako bezznaménkovou 16bitovou hodnotu v rozsahu 065535.

Bez argumentu vrátí aktuální střídu.

S jedním argumentem value nastaví střídu na value / 65535 periody. 0 je vždy nízká úroveň, 65535 je vždy vysoká úroveň.

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

Získá nebo nastaví šířku pulzu přímo v nanosekundách.

Bez argumentu vrátí aktuální šířku pulzu.

S jedním argumentem value nastaví dobu vysoké úrovně každého cyklu na value nanosekund. Užitečné pro výstupy typu servo, kde je smysluplnou veličinou šířka pulzu spíše než poměr střídy.

Omezení

  • Frekvence PWM a rozlišení střídy jsou na každém hardwarovém časovači vzájemně závislé: při vysokých frekvencích se do periody vejde méně kroků čítače, a tak je smysluplných méně nízkých bitů duty_u16.

  • Dosažitelná frekvence PWM závisí na zdroji hodin časovače a předděličce. STM32 TIM2 / TIM5 jsou na většině součástek 32bitové (a TIM3 / TIM4 také na STM32N6), což poskytuje širší rozsahy frekvence a střídy; zbývající časovače jsou 16bitové. Přesné rozsahy viz příslušný referenční manuál MCU.

  • Na STM32 sdílí frekvenci více kanálů PWM na stejném TIM. Nastavení freq() na jedné instanci změní výstup každého dalšího kanálu připojeného k tomuto TIM.