ESP32 PWM với Arduino IDE (Ví dụ mờ dần LED)

ESP32 PWM với Arduino IDE (Ví dụ mờ dần LED)

Giới thiệu PWM

Bạn có thể làm gì với PWM? Nó là viết tắt của điều chế độ rộng xung và nó bao gồm việc tạo ra một sóng vuông. bạn có thể kiểm soát thời gian lên hoặc cao trong tín hiệu PWM. Điện áp tối thiểu và tối đa là các giá trị giới hạn sóng dao động, không gian giữa chúng được gọi là biên độ. Chu kỳ là khoảng thời gian của sóng mà bạn có thể tìm thấy một lần lặp lại hoàn toàn thời gian một chu kỳ kết thúc được gọi là khoảng thời gian. Khoảng thời gian của tín hiệu là

Time period = on time + off time

Tần số PWM

Tần suất là 1 trong một khoảng thời gian cung cấp cho bạn có bao nhiêu chu kỳ trong một đơn vị thời gian. Ví dụ: nếu chu kỳ hẹn giờ của tín hiệu là 20ms, tần số của nó sẽ là 50Hz trong đó Hz là đơn vị tần số. Nó được đọc là một hertz.

Frequency =  1 / timer period

Hình ảnh dưới đây cho thấy biên độ và chu kỳ hẹn giờ của dạng sóng.

Giới thiệu điều chế độ rộng xung

Duty Cycle là gì?

Chu kỳ nhiệm vụ PWM

Chu kỳ nhiệm vụ là một khái niệm quan trọng được sử dụng trong điều chế độ rộng xung. Chu kỳ nhiệm vụ đại diện cho lượng thời gian mà tín hiệu cao trong tổng khoảng thời gian.

Vì vậy, công thức cho chu kỳ nhiệm vụ được hiển thị trong biểu thức nhất định dưới đây:

Duty Cycle = (  On time of signal /  total timer period of signal )

Phần cứng ESP32 PWM

Giống như các mô-đun tích hợp khác ,bằng cảm ứng và cảm biến hiệu ứng hội trường, bo mạch ESP32 cũng có bộ điều khiển PWM tích hợp trong đó. Nó hỗ trợ mười sáu kênh điều chế độ rộng xung. Chúng tôi có thể sử dụng các kênh này để nhận tín hiệu PWM từ bất kỳ chân GPIO nào. Trước đó, chúng ta cần định cấu hình các tham số và gán mã PIN của nó. Chúng tôi sẽ sớm làm thế nào để thiết lập các tham số này. Trong hướng dẫn này, bạn sẽ học cách sử dụng PWM cho các ứng dụng khác nhau:

  • Đầu tiên, bạn sẽ học cách định cấu hình các kênh này để tạo tín hiệu trên các chân ESP32.

  • Bạn sẽ học cách tạo tín hiệu chu kỳ nhiệm vụ sửa chữa.

  • Bạn cũng sẽ thấy cách tạo tín hiệu chu kỳ tác vụ thay đổi.

  • Cuối cùng, tôi sẽ chỉ cho bạn một ví dụ về phai màu LED với chân GPIO 15 làm tín hiệu điều khiển kỹ thuật số.

Định cấu hình kênh ESP32 PWM

Nếu bạn biết lập trình Arduino Ono, bạn phải thấy rằng hàm analogWrite được sử dụng để tạo PWM trong Arduino IDE cho bảng liên quan đến Arduino. Nhưng một chức năng khác được sử dụng để tạo tín hiệu PWM cho ESP32 trong Arduino IDE. Thực hiện theo các bước sau để đặt tham số cho tất cả các kênh điều chế độ rộng xung:

  • Có 16 kênh LEDC có sẵn. Bạn cần chọn bất kỳ kênh nào từ 0 đến 15.

  • Bước thứ hai là chọn tần số của tín hiệu kỹ thuật số. Ví dụ: bạn có thể đặt tần số như 10.000 hertz, 5000 hertz hoặc bất kỳ giá trị nào khác mà bạn muốn.

  • Bo mạch ESP32 hỗ trợ độ phân giải từ 1 bit đến 16 bit. Nhưng hãy nhớ tần số và độ phân giải của tín hiệu PWM có ảnh hưởng nghịch đảo với nhau. Vì vậy, để đạt được tần số tối đa, độ phân giải tối ưu là 8 bit. Bạn có thể tìm thêm thảo luận về nó trong liên kết này.

  • Chúng tôi sẽ sử dụng độ phân giải 8 bit và giá trị chu kỳ hoạt động sẽ thay đổi trong khoảng 0-255. Chu kỳ nhiệm vụ xác định chiều rộng của tín hiệu hoặc đúng thời gian của tín hiệu.

  • Bước cuối cùng là đính kèm mã PIN GPIO với kênh PWM mà bạn chọn.

