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.
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.
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
- Đầu tiên, bạn cần chọn một kênh PWM. Có 16 kênh từ 0 đến 15.
- 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.
- 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.
- 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.
- 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
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é.
Và đây là kết quả
Kết
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é!!!
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)
Bài này là PWM nhé, nó là xung vuông chứ ko phải DAC. DAC ở bài sau bạn nhé
valuePWM= analogRead(pinPWM);
analogWrite(pinLed,valuePWM);
code này của e chạy trên Arduino được sao ESP 32 lại k chạy được a nhỉ . k có hàm analogWrite . A giải thích dùm e với !
em mà muốn điều khiển pwm động cơ thì cũng dùng hàm ledcsetup() vs ledcwrite() hay phải dùng hàm khác ạ
Động cơ hay tải gì khác đều là pwm thôi, bạn làm như bài viết