このドキュメンテーションは、MicroPython の最新開発ブランチのためのものです。 リリースバージョンでは利用できない機能に言及することがあります。

特定のリリースのドキュメントをお探しの場合は、左側のドロップダウンメニューを使って、 望みのバージョンを選択します。

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

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

使用例:

from machine import PWM

pwm = PWM(pin, freq=50, duty_u16=8192)  # ピンの 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, invert)

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

  • dest は PWM が出力される実体であり、通常は machine.Pin オブジェクトですが、ポートによっては整数など他の値を使える場合があります。

  • freq は PWM サイクルの周波数を Hz 単位で設定する整数です。

  • duty_u16 はデューティ比を duty_u16 / 65535 の比率で設定します。

  • duty_ns はデューティ比をナノ秒単位で設定します

  • invert に True を指定すると、それぞれの出力を反転させます。

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

メソッド

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にはなりません。

    RP2040 のような一部のポートでは、分数ディバイダを使用しています。これにより、高い周波数での細かい粒度の周波数が実現できます。これは、PWM パルスの持続時間を隣接する2つの値の間で切り替えることにより、平均周波数を意図した周波数により近づけることができますが、その代わりにスペクトルの純度が低下します。

  • デューティ比も同様に離散的な性質を持っており、その絶対精度は達成できません。ほとんどのハードウェアプラットフォームではデューティ比は次の周波数期に適用されます。したがって、デューティ比を測定する前に「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 を生成します。