classe PWM – modulazione di larghezza di impulso

La classe PWM emette un segnale modulato in larghezza di impulso su un Pin. È l’API moderna e cross-port per il PWM; sulle OpenMV cam STM32 incapsula il meccanismo sottostante del canale pyb.Timer, quindi ogni istanza PWM occupa un canale timer.

Esempio di utilizzo:

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

Costruttori

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

Costruisce un oggetto PWM che pilota dest (un Pin sulle OpenMV cam). Gli argomenti per parola chiave sono equivalenti a chiamare init() immediatamente dopo la costruzione:

  • freq – frequenza PWM in Hz.

  • duty_u16 – duty cycle come rapporto duty_u16 / 65535.

  • duty_ns – larghezza dell’impulso in nanosecondi.

  • invert – se True, inverte la polarità dell’uscita.

Si può passare al massimo uno tra duty_u16 / duty_ns alla volta. Impostare freq può influenzare altre istanze PWM che condividono lo stesso timer sottostante (vero su STM32 – ogni canale di un dato TIM funziona alla stessa frequenza).

Metodi

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

Riconfigura l’uscita PWM. Vengono aggiornati solo gli argomenti forniti; gli altri mantengono i valori precedenti. Vedere il costruttore per il significato di ciascun argomento.

deinit() None

Disabilita l’uscita PWM e rilascia il canale timer che occupava.

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

Legge o imposta la frequenza PWM.

Senza argomenti, restituisce la frequenza corrente in Hz.

Con un singolo argomento value, imposta la frequenza a quel valore in Hz. Può sollevare ValueError se la frequenza è al di fuori dell’intervallo ottenibile dal timer sottostante.

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

Legge o imposta il duty cycle come valore senza segno a 16 bit nell’intervallo 065535.

Senza argomenti, restituisce il duty corrente.

Con un singolo argomento value, imposta il duty cycle a value / 65535 del periodo. 0 è sempre basso, 65535 è sempre alto.

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

Legge o imposta la larghezza dell’impulso direttamente in nanosecondi.

Senza argomenti, restituisce la larghezza dell’impulso corrente.

Con un singolo argomento value, imposta il tempo alto di ogni ciclo a value nanosecondi. Utile per uscite di tipo servo dove la larghezza dell’impulso è la quantità significativa anziché il rapporto di duty.

Limitazioni

  • La frequenza PWM e la risoluzione del duty sono interdipendenti su ogni timer hardware: a frequenze elevate, in un periodo entrano meno passi del contatore e quindi sono significativi meno bit bassi di duty_u16.

  • La frequenza PWM ottenibile dipende dalla sorgente di clock del timer e dal prescaler. I TIM2 / TIM5 STM32 sono a 32 bit sulla maggior parte dei componenti (così come TIM3 / TIM4 sull’STM32N6), offrendo intervalli di frequenza e duty più ampi; i restanti timer sono a 16 bit. Consultare il manuale di riferimento dell’MCU pertinente per gli intervalli esatti.

  • Su STM32 più canali PWM sullo stesso TIM condividono una frequenza. Impostare freq() su un’istanza cambia l’uscita di ogni altro canale collegato a quel TIM.