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
PWMsterującydest(pinemPinna kamerach OpenMV). Argumenty słów kluczowych są równoważne wywołaniuinit()bezpośrednio po konstrukcji:freq– częstotliwość PWM w Hz.duty_u16– cykl pracy jako stosunekduty_u16 / 65535.duty_ns– szerokość impulsu w nanosekundach.invert– jeśliTrue, odwraca polaryzację wyjścia.
Jednocześnie można przekazać co najwyżej jeden z argumentów
duty_u16/duty_ns. Ustawieniefreqmoże wpłynąć na inne instancjePWM, 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.
- freq() int¶
- freq(value: int, /) None
Pobiera lub ustawia częstotliwość PWM.
Bez argumentu zwraca bieżącą częstotliwość w Hz.
Z pojedynczym argumentem
valueustawia 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
0–65535.Bez argumentu zwraca bieżący cykl pracy.
Z pojedynczym argumentem
valueustawia cykl pracy navalue / 65535okresu.0zawsze oznacza stan niski,65535zawsze 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
valueustawia czas trwania stanu wysokiego każdego cyklu navaluenanosekund. 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_u16ma 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
PWMna tym samym TIM współdzieli częstotliwość. Ustawieniefreq()na jednej instancji zmienia wyjście każdego innego kanału przypisanego do tego TIM.