MicroPython の ESP32: PWM とデューティ サイクル
ESP32 で使用できる PWM ハードウェアは予想よりも少し複雑で、一部のことは RMT を使用した方がうまく達成できる可能性があります。 この抜粋は、MicroPython での ESP32 のプログラミング、I Programmer Library の一部であり、PWM ハードウェアの使用方法が示されています。
アマゾンから購入してください。
序文
ESP32 には 2 つの PWM ハードウェア実装があります。 1 つはモーター制御での使用を目的としており、デッド ゾーンや自動ブレーキなどの追加機能を備えています。 これは MicroPython ではサポートされていないため、利用したい場合は C に移行する必要があります。2 番目の LEDC は、自動調光などの機能やさらに珍しい機能を備えた LED を駆動するように特別に設計されています。 MicroPython は基本的な LEDC 操作をサポートしますが、すべての追加機能へのアクセスは提供しません。
PWM ジェネレーターは任意の GPIO ピンに割り当てることができます。 ESP32 に搭載される PWM ジェネレーターの数は、正確なモデルによって異なります。 それらは、高速と低速の 2 つのグループに分かれます。 高速タイプは自動調光機能を備えており、周波数とデューティサイクルをスムーズに変更できます。 低速タイプにはこれらの機能がなく、周波数とデューティ サイクルを変更するのはソフトウェア次第です。 各グループには、生成できる異なる周波数の数と所定のチャネル数を決定する設定された数のタイマーもあります。
EP32 を使用する最も一般的な開発ボードには、高速と低速の 2 つの PWM グループがあり、各グループに 8 つのチャネルがあります。 ESP32-S2 には高速グループが 1 つだけありますが、それ以外は同一です。 ESP32-C3 は RISC ベースで、ESP32-S2 と同じですが、チャネルが 6 つしかありません。 すべての ESP32 デバイスには各グループに 4 つのタイマーがあるため、4 つの異なる周波数を設定できます。
MicroPython は高速グループの追加機能を利用しないため、2 つのグループ間の区別は MicroPython の観点からは無関係です。 これが意味するのは、MicroPython の観点から見ると、ESP32 には 8 つの異なる周波数で動作できる 16 個の PWM チャネルがあるということです。 すべてのチャネルは異なるデューティ サイクルで動作できます。
PWM ハードウェアがどのように動作するかについて知る必要はありませんが、いくつかの制限を理解するのに役立ちます。
PWM オブジェクトを作成するには、そのコンストラクターに Pin オブジェクトを渡す必要があります。 例えば:
GPIO4 に関連付けられた PWM オブジェクトを作成します。 以下を使用して周波数を設定できます。
周波数を Hz で設定します。 この時点では、PWM ハードウェアは有効になっていません。 信号の生成を開始するには、デューティ サイクルを設定する必要があります。 これは以下を使用して行われます。
ここで、Duty は 0 ~ 100% に相当する 0 ~ 65,535 の範囲の値です。
もあります:
これは、ラインがハイになる時間をナノ秒単位で設定します。 これは一般的な使用にはあまり役に立ちません。設定された期間よりも長い時間を指定すると例外が生成されます。
あるいは、コンストラクターを使用して PWM のすべての特性を指定することもできます。
この記事の執筆時点では、MicroPython 1.19 にはバグがあり、freq() を使用して周波数が設定されている場合にデューティ サイクルが正しく設定されません。 修正方法は、常にコンストラクターを使用して初期周波数を設定することです。
PWM の MicroPython 実装は、インテリジェントな方法でタイマーをチャネルに割り当てます。 特定の周波数で動作する PWM オブジェクトを作成すると、まず同じグループ内にその周波数で動作するタイマーが存在するかどうかが確認されます。 存在する場合は、それを PWM オブジェクトに割り当てます。 その周波数で動作する既存のタイマーがない場合は、空いているタイマーが割り当てられ、新しい周波数で動作するように設定されます。 空きタイマーが残っておらず、必要な頻度で実行されているタイマーがない場合は、例外がスローされます。 これが意味するのは、タイマーをすべて使い切るまでは心配することなく周波数を割り当てることができ、タイマーをすべて使い切るまでは、すでに使用している周波数を設定する必要があるということです。 これは、ESP32 の場合、16 の異なるチャネルに対して最大 8 つの異なる周波数を設定できることを意味します。