8.PWM(Pulse Width Modulation)

1. āļāļēāļĢāđāļ™āļ°āļ™āļģāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ PWM āļšāļ™ BiBoard (ESP32)

ESP32 āļ—āļĩāđˆāđƒāļŠāđ‰āđ‚āļ”āļĒ BiBoard āļ™āļąāđ‰āļ™āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļ 328P āļ—āļĩāđˆāđƒāļŠāđ‰āđ‚āļ”āļĒ UNO āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ PWM āļ‚āļ­āļ‡ ESP32 āđƒāļŠāđ‰āđ€āļĄāļ—āļĢāļīāļāļ‹āđŒāļšāļąāļŠ āļˆāļķāļ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļāļąāļšāļžāļīāļ™āļ—āļĩāđˆāđ„āļĄāđˆāđ„āļ”āđ‰āļĢāļ°āļšāļļāđ„āļ”āđ‰

PWM āļ‚āļ­āļ‡ ESP32 āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļ•āļąāļ§āļ„āļ§āļšāļ„āļļāļĄ LED (LEDC) āļ•āļąāļ§āļ„āļ§āļšāļ„āļļāļĄ LED PWM āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļ„āļ§āļšāļ„āļļāļĄ LED āđāļĨāļ°āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļŠāļąāļāļāļēāļ“ PWM āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļ·āđˆāļ™āđ† āļ•āļąāļ§āļ„āļ§āļšāļ„āļļāļĄāļĄāļĩāļ•āļąāļ§āļˆāļąāļšāđ€āļ§āļĨāļē 8 āļ•āļąāļ§ āļ‹āļķāđˆāļ‡āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļšāļŠāđˆāļ­āļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļŠāļđāļ‡ 8 āļŠāđˆāļ­āļ‡ āđāļĨāļ°āļŠāđˆāļ­āļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ•āđˆāļģ 8 āļŠāđˆāļ­āļ‡ āļĢāļ§āļĄāđ€āļ›āđ‡āļ™ 16 āļŠāđˆāļ­āļ‡

Key Settings of LED PWM Controller's API

āđ€āļĄāļ·āđˆāļ­āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļš UNO āđƒāļŦāđ‰āđƒāļŠāđ‰ "analogWrite()" āđ‚āļ”āļĒāļ•āļĢāļ‡āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ™āļ­āļąāļ•āļĢāļēāļŠāđˆāļ§āļ™āļ—āļģāļ‡āļēāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡ 0-255 āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄ PWM āļ‚āļ­āļ‡ ESP32 āļšāļ™ BiBoard āļ™āļąāđ‰āļ™āļĒāļļāđˆāļ‡āļĒāļēāļāļāļ§āđˆāļē āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ„āļ§āļšāļ„āļļāļĄāļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰:

  1. āļāļēāļĢāđ€āļĨāļ·āļ­āļāļŠāđˆāļ­āļ‡ PWM āļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡ (0-15) āļĒāļąāļ‡āļŠāđˆāļ§āļĒāđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļžāļīāļ™

  2. āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āļ‚āļ­āļ‡āļĢāļđāļ›āļ„āļĨāļ·āđˆāļ™ PWM āļˆāļ°āļāļģāļŦāļ™āļ”āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļđāļ›āļ„āļĨāļ·āđˆāļ™ PWM āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āļĒāļīāđˆāļ‡āļĄāļēāļ āļ„āļ§āļēāļĄāđāļĄāđˆāļ™āļĒāļģāļĒāļīāđˆāļ‡āļŠāļđāļ‡

  3. āļ„āļ§āļēāļĄāļ–āļĩāđˆāļ‚āļ­āļ‡āļĢāļđāļ›āļ„āļĨāļ·āđˆāļ™ PWM āļˆāļ°āļāļģāļŦāļ™āļ”āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļĢāļđāļ›āļ„āļĨāļ·āđˆāļ™ PWM āļĒāļīāđˆāļ‡āļ„āļ§āļēāļĄāļ–āļĩāđˆāļŠāļđāļ‡ āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļĒāļīāđˆāļ‡āđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™

āļ„āļ§āļēāļĄāļ–āļĩāđˆāļ‚āļ­āļ‡āļĢāļđāļ›āļ„āļĨāļ·āđˆāļ™ PWM āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āļ™āļąāđ‰āļ™āļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļāļąāļ™ āļĒāļīāđˆāļ‡āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āļĄāļēāļ āļ„āļ§āļēāļĄāļ–āļĩāđˆāļĒāļīāđˆāļ‡āļ•āđˆāļģ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļĒāļāļĄāļēāļˆāļēāļāļ„āļđāđˆāļĄāļ·āļ­āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ ESP32:

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āđ€āļĄāļ·āđˆāļ­āļ„āļ§āļēāļĄāļ–āļĩāđˆ PWM āļ„āļ·āļ­ 5 kHz āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŠāļđāļ‡āļŠāļļāļ”āļˆāļ°āđ€āļ›āđ‡āļ™ 13 āļšāļīāļ• āļ‹āļķāđˆāļ‡āļŦāļĄāļēāļĒāļ„āļ§āļēāļĄāļ§āđˆāļēāļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āđ‡āļ™āļ„āđˆāļēāđƒāļ”āļāđ‡āđ„āļ”āđ‰āļĢāļ°āļŦāļ§āđˆāļēāļ‡ 0 āļ–āļķāļ‡ 100% āđ‚āļ”āļĒāļĄāļĩāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ” ~0.012% (2 ** 13 = 8192 āļĢāļ°āļ”āļąāļšāļ„āļ§āļēāļĄāļŠāļ§āđˆāļēāļ‡ LED āđāļšāļšāđāļĒāļāļŠāđˆāļ§āļ™)

āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āļ„āļ§āļšāļ„āļļāļĄ LED PWM āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļŠāļąāļāļāļēāļ“āļ„āļ§āļēāļĄāļ–āļĩāđˆāļŠāļđāļ‡ āļ‹āļķāđˆāļ‡āđ€āļžāļĩāļĒāļ‡āļžāļ­āļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļēāđ„āļ›āļĒāļąāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļ·āđˆāļ™āđ† āđ€āļŠāđˆāļ™ āđ‚āļĄāļ”āļđāļĨāļāļĨāđ‰āļ­āļ‡āļ”āļīāļˆāļīāļ—āļąāļĨ āļ—āļĩāđˆāļ™āļĩāđˆāļ„āļ§āļēāļĄāļ–āļĩāđˆāļŠāļđāļ‡āļŠāļļāļ”āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āđ‡āļ™ 40 MHz āđāļĨāļ°āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ„āļ·āļ­ 1 āļšāļīāļ• āļāļĨāđˆāļēāļ§āļ­āļĩāļāļ™āļąāļĒāļŦāļ™āļķāđˆāļ‡ āļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļ„āļ‡āļ—āļĩāđˆāļ—āļĩāđˆ 50% āđāļĨāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ„āļ”āđ‰

API āļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒ LED PWM āļŠāļēāļĄāļēāļĢāļ–āļĢāļēāļĒāļ‡āļēāļ™āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđ€āļĄāļ·āđˆāļ­āļ„āļ§āļēāļĄāļ–āļĩāđˆāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰āđāļĨāļ°āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļāļīāļ™āļŠāđˆāļ§āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒ LED PWM āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŦāļēāļāļ„āļļāļ“āļžāļĒāļēāļĒāļēāļĄāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ„āļ§āļēāļĄāļ–āļĩāđˆāđ€āļ›āđ‡āļ™ 20 MHz āđāļĨāļ°āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļĢāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™ 3 āļšāļīāļ• āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļˆāļ°āļ–āļđāļāļĢāļēāļĒāļ‡āļēāļ™āļšāļ™āļˆāļ­āļ āļēāļžāļžāļ­āļĢāđŒāļ•āļ‹āļĩāđ€āļĢāļĩāļĒāļĨ

2. Configure the PWM frequency on BiBoard in Arduinoin Arduino

āļ”āļąāļ‡āļ—āļĩāđˆāđāļŠāļ”āļ‡āđ„āļ§āđ‰āļ”āđ‰āļēāļ™āļšāļ™ āđ€āļĢāļēāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āļ„āđˆāļēāļŠāđˆāļ­āļ‡āļŠāļąāļāļāļēāļ“ āļ„āļ§āļēāļĄāļ–āļĩāđˆ āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļšāļīāļ• āđāļĨāļ°āđ€āļĨāļ·āļ­āļāļžāļīāļ™āđ€āļ­āļēāļ•āđŒāļžāļļāļ•

āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ•āļąāļ§āļ„āļ§āļšāļ„āļļāļĄ PWM

const int freq = 5000; // PWM frequency
const int ledcChannel = 0; // ledc channel, 0-15
const int resolution = 8; // resolution of PWM8bit0ï―ž255
ledcSetup(ledcChannel, freq, resolution);

āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļāļģāļŦāļ™āļ”āļ„āđˆāļēāļžāļīāļ™āđ€āļ­āļēāļ•āđŒāļžāļļāļ• PWM

ledcAttachPin(ledPin, ledcChannel);

āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3: āđ€āļ­āļēāļ•āđŒāļžāļļāļ•āļĢāļđāļ›āļ„āļĨāļ·āđˆāļ™ PWM

ledcWrite(ledcChannel, dutyCycle);

āđƒāļ™āļāļēāļĢāļŠāļēāļ˜āļīāļ• āđ€āļĢāļēāđ€āļĨāļ·āļ­āļ IO2 āđ€āļ›āđ‡āļ™āļžāļīāļ™āđ€āļ­āļēāļ•āđŒāļžāļļāļ• āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ IO2 āđ€āļ‚āđ‰āļēāļāļąāļš LED āđāļĨāļ°āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāļ‡āđ€āļāļ•āđ€āļ­āļŸāđ€āļŸāļāļ•āđŒāļ‚āļ­āļ‡āđ„āļŸ LED āļāļĢāļ°āļžāļĢāļīāļšāļŠāđ‰āļēāđ†āđ„āļ”āđ‰

3. Complete code:

/* In this demo, we show how to use PWM in BiBoard(ESP32)
* It's different from the Arduino UNO based on the ATMega328P
*/

// define the PWM pin
const int ledPin = 2;  // 16 corresponds to GPIO16

// setting PWM properties
const int freq = 5000;          // PWM frequency
const int ledcChannel = 0;      // ledc channel, in ESP32 there're 16 ledc(PWM) channels
const int resolution = 8;       // resolution of PWM
 
void setup(){
  // configure ledc functionalitites
  // channels 0-15, resolution 1-16 bits, freq limits depend on resolution
  // ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
  ledcSetup(ledcChannel, freq, resolution);     
  
  // attach the channel to the GPIO to be controlled
  ledcAttachPin(ledPin, ledcChannel);
}
 
void loop(){
  // increase the LED brightness
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    ledcWrite(ledcChannel, dutyCycle);
    delay(15);
  }

  // decrease the LED brightness
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledcChannel, dutyCycle);   
    delay(15);
  }
}

Last updated

Was this helpful?