klass PWM – pulsbreddsmodulering

Klassen PWM matar ut en pulsbreddsmodulerad signal på ett Pin. Det är det moderna, portöverskridande API:et för PWM; på STM32 OpenMV-kameror omsluter det den underliggande pyb.Timer-kanalmekanismen, så varje PWM-instans binder upp en timerkanal.

Exempel på användning:

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

Konstruktorer

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

Konstruera ett PWM-objekt som driver dest (ett Pin på OpenMV-kameror). Nyckelordsargumenten är likvärdiga med att anropa init() omedelbart efter konstruktion:

  • freq – PWM-frekvens i Hz.

  • duty_u16 – arbetscykel som ett förhållande duty_u16 / 65535.

  • duty_ns – pulsbredd i nanosekunder.

  • invert – om True, invertera utsignalens polaritet.

Högst en av duty_u16 / duty_ns får skickas åt gången. Att ange freq kan påverka andra PWM-instanser som delar samma underliggande timer (gäller på STM32 – varje kanal i en given TIM körs vid samma frekvens).

Metoder

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

Konfigurera om PWM-utsignalen. Endast de argument som anges uppdateras; de övriga behåller sina tidigare värden. Se konstruktorn för betydelsen av varje argument.

deinit() None

Inaktivera PWM-utsignalen och frigör timerkanalen den upptog.

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

Hämta eller ange PWM-frekvensen.

Utan argument returneras den nuvarande frekvensen i Hz.

Med ett enda value-argument sätts frekvensen till det värdet i Hz. Kan ge upphov till ValueError om frekvensen ligger utanför det område som den underliggande timern kan uppnå.

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

Hämta eller ange arbetscykeln som ett osignerat 16-bitars värde i intervallet 065535.

Utan argument returneras den nuvarande arbetscykeln.

Med ett enda value-argument sätts arbetscykeln till value / 65535 av perioden. 0 är alltid låg, 65535 är alltid hög.

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

Hämta eller ange pulsbredden direkt i nanosekunder.

Utan argument returneras den nuvarande pulsbredden.

Med ett enda value-argument sätts hög-tiden för varje cykel till value nanosekunder. Användbart för servoliknande utsignaler där pulsbredden är den meningsfulla storheten snarare än arbetscykelförhållandet.

Begränsningar

  • PWM-frekvens och arbetscykelupplösning är inbördes beroende på varje hårdvarutimer: vid höga frekvenser ryms färre räknarsteg i en period och därför är färre låga bitar av duty_u16 meningsfulla.

  • Den uppnåeliga PWM-frekvensen beror på timerns klockkälla och förskalare. STM32 TIM2 / TIM5 är 32-bitars på de flesta delar (och TIM3 / TIM4 likaså på STM32N6), vilket ger bredare frekvens- och arbetscykelintervall; de återstående timerna är 16-bitars. Se den relevanta MCU-referensmanualen för de exakta intervallen.

  • På STM32 delar flera PWM-kanaler på samma TIM en frekvens. Att ange freq() på en instans ändrar utsignalen för varje annan kanal som är ansluten till den TIM:en.