クラス PWM -- パルス幅変調

このクラスはパルス幅変調出力を提供します。

使用例:

from machine import PWM

pwm = PWM(pin)          # 指定のピンの PWM オブジェクトを作成
pwm.duty_u16(32768)     # パルス幅を 50% に設定

# 200us の周期、デューティ比を 5us で再初期化
pwm.init(freq=5000, duty_ns=5000)

pwm.duty_ns(3000)       # 3us のパルス幅を設定

pwm.deinit()

コンストラクタ

class machine.PWM(dest, *, freq, duty_u16, duty_ns)

次のパラメータを使って、新しい PWM オブジェクトを構築して返します:

  • dest は PWM が出力される実体であり、通常は machine.Pin オブジェクトですが、ポートによっては整数など他の値を使える場合があります。
  • freq は PWM サイクルの周波数を Hz 単位で設定する整数です。
  • duty_u16 はパルス幅を duty_u16 / 65535 の比率で設定します。
  • duty_ns はパルス幅をナノ秒単位で設定します

オブジェクトが同じ基盤の PWM ジェネレーターを共有している場合に freq を設定すると他の PWM オブジェクトに影響を与える可能性があります(これはハードウェアによります)。一度に指定する必要があるのは duty_u16 * と *duty_ns のいずれか1つだけです。

メソッド

PWM.init(*, freq, duty_u16, duty_ns)

PWM オブジェクトの設定を変更します。パラメータの詳細については、上記のコンストラクタを参照してください。

PWM.deinit()

PWM 出力を無効にします。

PWM.freq([value])

PWM 出力の現在の周波数を取得または設定します。

引数がない場合、Hz 単位の周波数が返されます。

単一 value 引数を指定すると、周波数が指定の値に Hz 単位で設定されます。 周波数が有効範​​囲外の場合、メソッドは ValueError 例外を発生します。

PWM.duty_u16([value])

PWM 出力の現在のパルス幅を、0〜65535 の範囲の符号なし16ビット値として取得または設定します。

引数がない場合、パルス幅が返されます。

単一の value 引数を指定すると、パルス幅が value / 65535 の比率として測定されます。

PWM.duty_ns([value])

PWM 出力の現在のパルス幅をナノ秒単位の値として取得または設定します。

引数がない場合、ナノ秒単位のパルス幅が返されます。

単一の value 引数を指定すると、パルス幅が指定の値に設定されます。

特定の PWM クラス実装

次の具象クラスは PWM クラスに拡張を実装しでいます。

PWM の制限

  • ハードウェアの離散的な性質により、すべての周波数を絶対精度で生成できるわけではありません。通常、PWM 周波数は整数ベース周波数を整数分周器で除算することによって得られます。たとえば、基本周波数が 80MHz で、必要な PWM 周波数が 300kHz の場合、分周器は非整数の数値 80000000 / 300000 = 266.67 である必要があります。丸め後、分周器は 267 に設定され、PWM 周波数は 80000000 / 267 = 299625.5 Hz となり、300kHz にはなりません。分周器が 266 に設定されている場合、PWM周波数は 80000000 / 266 = 300751.9 Hz になり、これも 300kHzにはなりません。

    Some ports like the RP2040 one use a fractional divider, which allow a finer granularity of the frequency at higher frequencies by switching the PWM pulse duration between two adjacent values, such that the resulting average frequency is more close to the intended one, at the cost of spectral purity.

  • デューティ比も同様に離散的な性質を持っており、その絶対精度は達成できません。ほとんどのハードウェアプラットフォームでは、デューティは次の周波数期に適用されます。したがって、デューティを測定する前に「1/周波数」以上待つ必要があります。

  • 周波数とデューティ比の分解能は通常、相互に依存しています。PWM 周波数が高いほど、使用可能なデューティ分解能は低くなり、その逆も同様です。たとえば、300kHz の PWM 周波数は、予想される 16 ビットではなく、8 ビットのデューティ比分解能を持てます。この場合、 duty_u16 の下位8ビットは重要ではありません。したがって、

    pwm=PWM(Pin(13), freq=300_000, duty_u16=2**16//2)
    

    pwm=PWM(Pin(13), freq=300_000, duty_u16=2**16//2 + 255)
    

    は、同じ 50% のデューティ比で PWM を生成します。