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 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.
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 )
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ố.
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.
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.
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);
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);
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);
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)
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%.
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.