API ESP32 PWM trong Arduino IDE

Bây giờ hãy xem cách đặt các tham số này bên trong thư viện PWM. Ba chức năng được sử dụng cho mục đích này. Một cái được sử dụng để đặt mã PIN với kênh. Chức năng thứ hai được sử dụng để đặt tần số, độ phân giải và kênh của bộ điều khiển PWM và chức năng thứ ba được sử dụng để tạo tín hiệu với một chu kỳ nhiệm vụ được chỉ định.

ESP32 ledc thiết lập

Chức năng này được sử dụng để đặt số kênh, tần số và độ phân giải của tín hiệu đầu ra. Chúng ta nên chuyển ba đối số làm đầu vào cho hàm này, số kênh, tần số và độ phân giải. Chúng tôi chỉ sử dụng chức năng này bên trong chức năng thiết lập.

uint32_t    ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);

Đèn led ESP32AttachPin

ledcAttachPin này gắn bất kỳ chân GPIO nào với một kênh. Hàm này chấp nhận hai đối số. Một là chân GPIO mà chúng ta muốn lấy OUTPUT của tín hiệu và đối số thứ hai là kênh mà chúng ta tạo ra tín hiệu.

void        ledcAttachPin(uint8_t pin, uint8_t channel);

ESP32 ledcwrite

Chức năng ledcWrite này được sử dụng để tạo tín hiệu với một giá trị chu kỳ nhiệm vụ được chỉ định. Đối số đầu tiên của hàm này là số kênh và giá trị thứ hai là chu kỳ nhiệm vụ bắt buộc. Ví dụ: nếu bạn đặt độ phân giải của tín hiệu đầu ra thành 8 bit, thì giá trị chu kỳ hoạt động sẽ nằm trong khoảng từ 0-255 và tương tự đối với độ phân giải 10 bit và 12 bit.

void        ledcWrite(uint8_t channel, uint32_t duty);

ESP32 ledcChangeFrequency

Chức năng này được sử dụng để thay đổi tần số của tín hiệu đầu ra. Các đối số của hàm này là số kênh, tần suất cần thiết và độ phân giải.

uint32_t ledcChangeFrequency(uint8_t chan, uint32_t freq, uint8_t bit_num)

Ví dụ về ESP32 PWM

PWM với ESP32 với ví dụ phai màu LED

Bây giờ chúng ta sẽ thấy một ví dụ để tạo tín hiệu điều chế độ rộng xung trên bất kỳ chân GPIO nào và tôi sẽ hiển thị cho bạn tín hiệu trên máy hiện sóng. Nhưng trường hợp tương tự có thể được sử dụng như một ví dụ LED mờ, hoặc ví dụ LED mờ dần. Đầu tiên, chúng ta sẽ thấy một ví dụ với tín hiệu chu kỳ nhiệm vụ sửa chữa trên máy hiện sóng và sau đó, chúng ta sẽ thấy một ví dụ về chu kỳ nhiệm vụ thay đổi PWM cũng có thể được sử dụng làm ví dụ làm mờ dẫn.

Tôi sẽ sử dụng GPIO15 để lấy tín hiệu này và sẽ hiển thị tín hiệu này trên máy hiện sóng. Bây giờ bạn chỉ cần kết nối thiết bị đầu cuối dương của máy hiện sóng với chân GPIO mười lăm và đầu nối đất của máy hiện sóng với mặt đất của bảng. Bây giờ, mã đơn giản này sẽ tạo ra tín hiệu PWM với chu kỳ nhiệm vụ là 50%.

PWM Ví dụ Sketch

int PWM_FREQUENCY = 1000; // this variable is used to define the time period 

int PWM_CHANNEL = 0; // this variable is used to select the channel number

int PWM_RESOUTION = 8; // this will define the resolution of the signal which is 8 in this case

int GPIOPIN = 15 ; // GPIO to which we want to attach this channel signal

int dutyCycle = 127; // it will define the width of signal or also the one time

 

void setup()

{

 

ledcSetup(PWM_CHANNEL, PWM_FREQUENCY, PWM_RESOUTION);

ledcAttachPin(GPIOPIN, PWM_CHANNEL);

 

 

}

 

void loop() 

{

 

ledcWrite(PWM_CHANNEL, dutyCycle);

 

}

