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 ช่อง

เมื่อเปรียบเทียบกับ 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