プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

あれ?ESP32のPWMって何bitだっけ?

f:id:s51517765:20220402183629p:plain

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

f:id:s51517765:20220402183717p:plain

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.

github.com

こちらのようなエイリアスを設定する必要がありそうです。

まとめ

ESP32のPWMを調査してみました。
Arduinoとは関数が違いますが、同等以上のことはできます。
8Bit PWMで不足のときはESP32を。