class PWM —— 脈衝寬度調變

PWM 類別在 Pin 上輸出脈衝寬度調變訊號。它是現代且跨 port 的 PWM API;在 STM32 OpenMV 相機上,它包裝了底層的 pyb.Timer 通道機制,因此每個 PWM 實例會佔用一個計時器通道。

使用範例:

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

建構函式

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

建構一個驅動 dest(OpenMV 相機上的 Pin)的 PWM 物件。其關鍵字引數等同於在建構後立即呼叫 init()

  • freq —— PWM 頻率(Hz)。

  • duty_u16 —— 以 duty_u16 / 65535 比值表示的工作週期。

  • duty_ns —— 以奈秒表示的脈衝寬度。

  • invert —— 若為 True,則反轉輸出極性。

duty_u16duty_ns 一次至多只能傳入其中一個。設定 freq 可能會影響共用同一底層計時器的其他 PWM 實例(在 STM32 上確實如此——給定 TIM 的每個通道都以相同頻率執行)。

方法

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

重新設定 PWM 輸出。只有提供的引數會被更新;其餘引數保留先前的值。各引數的意義請參閱建構函式。

deinit() None

停用 PWM 輸出並釋放其所佔用的計時器通道。

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

取得或設定 PWM 頻率。

若不帶引數,則返回目前的頻率(Hz)。

若帶單一 value 引數,則將頻率設為該值(Hz)。若頻率超出底層計時器可達到的範圍,可能會引發 ValueError

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

取得或設定工作週期,以範圍 0 —— 65535 的無號 16 位元值表示。

若不帶引數,則返回目前的工作週期。

若帶單一 value 引數,則將工作週期設為週期的 value / 655350 一律為低電位,65535 一律為高電位。

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

直接以奈秒取得或設定脈衝寬度。

若不帶引數,則返回目前的脈衝寬度。

若帶單一 value 引數,則將每個週期的高電位時間設為 value 奈秒。對於脈衝寬度(而非工作週期比值)才是關鍵量的伺服機式輸出而言相當實用。

限制

  • 在每個硬體計時器上,PWM 頻率與工作週期解析度是相互依存的:在高頻率時,一個週期內可容納的計數步進較少,因此 duty_u16 中有意義的低位元也較少。

  • 可達到的 PWM 頻率取決於計時器的時脈來源與預分頻器。STM32 TIM2 / TIM5 在大多數型號上是 32 位元(在 STM32N6 上 TIM3 / TIM4 也是),可提供更寬的頻率與工作週期範圍;其餘計時器則為 16 位元。確切的範圍請參閱相關 MCU 的參考手冊。

  • 在 STM32 上,同一 TIM 上的多個 PWM 通道共用一個頻率。對某一實例設定 freq() 會改變連接至該 TIM 的每個其他通道的輸出。