ESP32のPWM出力は255が最大じゃなかった

※現時点の情報ですので、最新情報はM5StickC非公式日本語リファレンスを確認してください。

ledcWrite()の指定がちょっとモヤッていたのだが、上記をみてやっぱり255じゃないのがわかりました。

ESP32のPWM出力について

ESP32でPWM出力を行う場合には、事前に周波数と分解能をセットします。

#include <M5StickC.h>
 
int PIN = 26;
int PWMCH = 0;
 
void setup() {
  M5.begin();
 
  pinMode(PIN, OUTPUT);
  ledcSetup(PWMCH, 7812.5, 8); // 7812.5Hz, 8Bit(256段階)
  ledcAttachPin(PIN, PWMCH);
  ledcWrite(PWMCH, 128);  //  50%(1.7V)
}
 
void loop() {
}

上記の場合、ledcSetup(PWMCH, 7815.5, 8)で7812.5Hzの8ビット精度です。

7812.5Hzは1秒間に7812.5回の周波ですので、1回あたり128usになります。

上記がオシロスコープの結果ですが、1マスが10usで、ONとOFFのワンセットで13マス弱ですので128usぐらいですね。

8ビット精度ってことは256段階ですから、128usを更に256分割の0.5us単位で制御していることになります。

上記がledcWrite(PWMCH, 1)の結果です。128のときには256分の128なので、50%が電圧出力でしたが、今回は256分の1の出力になっています。

さらに拡大した図ですが、1マス100nsなので0.1usが5マスの0.5us間のパルスが出力されています。ledcWrite(PWMCH, 2)にすると倍の1us間のパルスが出力されるはずです。

最大値は8ビット精度の場合には256になります。DACは0から255までですが、8ビットの場合PWMは0から256までの範囲になるので注意してください。

分解能別最大周波数

Bit分解能最大周波数
16655361,220.70Hz
15327682,441.41Hz
14163844,882.81Hz
1381929,765.63Hz
12409619,531.25Hz
11204839,062.50Hz
10102478,125.00Hz
9512156,250.00Hz
8256312,500.00Hz
7128625,000.00Hz
6641,250,000.00Hz
5322,500,000.00Hz
4165,000,000.00Hz
3810,000,000.00Hz
2420,000,000.00Hz
1240,000,000.00Hz

最大周波数を利用したい場合にはビット数1で40MHzになります。この場合には分解能が2ですので、ONとOFFが交互にくる50%の矩形波しか出力できません。

一番分解能を上げると16ビットで1220.70Hzまで周波数が下がります。8ビットの場合には312.5KHzですので、この数値以下を指定して利用しましょう。

参考サイト

コメントする

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)