klasa PWM – pulsno-širinska modulacija

Klasa PWM izlazi pulsno-širinski moduliran signal na Pin. Riječ je o modernom, međuportabilnom API-ju za PWM; na STM32 OpenMV kamerama omata temeljnu mehaniku kanala pyb.Timer, tako da svaka PWM instanca zauzima jedan kanal mjerača vremena.

Primjer korištenja:

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

Konstruktori

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

Konstruira PWM objekt koji upravlja s dest (Pin na OpenMV kamerama). Argumenti s ključnom riječi ekvivalentni su pozivu init() neposredno nakon konstrukcije:

  • freq – PWM frekvencija u Hz.

  • duty_u16 – radni ciklus kao omjer duty_u16 / 65535.

  • duty_ns – širina pulsa u nanosekundama.

  • invert – ako je True, invertira polaritet izlaza.

Najviše jedan od duty_u16 / duty_ns može se proslijediti odjednom. Postavljanje freq može utjecati na druge PWM instance koje dijele isti temeljni mjerač vremena (vrijedi na STM32 – svaki kanal određenog TIM-a radi na istoj frekvenciji).

Metode

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

Ponovno konfigurira PWM izlaz. Ažuriraju se samo navedeni argumenti; ostali zadržavaju svoje prethodne vrijednosti. Značenje svakog argumenta potražite u konstruktoru.

deinit() None

Onemogućuje PWM izlaz i oslobađa kanal mjerača vremena koji je zauzimao.

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

Dohvaća ili postavlja PWM frekvenciju.

Bez argumenta vraća trenutnu frekvenciju u Hz.

S jednim argumentom value postavlja frekvenciju na tu vrijednost u Hz. Može podići ValueError ako je frekvencija izvan raspona ostvarivog temeljnim mjeračem vremena.

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

Dohvaća ili postavlja radni ciklus kao 16-bitnu vrijednost bez predznaka u rasponu 065535.

Bez argumenta vraća trenutni radni ciklus.

S jednim argumentom value postavlja radni ciklus na value / 65535 perioda. 0 je uvijek nisko, 65535 je uvijek visoko.

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

Dohvaća ili postavlja širinu pulsa izravno u nanosekundama.

Bez argumenta vraća trenutnu širinu pulsa.

S jednim argumentom value postavlja vrijeme visokog stanja svakog ciklusa na value nanosekundi. Korisno za izlaze tipa servo gdje je širina pulsa značajna veličina, a ne omjer radnog ciklusa.

Ograničenja

  • PWM frekvencija i razlučivost radnog ciklusa međusobno su ovisne na svakom hardverskom mjeraču vremena: pri visokim frekvencijama u period stane manje koraka brojača, pa je manje nižih bitova duty_u16 značajno.

  • Ostvariva PWM frekvencija ovisi o izvoru takta mjerača vremena i predskaleru. STM32 TIM2 / TIM5 su 32-bitni na većini dijelova (kao i TIM3 / TIM4 na STM32N6), dajući šire raspone frekvencije i radnog ciklusa; preostali mjerači vremena su 16-bitni. Točne raspone potražite u relevantnom referentnom priručniku za MCU.

  • Na STM32 više PWM kanala na istom TIM-u dijeli frekvenciju. Postavljanje freq() na jednoj instanci mijenja izlaz svakog drugog kanala povezanog s tim TIM-om.