Bài 3: Lập trình ESP32 PWM băm xung điều khiển LED

lap trinh esp32 pwm dieu khien do sang led

Trong bài này chúng ta sẽ lập trình ESP32 PWM điều khiển độ sáng của Led. PWM là một kĩ thuật rất phổ biến trong lập trình, nó có thể được sử dụng để điều khiển nhiều thiết bị khác nhau như DC motor, Servo motor, âm thanh …

Bài 3 trong Serie Học ESP32 từ A tới Z

PWM là gì

Phương pháp điều chế xung PWM (Pulse Width Modulation) là phương pháp điều chỉnh điện áp ra tải, hay nói cách khác là phương pháp điều chế điện áp dựa trên sự thay đổi độ rộng của chuỗi xung vuông.

Điện áp hiệu dụng của ngõ ra sẽ thay đổi theo độ rộng của sườn xung dương hoặc âm.

PWM

Chúng ta có 2 tham số rất quan trọng khi sử dụng PWM đó là:

  • Tần số (hoặc chu kì) của xung: Frequency
  • Độ rộng xung: Duty
  • Độ phân giải: Resolution hay độ mịn của pwm, độ phân giải càng lớn thì PWM càng mềm mại

Trong điều chế xung PWM, Tần số của xung là cố định, chúng ta chỉ thay đổi độ rộng hay Duty của xung.

pwm

Lập trình ESP32 PWM điều khiển Led

Trong bài này, chúng ta sẽ sử dụng ESP32 pwm điều khiển độ sáng của led, với vòng lặp là sáng dần và tắt dần.

ESP32 có bộ điều khiển LED PWM với 16 kênh độc lập có thể được cấu hình để tạo tín hiệu PWM với các đặc tính khác nhau.

Dưới đây là các bước bạn sẽ phải làm theo để PWM bằng ESP32

  1. Đầu tiên, bạn cần chọn một kênh PWM. Có 16 kênh từ 0 đến 15.
  2. Sau đó, bạn cần đặt tần số tín hiệu PWM. Đối với đèn LED, tần số 5000 Hz là tốt để sử dụng.
  3. Bạn cũng cần đặt độ phân giải của tín hiệu: bạn có độ phân giải từ 1 đến 16 bit. Chúng tôi sẽ sử dụng độ phân giải 8 bit, có nghĩa là bạn có thể kiểm soát độ sáng của đèn LED bằng cách sử dụng giá trị từ 0 đến 255.
  4. Tiếp theo, bạn cần chỉ định GPIO hoặc GPIO nào mà tín hiệu sẽ xuất hiện.
  5. Cuối cùng ciều chỉnh duty của PWM để được độ sáng phù hợp

Sơ đồ nguyên lý (Schematic)

Chúng ta cần chuẩn bị:

  • Breadboard
  • Kit ESP32
  • Trở cắm 200R
  • Led cắm

Sơ đồ cắm như sau

esp32 pwm

Code và giải thích Code

Full code như sau:

#include <Arduino.h>

const int ledPin = 16;  // chọn chân 16 xuất tín hiệu

// cài đặt PWM
const int freq = 5000;  // tần số xung
const int ledChannel = 0; // kênh PWM
const int resolution = 8; // độ phân giải 8bit
 
void setup(){
  // setup kênh pwm
  ledcSetup(ledChannel, freq, resolution);
  
  // xuất pwm ra chân 16
  ledcAttachPin(ledPin, ledChannel);
}
 
void loop(){
  // Sáng dần
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);
    delay(15);
  }

  // tắt dần
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);   
    delay(15);
  }
}

Bạn bắt đầu bằng cách xác định chân mà đèn LED được gắn vào. Trong trường hợp này, đèn LED được gắn vào GPIO 16.

const int ledPin = 16;  // chọn chân 16 xuất tín hiệu

Sau đó, bạn thiết lập các thuộc tính tín hiệu PWM. Bạn xác định tần số 5000 Hz, chọn kênh 0 để tạo tín hiệu và đặt độ phân giải 8 bit. Bạn có thể chọn các thuộc tính khác, khác với các thuộc tính này, để tạo ra các tín hiệu PWM khác nhau.

const int freq = 5000; 
const int ledChannel = 0; 
const int resolution = 8;

Trong setup (), bạn cần định cấu hình LED PWM với các thuộc tính bạn đã xác định trước đó bằng cách sử dụng hàm ledcSetup () truyền vào các đối số đã khai báo bên trên

ledcSetup(ledChannel, freq, resolution);

Sau đó, chọn chân cần xuất tín hiệu ra. Trong ví dụ  này là GPIO 16

ledcAttachPin(ledPin, ledChannel);

Trong vòng lặp, bạn sẽ thay đổi chu kỳ nhiệm vụ từ 0 đến 255 để tăng độ sáng của đèn LED.

Sau đó sử dụng vòng lặp thay đổi độ sáng từ 255 về 0.

Trong mỗi vòng lặp chúng ta sử dụng hàm ledcWrite(ledChannel, dutyCycle) để thay đổi độ sáng của led.

// Sáng dần
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);
    delay(15);
  }

  // tắt dần
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // changing the LED brightness with PWM
    ledcWrite(ledChannel, dutyCycle);   
    delay(15);
  }

Kết nối và nạp code

Sau khi đã code xong chúng ta sẽ kết nối ESP32 với led, nạp code và xem kết quả. Nhấn vào biểu tượng nạp (upload). Có thể bạn sẽ phải nhấn nút boot 2s trong quá trình connecting mạch nhé

 

Các bạn có thể download các bài mẫu tại link:

Kết luận

ESP32 PWM rất đơn giản phải không nào, kĩ thuật pwm này có thể dùng để điều khiển rất nhiều loại thiết bị như led, led 7 thanh, motor các loại. Hay thậm chí phát âm thanh.

Nếu thấy bài viết này có ích hãy chia sẻ và tham gia nhóm Nghiện lập trình để giao lưu nhé!!!

 

 

2 thoughts on “Bài 3: Lập trình ESP32 PWM băm xung điều khiển LED

  1. Minh Phạm says:

    Có phải bên dưới của nhưng hàm này nó sẽ dùng con DAC để chuyển từ tín hiệu số ra điện áp cấp cho con LED không?

    Vì mình thấy nó có liên hệ với bài trước (Đọc tín hiệu analog input)

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *