ESP-WROOM-32(ESP32)のPWM

Arduino IDEを使ってESP-WROOM-32(ESP32)のPWMを制御するプログラムを書く方法を記載します。

PWMとは

PWM(Pulse Width Modulation)は、次の図のような周期的なパルス信号を生成し、1になっている時間と0になっている時間の比率(デューティー比)を変えることで送信する電力を変化させます。

PWMの仕組み

LEDの点灯にPWMを使うと、1になっている時間が短いと人間の目にはLEDが暗くなったように見え、時間が長いと明るく見えます。

PWMを使う場合、2つの値を指定します。

  • パルスの周期
  • デューティー比

ESP-WROOM-32をArduino IDEでプログラムする場合、LEDCライブラリを使ってPWMを制御します。LEDCでは上記2つの値を指定するために3つの値を使います。

  • パルスの周期(Hzで指定)
  •  1周期に含まれる目盛の数(ビット数で指定。10bitなら1024目盛。最大は16bit。)
  • 1になっている時間の長さ(上記の目盛で指定。10bit目盛の場合は0〜1023の値。)

また、LEDCではどのチャンネルを使うかを指定します。チャンネルは0〜15の16個あります。

LEDCライブラリのパラメータ

LEDの明るさを制御するプログラム例

LEDをだんだん明るくし、輝度が最大になったら、今度はだんだん暗くする動作を繰り返すプログラムです。setup( )関数内のledcSetup( )関数でパラメータを設定し、ledcAttachPin( )関数で使用するピンを指定しています。loop( )関数内では、ledcWrite( )関数でLEDの明るさを変更しています。

#define PIN 23

// LEDCのパラメータ設定
//   LEDC_CHANNEL        : チャンネル : 0
//   LEDC_RESOLUTION_BITS: 目盛数    : 10bit (0〜1023)
//   LEDC_FREQUENCY  : 周波数    : 50Hz (= 20ms周期)
#define LEDC_CHANNEL 0
#define LEDC_RESOLUTION_BITS 10
#define LEDC_FREQUENCY 50

const int32_t min = 0;
const int32_t max = 1023;
const int32_t delta = 32;
int32_t i;

void setup() {
  Serial.print("PIN = ");
  Serial.println(PIN);
  ledcSetup(LEDC_CHANNEL, LEDC_FREQUENCY, LEDC_RESOLUTION_BITS);
  ledcAttachPin(PIN, LEDC_CHANNEL);
}

void loop() {
  for (i = min; i < max; i += delta) {
    ledcWrite(LEDC_CHANNEL, (uint32_t)i);
    delay(50);
  }
  for (i = max; i > min; i -= delta) {
    ledcWrite(LEDC_CHANNEL, (uint32_t)i);
    delay(50);
  }
}

関連記事

[Nefry BTとGrove接続実験] LEDソケット+LED(赤、青、緑)

カテゴリーIoT

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください