SSブログ

(続)ESP32のLEDCについて調べてみた。 [ESP32]

某SNSで、LEDCで16チャネル分のPWM出力した時、チャネル8以降でDutyを0に設定してもLOWにならない!と言う話。その後
https://www.facebook.com/groups/927623023964478/permalink/2015391691854267/

件のコードは以下。
#define  L1   27
#define  L15  2

void setup()
{
  Serial.begin(9600);
  pinMode(L1,OUTPUT);
  ledcSetup(0, 256, 8);
  ledcAttachPin(L1, 0);
  pinMode(L15,OUTPUT);
  ledcSetup(8, 256, 8);
  ledcAttachPin(L15,8);
  delay(10);
}

void loop()
{
  for(int vr = 0; vr <= 255; vr++)
  {
    ledcWrite(0,vr);
    ledcWrite(8,vr);
    Serial.println(vr);
    delay(10);
  }
  delay(2000);

  for(int vr = 255; vr >= 0; vr--)
  {
    ledcWrite(0,vr);
    ledcWrite(8,vr);
    Serial.println(vr);
    delay(10);
  }
  delay(5000); 
}

前回は秋月で3450円で売っている簡易オシロ( http://akizukidenshi.com/catalog/g/gM-12972/ )で確認した。このオシロではDuty=100%時になんかヒゲが出ている事は確認している。
今回はもう少しましなオシロ( http://akizukidenshi.com/catalog/g/gM-10135/ )で確認してみる。

チャネル8の出力で、Duty=100%と0%の両方で止めてみた波形が以下
Duty=100%
esp32_ledc_level1.png

Duty=0%
esp32_ledc_level0.png


ともにおよそ15μsのヒゲが出ている事が観測される。またDuty=100%ではLOWに落ち切らず、800mVくらいオフセットが出ている。
※15μsは、PWM周波数が256Hz、分解能が8bitからであろう。

※どうも8bit分解能ではDuty=100%にする為には256を設定しないとダメみたいだ。0~256???

※Duty=0%にしてもLOWに落ち切らない現象はチャネル8(以降?)で発生する。

※件の問題の原因がこれかどうかは判らない。

※しかしこれはライブラリのバグでしょう!

※esp32-hal-ledc.cのledcWriteを見てみると、
esp32_ledc_hal_ledcWrite.png


チャネル8が所属するグループ1側は値の変更に対して、チャネル0~7のグループ0はクロックの停止をしている?なぜグループで対応が異なるのかは判らない。

※githubでも報告されていますねん!
https://github.com/espressif/arduino-esp32/issues/1909
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。