klasa PWM – modulacja szerokości impulsu

Klasa PWM wyprowadza sygnał z modulacją szerokości impulsu na pinie Pin. Jest to nowoczesne, międzyportowe API dla PWM; na kamerach STM32 OpenMV opakowuje ono leżący u podstaw mechanizm kanału pyb.Timer, więc każda instancja PWM zajmuje jeden kanał licznika czasu (timera).

Przykład użycia:

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)

Konstruuje obiekt PWM sterujący dest (pinem Pin na kamerach OpenMV). Argumenty słów kluczowych są równoważne wywołaniu init() bezpośrednio po konstrukcji:

  • freq – częstotliwość PWM w Hz.

  • duty_u16 – cykl pracy jako stosunek duty_u16 / 65535.

  • duty_ns – szerokość impulsu w nanosekundach.

  • invert – jeśli True, odwraca polaryzację wyjścia.

Jednocześnie można przekazać co najwyżej jeden z argumentów duty_u16 / duty_ns. Ustawienie freq może wpłynąć na inne instancje PWM, które współdzielą ten sam leżący u podstaw licznik czasu (timer) (prawda na STM32 – każdy kanał danego TIM działa z tą samą częstotliwością).

Metody

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

Rekonfiguruje wyjście PWM. Aktualizowane są tylko dostarczone argumenty; pozostałe zachowują swoje poprzednie wartości. Znaczenie każdego argumentu znajduje się w opisie konstruktora.

deinit() None

Wyłącza wyjście PWM i zwalnia zajmowany przez nie kanał licznika czasu (timera).

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

Pobiera lub ustawia częstotliwość PWM.

Bez argumentu zwraca bieżącą częstotliwość w Hz.

Z pojedynczym argumentem value ustawia częstotliwość na tę wartość w Hz. Może zgłosić ValueError, jeśli częstotliwość jest poza zakresem osiągalnym przez leżący u podstaw licznik czasu (timer).

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

Pobiera lub ustawia cykl pracy jako 16-bitową wartość bez znaku w zakresie 065535.

Bez argumentu zwraca bieżący cykl pracy.

Z pojedynczym argumentem value ustawia cykl pracy na value / 65535 okresu. 0 zawsze oznacza stan niski, 65535 zawsze stan wysoki.

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

Pobiera lub ustawia szerokość impulsu bezpośrednio w nanosekundach.

Bez argumentu zwraca bieżącą szerokość impulsu.

Z pojedynczym argumentem value ustawia czas trwania stanu wysokiego każdego cyklu na value nanosekund. Przydatne dla wyjść typu serwo, gdzie szerokość impulsu jest istotną wielkością, a nie stosunek cyklu pracy.

Ograniczenia

  • Częstotliwość PWM i rozdzielczość cyklu pracy są wzajemnie zależne w każdym sprzętowym liczniku czasu (timerze): przy wysokich częstotliwościach w okresie mieści się mniej kroków licznika, a zatem mniej najmłodszych bitów duty_u16 ma znaczenie.

  • Osiągalna częstotliwość PWM zależy od źródła zegara licznika czasu (timera) i preskalera. STM32 TIM2 / TIM5 są 32-bitowe w większości układów (a TIM3 / TIM4 również w STM32N6), co daje szersze zakresy częstotliwości i cyklu pracy; pozostałe liczniki są 16-bitowe. Dokładne zakresy znajdują się w odpowiednim podręczniku referencyjnym mikrokontrolera.

  • Na STM32 wiele kanałów PWM na tym samym TIM współdzieli częstotliwość. Ustawienie freq() na jednej instancji zmienia wyjście każdego innego kanału przypisanego do tego TIM.