PWMを使う(ESP32)

ArduinoでESP32を使用してPWMを実行する場合2つの関数を使用します。

  • analogWrite
    • Arduinoの関数
    • analogWrite(uint8_t pin, int value), analogWriteResolution(uint8_t pin, uint8_t resolution)等
  • LEDC API
    • ArduinoのESP32ライブラリーにある関数。
    • ledcWrite(uint8_t pin, uint32_t duty), ledcAttach(uint8_t pin, uint32_tfreq, uint8_t resolution)等

どちらを使用しても同じような結果を得る事が出来ます。

analogWrite

主な関数

  1. void analogWriteResolution(uint8_t pin, uint8_t resolution)
    • 引数
      • 第一: PWM出力ピン番号
      • 第二: その解像度。
    • PWMの出力ピン番号とその解像度を指定します。
    • 解像度はビット数で指定します。 例: 8 -> 解像度:256
  2. void analogWriteFrequency(uint8_t pin, uint32_t freq)
    • 引数
      • 第一: PWM出力ピン番号
      • 第二: PWMの周波数。
    • PWMの出力ピン番号と周波数を指定します。(これはESP32特別)
  3. void analogWrite(uint8_t pin, int value)
    • 引数
      • 第一: PWM出力ピン番号
      • 第二: デューティ比。
    • PWMの出力ピン番号とデューティ比を指定します。

周波数と解像度はデフォルトの値が設定されているのでこれらを設定すること無くanalogWrite()関数を実行しても機能しますが、一般的には上記、1,2,3の順で実行するのが良いと思います。

LEDC API

主な関数

  1. bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution)
    • 引数
      • 第一: PWM出力ピン番号
      • 第二: 周波数
      • 第三: その解像度。
    • PWMの出力ピン番号と周波数、解像度を指定します。
    • この関数ではチャンネルは自動に振られます。
  2. bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t channel)
    • 引数
      • 第一: PWM出力ピン番号
      • 第二: 周波数
      • 第三: その解像度。
      • 第四: チャンネル番号
    • PWMの出力ピン番号と周波数、解像度、チャンネル番号を指定します。
    • この関数はチャンネルを指定出来る。
  3. void ledcWrite(uint8_t pin, uint32_t duty)
    • 引数
      • 第一: PWM出力ピン番号
      • 第二: デューティ比。
    • PWMの出力ピン番号とデューティ比を指定します。

チャンネルを管理したいなら2番をそうでなければ1番を実行した後、3番を実行。

実機での確認

以下のハードとソフトを準備して動作を実機で確認しました。

使用したハード

30ピンのESP32を使用します。このボードにはユーザーが使用出来るLEDが実装されていました。今回はこのLEDを使う事にしました。このLEDはGPIOポート”2”に接続されていました。

検証プログラム

以下のプログラムで検証しました。

pwm.ino

#include "Arduino.h"
#define PWM_Freq      12800
#define PWM_Bit       8
#define LED_PIN       2

void setup() 
{
    Serial.begin(115200);
    delay(500);
/*    
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, 0);
*/    
}

void loop() 
{
  int a;

    Serial.println("Start analogWrite demo");
    analogWriteResolution(LED_PIN, PWM_Bit);
    analogWriteFrequency(LED_PIN, PWM_Freq);
    for(a = 0; a < 256; a ++){
      analogWrite(LED_PIN, a);
      delay(10);
    }
    delay(500);

    Serial.println("Start ledcWrite demo");
    ledcAttach(LED_PIN, PWM_Freq, PWM_Bit);
    for(a = 0; a < 256; a ++){
      ledcWrite(LED_PIN, a);
      delay(10);
    }
    delay(500);
}
  • 20から26行がanalogWrite。29から34行がLEDC APIの検証用プログラムです。
  • 解像度を8ビット、周波数を12800Hzにセットしています。
  • 出力の値を0から256に増やして行き、LEDが段々明るく点灯する様に設定しています。
  • このプログラムでどちらもLEDが段々明るく点灯する事を確認しました。
  • 使用するポートを出力に設定する必要が有ると思いその設定を行った(11,12行)のですが出力設定を行わなくとも動作する事が分かりました。