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, dasdestansteuert (einPinauf OpenMV-Cams). Die Schlüsselwortargumente entsprechen einem Aufruf voninit()unmittelbar nach der Konstruktion:freq– PWM-Frequenz in Hz.duty_u16– Tastverhältnis als Verhältnisduty_u16 / 65535.duty_ns– Pulsbreite in Nanosekunden.invert– wennTrue, wird die Ausgangspolarität invertiert.
Es darf höchstens eines von
duty_u16/duty_nsgleichzeitig übergeben werden. Das Setzen vonfreqkann anderePWM-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.
- 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
valuewird die Frequenz auf diesen Wert in Hz gesetzt. KannValueErrorauslö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
0–65535.Ohne Argument wird das aktuelle Tastverhältnis zurückgegeben.
Mit einem einzelnen Argument
valuewird das Tastverhältnis aufvalue / 65535der Periode gesetzt.0ist immer Low,65535ist 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
valuewird die High-Zeit jedes Zyklus aufvalueNanosekunden 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_u16von 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 vonfreq()an einer Instanz ändert die Ausgabe jedes anderen an diesen TIM angeschlossenen Kanals.