class PWM -- パルス幅変調

PWM クラスは、Pin 上にパルス幅変調された信号を出力します。これは PWM 用の現代的でポート横断的な API です。STM32 の OpenMV カムでは、内部の pyb.Timer チャンネル機構をラップしているため、各 PWM インスタンスは 1 つのタイマーチャンネルを占有します。

使用例:

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_u16 / duty_ns のうち、一度に渡せるのは最大 1 つです。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 / 65535 に設定します。0 は常にロー、65535 は常にハイです。

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

パルス幅をナノ秒単位で直接取得または設定します。

引数なしの場合、現在のパルス幅を返します。

単一の value 引数を指定すると、各サイクルのハイ時間を value ナノ秒に設定します。デューティ比よりもパルス幅が意味のある量となるサーボ風の出力に便利です。

制限事項

  • PWM 周波数とデューティ分解能は、すべてのハードウェアタイマーで相互に依存します。高い周波数では、1 周期に収まるカウンタステップが少なくなるため、duty_u16 の意味を持つ下位ビットも少なくなります。

  • 実現可能な PWM 周波数は、タイマーのクロックソースとプリスケーラに依存します。STM32 の TIM2 / TIM5 はほとんどの部品で 32 ビット (STM32N6 では TIM3 / TIM4 も同様) であり、より広い周波数およびデューティ範囲を提供します。残りのタイマーは 16 ビットです。正確な範囲については、該当する MCU のリファレンスマニュアルを参照してください。

  • STM32 では、同じ TIM 上の複数の PWM チャンネルは周波数を共有します。1 つのインスタンスで freq() を設定すると、その TIM に接続された他のすべてのチャンネルの出力が変わります。