MicroPythonでPWMを動かしてみる

MicroPythonでは、

  1. 出力ピンを指定してオブジェクトを初期化
  2. 周波数とデューティ比をメソッドで指定する

といった簡単な操作でPWMが扱える。ESP8266とESP32ではプログラミングの作法は全く同じ。pyboardなど他のハードでは呼び出すメソッド名が微妙に違ったりするが、大差は無い。

今回はESP32とESP8266上でMicroPythonからPWMを動かしてみたので記事にまとめておく。

スポンサーリンク

PWMの仕様

ESP32とESP8266それぞれのPWMに関する日本語公式ドキュメントは以下。

仕様を表にまとめると、

ESP8266ESP32
使える出力ピンPin(16)以外全て
基本周波数〜1kHz迄〜40MHz迄
デューティ比解像度10bit10bit(有効ビットは基本周波数に依存)

双方のチップともにデューティ比は1024ステップで指定し、0だと0%(0V出力)、512なら50%、1023では100%(3.3VのDC出力)といった具合。但し、ESP32では基本周波数が高いとデューティ比の解像度が落ちるので注意(後述)。

対話型インタフェースで動かしてみる

マイコンの出力端子をオシロ(ADALM2000+Scopy)に接続して、MicroPythonの対話型インタフェース(REPL)でコンソールから1行ずつプログラム実行しつつオシロでPWM出力波形を確認した。

ESP8266で0番ピンをオシロに接続し、以下を実行。

from machine import Pin, PWM

pwm0 = PWM(Pin(0))      # ピンから PWM オブジェクトを作成
pwm0.freq(1000)         # 周波数を設定
pwm0.duty(200)          # デューティ比を設定

このプログラムでは周波数1000Hz・デューティ比約0.2(200/1024)を指定しているのだが、ピン0の出力波形をオシロで確認すると以下のようになった。横軸は1マス200usなので波形はプログラムの指定通り、縦軸は1マス500mVなので電圧は3.3Vとわかる。

ESP32でも上記プログラム実行により全く同じ結果となった。

まろ

ESP32でのデューティ比の解像度について

ESP32は基本周波数上限が40MHzだが、40MHzの時はデューティ比は1bitの解像度、つまり50%で固定となる。そして基本周波数が40MHzの半分の20MHzではデューティ比は2bit(つまり25%ステップ)と2倍の解像度で表現出来、更に半分の10MHzではデューティ比3bit(12.5%ステップ)…といった具合で基本周波数が下がるほどデューティ比の解像度が上がるという関係になる。

ただ基本周波数とは無関係にデューティ比の指定は10bit(0〜1023)固定で行うなため、デューティ比の解像度が10bit未満となる場合には上位ビットだけが有効になり下位ビットは無視される。

基本周波数10MHzの場合で確かめる。以下を実行。

pwm0.freq(10000000)     # 基本周波数10MHz
pwm0.duty(128)          # デューティ比0.125(128/1024)

するとオシロからは下のような波形が得られる。高周波のためリンギングが見えるのと、オシロの上限帯域(25MHz)近くのため波形が鈍って見えるが、横軸の1マスは100nsなので指定通り10MHzの発振でデューティ比も0.125位だという事はなんとなく確認出来る。

そしてこの場合デューティ比として128〜255のどの値を指定しても、上位3ビットが同じため下位7ビットは無視されて全く同じ結果となる。

まろ

まとめ

今回はMicroPythonでPWMを動かしてみた。基本周波数とデューティ比をプログラムで指定するだけの簡単操作で使え、ESP8266とESP32ではプログラミングの作法も全く同じ。ESP8266は基本周波数の上限が1kHzなのに対し、ESP32は基本周波数が40MHz迄対応しており幅広い用途に使えそう。但し、ESP32のPWMを高い基本周波数で使う時はデューティ比の解像度が下がるので要注意だ。

コメント