※現時点の情報ですので、最新情報は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 | 分解能 | 最大周波数 |
| 16 | 65536 | 1,220.70Hz |
| 15 | 32768 | 2,441.41Hz |
| 14 | 16384 | 4,882.81Hz |
| 13 | 8192 | 9,765.63Hz |
| 12 | 4096 | 19,531.25Hz |
| 11 | 2048 | 39,062.50Hz |
| 10 | 1024 | 78,125.00Hz |
| 9 | 512 | 156,250.00Hz |
| 8 | 256 | 312,500.00Hz |
| 7 | 128 | 625,000.00Hz |
| 6 | 64 | 1,250,000.00Hz |
| 5 | 32 | 2,500,000.00Hz |
| 4 | 16 | 5,000,000.00Hz |
| 3 | 8 | 10,000,000.00Hz |
| 2 | 4 | 20,000,000.00Hz |
| 1 | 2 | 40,000,000.00Hz |
最大周波数を利用したい場合にはビット数1で40MHzになります。この場合には分解能が2ですので、ONとOFFが交互にくる50%の矩形波しか出力できません。
一番分解能を上げると16ビットで1220.70Hzまで周波数が下がります。8ビットの場合には312.5KHzですので、この数値以下を指定して利用しましょう。




コメント
お疲れさまでございます
ESP32で analogWrite が無かったので
思わずこちらの記事にたどり付きました
いつも資料の方ありがとうございます
おかげさまで二足歩行ロボット動きましたので
ご賞味くださいませ
https://qiita.com/chrmlinux/items/3a0adc73477d302ec293