XIAO ESP32C3でPWM出力してみた。

ESP32C3でPWMを出力しようとしたらどうやらArduinoで使っている「AnalogWrite()」が使えないので
その代わりに「ledc」というLEDを制御する記法があるらしいので、その記録を残しておく。



<セットアップ用関数>

bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, int8_t channel);

引数:ピン番号、周波数(Hz)、分解能(bit)、チャンネル

LEDCには16個の「チャンネル」というものが存在しているみたい。



<出力用関数>

bool ledcWrite(uint8_t pin, uint32_t duty);

引数:ピン番号、Duty比(bit)


<PWMをゆっくり可変>

bool ledcFade(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms);

引数:ピン番号、開始Duty、目標Duty、開始→目標までにかける時間(ms)


全体コード

#define PWM_PIN D0 // PWMを出力するピン
#define PWM_FREQ 1000 //PWMの出力周波数
#define PWM_RESOLUTION 10 //分解能(bit)
#define LEDC_CHANNEL 1 //PWM出力に使うチャンネル


void setup(){

  pinMode(PWM_PIN , OUTPUT);

  ledcAttachChannel(PWM_PIN , PWM_FREQ , PWM_RESOLUTION , LEDC_CHANNEL);
  ledcWrite(PWM_PIN, 0x01FF);

}
void loop(){

}
動作
D0ピンから1kHzのPWM(1kHz,50%)が出力される。

ホタルの光プログラム

while(1){
    ledcFade(PWM_PIN , START_DUTY , TARGET_DUTY , 1000 );
    delay(1000);
    ledcFade(PWM_PIN , TARGET_DUTY , 0 , 1000 );
    delay(1000);
  }

但し、複数のチャンネルを使用すると立ち上がりとかで同期されていないらしいので注意が必要
(できるのかもしれない)


docs.espressif.com