Đây là một mã đơn giản để tạo ra tín hiệu điều chế độ rộng xung với chu kỳ nhiệm vụ là 50%. Trong dòng chương trình này, chúng ta đã xác định các tham số của dạng sóng. Đầu tiên chúng tôi xác định tần số 1000 hertz. Chúng tôi đã chọn kênh XNUMX. Nhưng bạn có thể chọn bất kỳ kênh nào bạn muốn trong tổng số mười sáu kênh. Sau đó, chúng tôi chỉ định độ phân giải 8 bit. Nhưng bạn có thể chọn bất kỳ độ phân giải nào bạn muốn. Chúng tôi sẽ sử dụng chân đầu ra đầu vào đa năng 15 để có được đầu ra. Ở cuối phần khởi tạo, chúng tôi đặt chu kỳ nhiệm vụ thành 127. Trong ví dụ này, chúng ta đang nhận được một dạng sóng với chu kỳ nhiệm vụ sửa chữa.

int PWM_FREQUENCY = 1000; 

int PWM_CHANNEL = 0;

int PWM_RESOUTION = 8; 

int GPIOPIN = 15 ; 

int dutyCycle = 127;

Bây giờ trong chức năng setup, chúng ta cần sử dụng hai chức năng ledcSetup và ledcAttach mà tôi đã giải thích ở trên. Quy trình đầu tiên sẽ chọn kênh XNUMX cùng với tần số 1000 hertz và độ phân giải 8 bit. Với độ phân giải 8 bit, chúng ta có thể chỉ định chu kỳ nhiệm vụ từ 0 đến (2 ^ 8-) = 255. Vì vậy, nếu chúng ta sử dụng 255 làm tham số chu kỳ nhiệm vụ, chu kỳ hoạt động sẽ là 100% và với 127 chu kỳ hoạt động sẽ là 50% và tương tự cho các giá trị khác. Câu lệnh thứ hai sẽ gắn kênh điều chế độ rộng xung bằng XNUMX vào chân kỹ thuật số mười lăm.

ledcSetup(PWM_CHANNEL, PWM_FREQUENCY, PWM_RESOUTION);

ledcAttachPin(GPIOPIN, PWM_CHANNEL);

Bên trong hàm vòng lặp, chúng tôi chỉ sử dụng lệnh là tạo tín hiệu với chu kỳ nhiệm vụ là 127 và bạn sẽ thấy nó sẽ tạo ra chu kỳ nhiệm vụ là 50%. Dạng sóng sẽ cao trong một nửa thời gian và mức thấp hợp lý trong một nửa thời gian và tổng khoảng thời gian sẽ nghịch đảo với tần số của tín hiệu. Vì vậy, chức năng ledcWrite này được sử dụng để tạo ra tín hiệu PWM với một chu kỳ nhiệm vụ cụ thể. Bạn chỉ cần xác định số kênh và giá trị chu kỳ nhiệm vụ làm đối số cho hàm này.

ledcWrite(PWM_CHANNEL, dutyCycle);

Vì vậy, khi bạn tải mã này lên bo mạch của mình và kết nối máy hiện sóng trên mã PIN 15, bạn sẽ nhận được loại tín hiệu nào dưới dạng đầu ra? Bạn sẽ thấy dạng sóng kỹ thuật số với các tham số sau:

  • Tần số = 1000 Hertz

  • Khoảng thời gian = 1 ms

  • Chu kỳ nhiệm vụ = 50%

  • đúng giờ = 0,5 ms

  • Thời gian tắt = 0,5 ms

Như bạn có thể thấy trong hình dưới đây.

PWM ESP32 với chu kỳ hoạt động 50%

Bây giờ bạn đã học cách tạo PWM với một chu kỳ nhiệm vụ cần thiết. Bây giờ chúng ta sẽ thấy ví dụ về việc tạo tín hiệu PWM biến với ESP32 và cách chúng ta sử dụng nó cho ví dụ phai màu dẫn.

ESP32 Chu kỳ nhiệm vụ thay đổi PWM

Nếu khái niệm của bạn không rõ ràng về điều chế độ rộng xung, chắc hẳn bạn đang tự hỏi tín hiệu chu kỳ nhiệm vụ thay đổi có nghĩa là gì? Chu kỳ nhiệm vụ thay đổi có nghĩa là chúng ta muốn có dạng sóng kỹ thuật số ở đầu ra mà chu kỳ nhiệm vụ của chúng sẽ tăng từ giá trị thấp lên giá trị cao với một số độ trễ. Ví dụ, khi chúng tôi bật bảng phát triển, chu kỳ nhiệm vụ ban đầu sẽ bằng XNUMX và sau đó nó sẽ bắt đầu tăng lên với một bước của một với một số độ trễ. Rất dễ dàng để hoàn thành nhiệm vụ này. bạn chỉ cần thay đổi giá trị của chu kỳ nhiệm vụ bên trong chức năng ledcWrite. Vì vậy, phần còn lại của code mà chúng ta đã sử dụng trong ví dụ trước sẽ vẫn giữ nguyên ngoại trừ phần chu kỳ nhiệm vụ biến thay vì sửa. Mã cho ví dụ này được cung cấp ở đây.

