class PWM – darbe genişlik modülasyonu

PWM sınıfı, bir Pin üzerinde darbe genişlik modülasyonlu bir sinyal çıkarır. PWM için modern, portlar arası API’dir; STM32 OpenMV kameralarda altta yatan pyb.Timer kanal mekanizmasını sarmalar, dolayısıyla her PWM örneği bir zamanlayıcı kanalını işgal eder.

Örnek kullanım:

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

Yapıcılar

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

dest öğesini (OpenMV kameralarda bir Pin) süren bir PWM nesnesi oluşturun. Anahtar sözcük argümanları, oluşturmanın hemen ardından init() çağrılmasına eşdeğerdir:

  • freq – Hz cinsinden PWM frekansı.

  • duty_u16duty_u16 / 65535 oranı olarak görev döngüsü.

  • duty_ns – nanosaniye cinsinden darbe genişliği.

  • invertTrue ise çıkış polaritesini tersine çevirir.

Bir seferde duty_u16 / duty_ns öğelerinden en fazla biri geçirilebilir. freq ayarlamak, aynı altta yatan zamanlayıcıyı paylaşan diğer PWM örneklerini etkileyebilir (STM32’de doğrudur – belirli bir TIM’in her kanalı aynı frekansta çalışır).

Yöntemler

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

PWM çıkışını yeniden yapılandırın. Yalnızca sağlanan argümanlar güncellenir; diğerleri önceki değerlerini korur. Her argümanın anlamı için yapıcıya bakın.

deinit() None

PWM çıkışını devre dışı bırakın ve işgal ettiği zamanlayıcı kanalını serbest bırakın.

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

PWM frekansını alın veya ayarlayın.

Argüman olmadan, geçerli frekansı Hz cinsinden döndürür.

Tek bir value argümanıyla, frekansı Hz cinsinden o değere ayarlar. Frekans, altta yatan zamanlayıcının ulaşabileceği aralığın dışındaysa ValueError oluşturabilir.

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

Görev döngüsünü 065535 aralığında işaretsiz 16 bitlik bir değer olarak alın veya ayarlayın.

Argüman olmadan, geçerli görev döngüsünü döndürür.

Tek bir value argümanıyla, görev döngüsünü periyodun value / 65535 oranına ayarlar. 0 her zaman düşüktür, 65535 her zaman yüksektir.

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

Darbe genişliğini doğrudan nanosaniye cinsinden alın veya ayarlayın.

Argüman olmadan, geçerli darbe genişliğini döndürür.

Tek bir value argümanıyla, her döngünün yüksek süresini value nanosaniyeye ayarlar. Anlamlı niceliğin görev döngüsü oranı yerine darbe genişliği olduğu servo tarzı çıkışlar için kullanışlıdır.

Kısıtlamalar

  • PWM frekansı ve görev döngüsü çözünürlüğü her donanım zamanlayıcısında birbirine bağlıdır: yüksek frekanslarda bir periyoda daha az sayaç adımı sığar, dolayısıyla duty_u16 değerinin daha az düşük biti anlamlı olur.

  • Ulaşılabilir PWM frekansı, zamanlayıcının saat kaynağına ve ön ölçekleyicisine bağlıdır. STM32 TIM2 / TIM5 çoğu parçada 32 bittir (ve STM32N6’da TIM3 / TIM4 de öyledir), bu da daha geniş frekans ve görev döngüsü aralıkları sağlar; geri kalan zamanlayıcılar 16 bittir. Tam aralıklar için ilgili MCU referans kılavuzuna bakın.

  • STM32’de aynı TIM üzerindeki birden çok PWM kanalı bir frekansı paylaşır. Bir örnekte freq() ayarlamak, o TIM’e bağlı diğer her kanalın çıkışını değiştirir.