ESP32でPWM使ったことなかったかも
AD(analogRead)は12bit (分解能4096)なのは確認したけど、PWMって使ったことありませんでした。
まずWeb上を調べてみると、ledcxxx
みたいな関数があることが分かります。
analogWrite
じゃないんですね。
しかも引数が多い…
とりあえず最小限のコードを書くと以下のような感じです。
int bit = 8; //PWM分解能 void setup() { const int Pin = 15; //channel、周波数、解像度 ledcSetup(0, 1000, bit); //ピンをチャンネルにセット ledcAttachPin(Pin, 0); } void loop() { ledcWrite(0, 1 << (bit - 1)); // 50% delay(2000); ledcWrite(0, 0); //OFF delay(500); }
docs.espressif.com
ドキュメントによると20bitまで設定できるようです。
Arduinoの8bitPWMはたまに分解能が不足かな…と思うことがありましたが、20bitではまず困ることはないでしょう。
実際には10bitでまず十分、組込み機器などでもだいたい12bitぐらいまでしか使われておらず十分です。
しかし、周波数は任意には設定できず分解能に依存するようです。
qiita.com
実際に確認してみると、最大周波数は以下のようになりました。(上記と記事と16Bitまでは一致)
分解能を上げると最大周波数が下がります。
分解能 | 周波数 |
20bit | 76Hz |
18bit | 305Hz |
16bit | 1.22kHz |
14bit | 4.88kHz |
12bit | 19.5kHz |
10bit | 78.1kHz |
8bit | 312kHz |
analogWriteはデフォルトでは使えない
上記、ドキュメントにはanalogWrite
も使える、と書かれていますが、IntelisenceはErrorを吐いています。
This function is used to write an analog value (PWM wave) on the pin. It is compatible with Arduinos analogWrite function.
こちらのようなエイリアスを設定する必要がありそうです。
まとめ
ESP32のPWMを調査してみました。
Arduinoとは関数が違いますが、同等以上のことはできます。
8Bit PWMで不足のときはESP32を。