clasa PWM – modulație în lățimea impulsului

Clasa PWM emite un semnal modulat în lățimea impulsului pe un Pin. Este API-ul modern, multi-port, pentru PWM; pe camerele STM32 OpenMV încapsulează mecanismul subiacent de canal pyb.Timer, astfel încât fiecare instanță PWM ocupă un canal de temporizator.

Exemplu de utilizare:

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

Constructori

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

Construiește un obiect PWM care comandă dest (un Pin pe camerele OpenMV). Argumentele de tip cuvânt-cheie sunt echivalente cu apelarea init() imediat după construire:

  • freq – frecvența PWM în Hz.

  • duty_u16 – factorul de umplere ca raport duty_u16 / 65535.

  • duty_ns – lățimea impulsului în nanosecunde.

  • invert – dacă este True, inversează polaritatea ieșirii.

Cel mult unul dintre duty_u16 / duty_ns poate fi transmis odată. Setarea freq poate afecta alte instanțe PWM care partajează același temporizator subiacent (valabil pe STM32 – fiecare canal al unui anumit TIM rulează la aceeași frecvență).

Metode

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

Reconfigurează ieșirea PWM. Doar argumentele furnizate sunt actualizate; celelalte își păstrează valorile anterioare. Consultați constructorul pentru semnificația fiecărui argument.

deinit() None

Dezactivează ieșirea PWM și eliberează canalul de temporizator pe care îl ocupa.

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

Citește sau setează frecvența PWM.

Fără argument, returnează frecvența curentă în Hz.

Cu un singur argument value, setează frecvența la acea valoare în Hz. Poate genera ValueError dacă frecvența este în afara intervalului care poate fi atins de temporizatorul subiacent.

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

Citește sau setează factorul de umplere ca valoare nesemnată pe 16 biți în intervalul 065535.

Fără argument, returnează factorul de umplere curent.

Cu un singur argument value, setează factorul de umplere la value / 65535 din perioadă. 0 este întotdeauna jos, 65535 este întotdeauna sus.

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

Citește sau setează lățimea impulsului direct în nanosecunde.

Fără argument, returnează lățimea curentă a impulsului.

Cu un singur argument value, setează timpul de nivel sus al fiecărui ciclu la value nanosecunde. Util pentru ieșiri de tip servo, unde lățimea impulsului este mărimea relevantă, mai degrabă decât raportul factorului de umplere.

Limitări

  • Frecvența PWM și rezoluția factorului de umplere sunt interdependente pe fiecare temporizator hardware: la frecvențe ridicate, mai puțini pași de numărător încap într-o perioadă și, prin urmare, mai puțini biți inferiori ai duty_u16 sunt semnificativi.

  • Frecvența PWM care poate fi atinsă depinde de sursa de ceas a temporizatorului și de prescaler. STM32 TIM2 / TIM5 sunt pe 32 de biți pe majoritatea componentelor (precum și TIM3 / TIM4 pe STM32N6), oferind intervale mai largi de frecvență și factor de umplere; restul temporizatoarelor sunt pe 16 biți. Consultați manualul de referință al MCU-ului relevant pentru intervalele exacte.

  • Pe STM32, mai multe canale PWM de pe același TIM partajează o frecvență. Setarea freq() pe o instanță schimbă ieșirea fiecărui alt canal atașat acelui TIM.