Klasse PWM – Pulsweitenmodulation

Die Klasse PWM gibt ein pulsweitenmoduliertes Signal an einem Pin aus. Sie ist die moderne, portübergreifende API für PWM; auf STM32-OpenMV-Cams umhüllt sie die zugrunde liegende pyb.Timer-Kanalmechanik, sodass jede PWM-Instanz einen Timer-Kanal belegt.

Anwendungsbeispiel:

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

Konstruktoren

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

Konstruiert ein PWM-Objekt, das dest ansteuert (ein Pin auf OpenMV-Cams). Die Schlüsselwortargumente entsprechen einem Aufruf von init() unmittelbar nach der Konstruktion:

  • freq – PWM-Frequenz in Hz.

  • duty_u16 – Tastverhältnis als Verhältnis duty_u16 / 65535.

  • duty_ns – Pulsbreite in Nanosekunden.

  • invert – wenn True, wird die Ausgangspolarität invertiert.

Es darf höchstens eines von duty_u16 / duty_ns gleichzeitig übergeben werden. Das Setzen von freq kann andere PWM-Instanzen beeinflussen, die sich denselben zugrunde liegenden Timer teilen (zutreffend auf STM32 – jeder Kanal eines gegebenen TIM läuft mit derselben Frequenz).

Methoden

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

Konfiguriert die PWM-Ausgabe neu. Nur die angegebenen Argumente werden aktualisiert; die übrigen behalten ihre vorherigen Werte. Die Bedeutung der einzelnen Argumente finden Sie beim Konstruktor.

deinit() None

Deaktiviert die PWM-Ausgabe und gibt den belegten Timer-Kanal frei.

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

Liest oder setzt die PWM-Frequenz.

Ohne Argument wird die aktuelle Frequenz in Hz zurückgegeben.

Mit einem einzelnen Argument value wird die Frequenz auf diesen Wert in Hz gesetzt. Kann ValueError auslösen, wenn die Frequenz außerhalb des durch den zugrunde liegenden Timer erreichbaren Bereichs liegt.

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

Liest oder setzt das Tastverhältnis als vorzeichenlosen 16-Bit-Wert im Bereich 065535.

Ohne Argument wird das aktuelle Tastverhältnis zurückgegeben.

Mit einem einzelnen Argument value wird das Tastverhältnis auf value / 65535 der Periode gesetzt. 0 ist immer Low, 65535 ist immer High.

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

Liest oder setzt die Pulsbreite direkt in Nanosekunden.

Ohne Argument wird die aktuelle Pulsbreite zurückgegeben.

Mit einem einzelnen Argument value wird die High-Zeit jedes Zyklus auf value Nanosekunden gesetzt. Nützlich für Servo-artige Ausgaben, bei denen die Pulsbreite die maßgebliche Größe ist und nicht das Tastverhältnis.

Einschränkungen

  • PWM-Frequenz und Tastverhältnis-Auflösung hängen bei jedem Hardware-Timer voneinander ab: bei hohen Frequenzen passen weniger Zählerschritte in eine Periode, und somit sind weniger niederwertige Bits von duty_u16 von Bedeutung.

  • Die erreichbare PWM-Frequenz hängt von der Taktquelle und dem Vorteiler des Timers ab. STM32 TIM2 / TIM5 sind auf den meisten Bauteilen 32-Bit (und auf dem STM32N6 auch TIM3 / TIM4) und bieten breitere Frequenz- und Tastverhältnisbereiche; die übrigen Timer sind 16-Bit. Die genauen Bereiche finden Sie im relevanten MCU-Referenzhandbuch.

  • Auf STM32 teilen sich mehrere PWM-Kanäle am selben TIM eine Frequenz. Das Setzen von freq() an einer Instanz ändert die Ausgabe jedes anderen an diesen TIM angeschlossenen Kanals.