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 0 – 65535.

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.