classe PWM – modulation de largeur d’impulsion

La classe PWM produit un signal modulé en largeur d’impulsion sur une Pin. C’est l’API moderne et multiplateforme pour le PWM ; sur les caméras OpenMV STM32, elle encapsule la machinerie sous-jacente des canaux pyb.Timer, de sorte que chaque instance PWM occupe un canal de minuteur.

Exemple d’utilisation:

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

Constructeurs

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

Construit un objet PWM pilotant dest (une Pin sur les caméras OpenMV). Les arguments mots-clés sont équivalents à un appel à init() immédiatement après la construction :

  • freq – fréquence PWM en Hz.

  • duty_u16 – rapport cyclique sous forme de ratio duty_u16 / 65535.

  • duty_ns – largeur d’impulsion en nanosecondes.

  • invert – si True, inverse la polarité de la sortie.

Au plus un seul de duty_u16 / duty_ns peut être passé à la fois. Définir freq peut affecter d’autres instances PWM qui partagent le même minuteur sous-jacent (vrai sur STM32 – chaque canal d’un TIM donné fonctionne à la même fréquence).

Méthodes

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

Reconfigure la sortie PWM. Seuls les arguments fournis sont mis à jour ; les autres conservent leurs valeurs précédentes. Voir le constructeur pour la signification de chaque argument.

deinit() None

Désactive la sortie PWM et libère le canal de minuteur qu’elle occupait.

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

Obtient ou définit la fréquence PWM.

Sans argument, retourne la fréquence actuelle en Hz.

Avec un seul argument value, définit la fréquence à cette valeur en Hz. Peut lever ValueError si la fréquence est en dehors de la plage atteignable par le minuteur sous-jacent.

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

Obtient ou définit le rapport cyclique sous forme de valeur 16 bits non signée dans la plage 065535.

Sans argument, retourne le rapport cyclique actuel.

Avec un seul argument value, définit le rapport cyclique à value / 65535 de la période. 0 est toujours bas, 65535 est toujours haut.

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

Obtient ou définit la largeur d’impulsion directement en nanosecondes.

Sans argument, retourne la largeur d’impulsion actuelle.

Avec un seul argument value, définit le temps haut de chaque cycle à value nanosecondes. Utile pour les sorties de type servomoteur où la largeur d’impulsion est la grandeur significative plutôt que le rapport cyclique.

Limitations

  • La fréquence PWM et la résolution du rapport cyclique sont interdépendantes sur chaque minuteur matériel : aux fréquences élevées, moins de pas de compteur tiennent dans une période et donc moins de bits de poids faible de duty_u16 sont significatifs.

  • La fréquence PWM atteignable dépend de la source d’horloge et du prédiviseur du minuteur. Les TIM2 / TIM5 STM32 sont en 32 bits sur la plupart des composants (ainsi que TIM3 / TIM4 sur le STM32N6), offrant des plages de fréquence et de rapport cyclique plus larges ; les autres minuteurs sont en 16 bits. Consultez le manuel de référence du MCU concerné pour connaître les plages exactes.

  • Sur STM32, plusieurs canaux PWM sur le même TIM partagent une fréquence. Définir freq() sur une instance modifie la sortie de tous les autres canaux rattachés à ce TIM.