int PWM_FREQUENCY = 1000; 

int PWM_CHANNEL = 0; 

int PWM_RESOUTION = 8; 

int GPIOPIN = 15 ; 

 

void setup()

{

 

ledcSetup(PWM_CHANNEL, PWM_FREQUENCY, PWM_RESOUTION);

ledcAttachPin(GPIOPIN, PWM_CHANNEL);

 

}

 

void loop() 

{

 

for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) 

{

ledcWrite(PWM_CHANNEL, dutyCycle);

delay(100);

}

}

Mã tương tự như chương trình cuối cùng ngoại trừ phần hàm vòng lặp. Bên trong phần vòng lặp, một vòng lặp khác cho vòng lặp được sử dụng. Bên trong cho vòng lặp, giá trị bắt đầu của chu kỳ nhiệm vụ bằng XNUMX và giá trị của nó tiếp tục tăng lên với gia số một với mỗi lần lặp lại cho vòng lặp. Mỗi lần lặp xảy ra sau độ trễ 100 mili giây. Vì vậy, bạn sẽ quan sát tín hiệu trên máy hiện sóng với thứ tự độ rộng xung tăng dần. Bạn có thể thấy kết quả trong những hình ảnh về độ rộng xung khác nhau.

Ví dụ phai màu LED ESP32

Ví dụ phai màu LED ESP32 PWM

Ví dụ về phai màu LED, bạn chỉ cần kết nối đèn LED với chân số 15 của bảng phát triển ESP32 và bạn có thể tải cùng một mã có độ rộng xung thay đổi lên bảng. bạn sẽ thấy độ sáng của đèn LED sẽ rất thấp khi bắt đầu và sau đó nó bắt đầu tăng lên. Sau một thời gian, đèn LED sẽ phát sáng hoàn toàn.

Nhận cùng một tín hiệu PWM trên các GPIO khác nhau

Trong phần này, chúng ta sẽ xem cách lấy cùng một đầu ra tín hiệu PWM từ các chân GPIO khác nhau. Trong ma trận ESP32 GPIO, chúng ta có thể gán đầu ra của bất kỳ thiết bị ngoại vi nào cho bất kỳ chân GPIO nào. Tương tự, chúng ta có thể gắn đầu ra của bất kỳ kênh PWM nào vào bất kỳ chân GPIO nào có thể được định cấu hình làm đầu ra. Bởi vì không phải tất cả các chân trong ESP32 đều có thể được sử dụng làm chân đầu ra kỹ thuật số. Một số chân chỉ có thể được sử dụng làm chân đầu vào kỹ thuật số.

Để đính kèm PWM vào bất kỳ chân GPIO có thể định cấu hình đầu ra nào, chúng tôi sử dụng hàm ledcAttachPin () bên trong setup () của bản phác thảo Arduino của chúng tôi.

Đối số đầu tiên cho hàm này là số pin và đối số thứ hai là kênh PWM mà chúng ta muốn đính kèm chân GPIO.

Ví dụ: các dòng sau đã đính kèm GPIO14 và GPIO15 vào kênh PWM bằng XNUMX. Thông qua đó, chúng ta sẽ nhận được cùng một tín hiệu GPIO trên cả GPIO14 và GPIO15.

int PWM_FREQUENCY = 1000; 

int PWM_CHANNEL = 0; 

int PWM_RESOUTION = 8; 

int GPIOPIN_1 = 15 ; 

int GPIOPIN_2 = 14 ; 

void setup()

{

 

ledcSetup(PWM_CHANNEL, PWM_FREQUENCY, PWM_RESOUTION);

ledcAttachPin(GPIOPIN_1 , PWM_CHANNEL);

ledcAttachPin(GPIOPIN_2 , PWM_CHANNEL);

}

Ứng dụng ESP32 PWM

Cho đến nay, chúng tôi chỉ thảo luận về cách định cấu hình các kênh ESP32 PWM và nhận tín hiệu đầu ra tương tự từ các chân GPIO. Nhưng bài viết này sẽ không đầy đủ nếu không biết việc sử dụng tính năng này sẽ là gì.

Có rất nhiều ứng dụng công nghiệp mà chúng ta có thể sử dụng thiết bị ngoại vi ESP32 PWM như:

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn