- Tín hiệu PWM là gì?
- PWM sử dụng PIC16F877A:
- Lập trình PIC để tạo tín hiệu PWM:
- Sơ đồ và Kiểm tra:
- Làm việc trên phần cứng:
Đây là hướng dẫn thứ 10 của chúng tôi về Học vi điều khiển PIC sử dụng MPLAB và XC8. Cho đến nay, chúng tôi đã đề cập đến nhiều hướng dẫn cơ bản như nhấp nháy LED với PIC, Bộ hẹn giờ trong PIC, giao diện LCD, giao tiếp 7 đoạn, ADC sử dụng PIC, v.v. Nếu bạn là người mới bắt đầu, hãy truy cập danh sách đầy đủ các hướng dẫn về PIC tại đây và bắt đầu học.
Trong hướng dẫn này, chúng ta sẽ học Cách tạo tín hiệu PWM bằng PIC PIC16F877A. MCU PIC của chúng tôi có một mô-đun đặc biệt được gọi là mô-đun So sánh Capture (CCP) có thể được sử dụng để tạo tín hiệu PWM. Ở đây, chúng tôi sẽ tạo ra PWM 5 kHz với chu kỳ nhiệm vụ thay đổi từ 0% đến 100%. Để thay đổi chu kỳ làm việc, chúng tôi đang sử dụng một chiết áp, do đó, chúng tôi khuyên bạn nên tìm hiểu hướng dẫn ADC trước khi bắt đầu với PWM. Mô-đun PWM cũng sử dụng bộ định thời để đặt tần số của nó, do đó hãy tìm hiểu cách sử dụng bộ định thời trước tại đây. Hơn nữa, trong hướng dẫn này, chúng tôi sẽ sử dụng mạch RC và đèn LED để chuyển đổi các giá trị PWM thành điện áp Analog và sử dụng nó để làm mờ đèn LED.
Tín hiệu PWM là gì?
Điều chế độ rộng xung (PWM) là một tín hiệu kỹ thuật số được sử dụng phổ biến nhất trong mạch điều khiển. Tín hiệu này được đặt ở mức cao (5v) và thấp (0v) trong một thời gian và tốc độ xác định trước. Thời gian tín hiệu duy trì ở mức cao được gọi là “đúng giờ” và thời gian tín hiệu ở mức thấp được gọi là “thời gian tắt”. Có hai tham số quan trọng đối với PWM như được thảo luận dưới đây:
Chu kỳ hoạt động của PWM:
Phần trăm thời gian mà tín hiệu PWM vẫn ở mức CAO (đúng giờ) được gọi là chu kỳ nhiệm vụ. Nếu tín hiệu luôn BẬT, nó đang ở trong chu kỳ làm việc 100% và nếu nó luôn tắt thì đó là chu kỳ làm việc 0%.
Chu kỳ làm việc = Thời gian BẬT / (Thời gian BẬT + Thời gian TẮT)
Tần suất của một PWM:
Tần số của tín hiệu PWM xác định tốc độ PWM hoàn thành một giai đoạn. Một khoảng thời gian hoàn tất BẬT và TẮT tín hiệu PWM như thể hiện trong hình trên. Trong hướng dẫn của chúng tôi, chúng tôi sẽ đặt tần số 5KHz.
PWM sử dụng PIC16F877A:
Tín hiệu PWM có thể được tạo ra trong Bộ vi điều khiển PIC của chúng tôi bằng cách sử dụng mô-đun CCP (Compare Capture PWM). Độ phân giải của tín hiệu PWM của chúng tôi là 10-bit, nghĩa là đối với giá trị 0 sẽ có chu kỳ nhiệm vụ là 0% và đối với giá trị 1024 (2 ^ 10) sẽ có chu kỳ nhiệm vụ là 100%. Có hai mô-đun CCP trong MCU PIC của chúng tôi (CCP1 và CCP2), điều này có nghĩa là chúng tôi có thể tạo đồng thời hai tín hiệu PWM trên hai chân khác nhau (chân 17 và 16), trong hướng dẫn của chúng tôi, chúng tôi đang sử dụng CCP1 để tạo tín hiệu PWM trên chân 17.
Các thanh ghi sau được sử dụng để tạo tín hiệu PWM bằng MCU PIC của chúng tôi:
- CCP1CON (Thanh ghi điều khiển CCP1)
- T2CON (Thanh ghi điều khiển Timer 2)
- PR2 (Timer 2 mô-đun Đăng ký thời gian)
- CCPR1L (CCP Đăng ký 1 Thấp)
Lập trình PIC để tạo tín hiệu PWM:
Trong chương trình của chúng tôi, chúng tôi sẽ đọc điện áp Analog 0-5v từ một chiết áp và ánh xạ nó thành 0-1024 bằng mô-đun ADC của chúng tôi. Sau đó, chúng tôi tạo ra một tín hiệu PWM với tần số 5000Hz và thay đổi chu kỳ nhiệm vụ của nó dựa trên điện áp Analog đầu vào. Đó là 0-1024 sẽ được chuyển đổi thành 0% -100% Chu kỳ nhiệm vụ. Hướng dẫn này giả định rằng bạn đã học cách sử dụng ADC trong PIC nếu chưa, hãy đọc nó từ đây, vì chúng tôi sẽ bỏ qua chi tiết về nó trong hướng dẫn này.
Vì vậy, khi các bit cấu hình được thiết lập và chương trình được viết để đọc giá trị Analog, chúng ta có thể tiến hành PWM.
Các bước sau nên được thực hiện khi định cấu hình mô-đun CCP cho hoạt động PWM:
- Đặt khoảng thời gian PWM bằng cách ghi vào thanh ghi PR2.
- Đặt chu kỳ nhiệm vụ PWM bằng cách ghi vào thanh ghi CCPR1L và các bit CCP1CON <5: 4>.
- Đặt chân CCP1 làm đầu ra bằng cách xóa bit TRISC <2>.
- Đặt giá trị tỷ lệ đặt trước TMR2 và bật Timer2 bằng cách ghi vào T2CON.
- Định cấu hình mô-đun CCP1 cho hoạt động PWM.
Có hai chức năng quan trọng trong chương trình này để tạo tín hiệu PWM. Một là hàm PWM_Initialize () sẽ khởi tạo các thanh ghi cần thiết để thiết lập mô-đun PWM và sau đó đặt tần số tại đó PWM sẽ hoạt động, hàm còn lại là hàm PWM_Duty () sẽ thiết lập chu kỳ nhiệm vụ của tín hiệu PWM trong các thanh ghi cần thiết.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Đặt công thức PR2 bằng Datasheet // Làm cho PWM hoạt động trong 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Cấu hình mô-đun CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Cấu hình module Timer TRISC2 = 0; // tạo chân cổng trên C làm đầu ra}
Chức năng trên là chức năng khởi tạo PWM, trong chức năng này Mô-đun CCP1 được thiết lập để sử dụng PWM bằng cách đặt bit CCP1M3 và CCP1M2 lên cao.
Bộ đếm trước của mô-đun bộ định thời được đặt bằng cách đặt bit T2CKPS0 lên cao và T2CKPS1 ở mức thấp đối với bit TMR2ON được đặt để bắt đầu bộ định thời.
Bây giờ, chúng ta phải thiết lập Tần số của tín hiệu PWM. Giá trị của tần số phải được ghi vào thanh ghi PR2. Có thể đặt tần số mong muốn bằng cách sử dụng các công thức dưới đây
Khoảng thời gian PWM = * 4 * TOSC * (Giá trị tỷ lệ đặt trước TMR2)
Sắp xếp lại các công thức này để nhận PR2 sẽ cho
PR2 = (Giai đoạn / (4 * Tosc * TMR2 Tỷ lệ đặt trước)) - 1
Chúng ta biết rằng Giai đoạn = (1 / PWM_freq) và Tosc = (1 / _XTAL_FREQ). Vì thế…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Khi tần số được thiết lập, hàm này không cần được gọi lại trừ khi và cho đến khi chúng ta cần thay đổi lại tần số. Trong hướng dẫn của chúng tôi, tôi đã gán PWM_freq = 5000; để chúng tôi có thể nhận được tần số hoạt động 5 KHz cho tín hiệu PWM của chúng tôi.
Bây giờ chúng ta hãy thiết lập chu kỳ nhiệm vụ của PWM bằng cách sử dụng hàm bên dưới
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Đang giảm // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = nhiệm vụ & 1; // Lưu trữ bit đầu tiên CCP1Y = duty & 2; // Lưu trữ bit thứ 0 CCPR1L = duty >> 2; // Lưu trữ bit thứ 8}}
Tín hiệu PWM của chúng tôi có độ phân giải 10 bit do đó giá trị này không thể được lưu trữ trong một thanh ghi vì PIC của chúng tôi chỉ có các đường dữ liệu 8 bit. Vì vậy, chúng tôi đã sử dụng hai bit khác của CCP1CON <5: 4> (CCP1X và CCP1Y) để lưu trữ hai LSB cuối cùng và sau đó lưu trữ 8 bit còn lại trong thanh ghi CCPR1L.
Thời gian chu kỳ nhiệm vụ PWM có thể được tính bằng cách sử dụng các công thức dưới đây:
PWM Duty Cycle = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
Sắp xếp lại các công thức này để nhận giá trị CCPR1L và CCP1CON sẽ cho:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
Giá trị ADC của chúng tôi sẽ là 0-1024, chúng tôi cần giá trị đó ở 0% -100%, do đó, PWM Duty Cycle = duty / 1023. Hơn nữa để chuyển đổi chu kỳ nhiệm vụ này thành một khoảng thời gian, chúng ta phải nhân nó với khoảng thời gian (1 / PWM_freq)
Chúng ta cũng biết rằng Tosc = (1 / PWM_freq), do đó..
Nhiệm vụ = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Giải phương trình trên sẽ cho chúng ta:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Bạn có thể kiểm tra toàn bộ chương trình trong phần Code bên dưới cùng với Video chi tiết.
Sơ đồ và Kiểm tra:
Như thường lệ, chúng ta hãy xác minh đầu ra bằng cách sử dụng mô phỏng Proteus. Các sơ đồ mạch được hiển thị bên dưới.
Kết nối chiết áp vào chân thứ 7 để cấp điện áp 0-5. Mô-đun CCP1 có chân 17 (RC2), ở đây PWM sẽ được tạo ra và có thể được xác minh bằng cách sử dụng Máy hiện sóng kỹ thuật số. Hơn nữa để chuyển đổi điều này thành điện áp thay đổi, chúng tôi đã sử dụng bộ lọc RC và đèn LED để xác minh đầu ra mà không có phạm vi.
Bộ lọc RC là gì?
Một bộ lọc RC hoặc một bộ lọc thông thấp là một mạch đơn giản với hai yếu tố thụ động cụ thể là điện trở và tụ điện. Hai thành phần này được sử dụng để lọc tần số của tín hiệu PWM và biến nó thành điện áp DC có thể thay đổi.
Nếu chúng ta kiểm tra mạch, khi một điện áp thay đổi được đặt vào đầu vào của R, tụ điện C sẽ bắt đầu tích điện. Bây giờ dựa trên giá trị của tụ điện, tụ điện sẽ mất một khoảng thời gian để được sạc đầy, sau khi được sạc nó sẽ chặn dòng điện một chiều (Hãy nhớ tụ điện chặn dòng điện một chiều nhưng cho phép dòng điện xoay chiều) do đó điện áp một chiều đầu vào sẽ xuất hiện trên đầu ra. PWM tần số cao (tín hiệu AC) sẽ được nối đất qua tụ điện. Do đó thu được một điện một chiều thuần trên tụ điện. Giá trị 1000Ohm và 1uf được tìm thấy là thích hợp cho dự án này. Tính toán các giá trị của R và C liên quan đến phân tích mạch sử dụng hàm truyền, nằm ngoài phạm vi của hướng dẫn này.
Đầu ra của chương trình có thể được xác minh bằng cách sử dụng Máy hiện sóng kỹ thuật số như được hiển thị bên dưới, thay đổi chiết áp và chu kỳ nhiệm vụ của PWM sẽ thay đổi. Chúng ta cũng có thể nhận thấy điện áp đầu ra của mạch RC bằng cách sử dụng Vôn kế. Nếu mọi thứ hoạt động như mong đợi, chúng tôi có thể tiến hành với phần cứng của mình. Kiểm tra thêm Video ở cuối để biết toàn bộ quá trình.
Làm việc trên phần cứng:
Thiết lập phần cứng của dự án rất đơn giản, chúng tôi chỉ sử dụng lại bảng PIC Perf của chúng tôi được hiển thị bên dưới.
Chúng tôi cũng sẽ cần một chiết áp để cấp điện áp tương tự, tôi đã gắn một số đầu dây cái vào nồi của tôi (hình dưới đây) để chúng tôi có thể kết nối trực tiếp chúng với bảng PIC Perf.
Cuối cùng để xác minh đầu ra, chúng tôi cần một mạch RC và một đèn LED để xem tín hiệu PWM hoạt động như thế nào, tôi chỉ cần sử dụng một bảng điều khiển nhỏ và hàn mạch RC và đèn LED (để điều khiển độ sáng) vào nó như hình dưới đây
Chúng ta có thể sử dụng dây kết nối cái với cái đơn giản và kết nối chúng theo sơ đồ được hiển thị ở trên. Sau khi kết nối xong, hãy tải chương trình lên PIC bằng cách sử dụng pickit3 của chúng tôi và bạn sẽ có thể nhận được điện áp thay đổi dựa trên đầu vào của chiết áp của bạn. Đầu ra biến đổi được sử dụng để điều khiển độ sáng của đèn LED ở đây.
Tôi đã sử dụng đồng hồ vạn năng của mình để đo các đầu ra biến đổi, chúng ta cũng có thể nhận thấy độ sáng của đèn LED thay đổi theo các mức điện áp khác nhau.
Đó là chúng ta đã lập trình để đọc điện áp Analog từ POT và chuyển đổi thành tín hiệu PWM, sau đó chúng được chuyển đổi thành Điện áp biến bằng bộ lọc RC và kết quả được xác minh bằng phần cứng của chúng tôi. Nếu bạn có một số nghi ngờ hoặc gặp khó khăn ở đâu đó, vui lòng sử dụng phần bình luận bên dưới, chúng tôi sẽ sẵn lòng trợ giúp bạn. Việc hoàn thành đang hoạt động trong video.
Ngoài ra, hãy xem các Hướng dẫn PWM khác của chúng tôi về các bộ vi điều khiển khác:
- Hướng dẫn sử dụng Raspberry Pi PWM
- PWM với Arduino Do
- Bộ điều chỉnh độ sáng LED dựa trên Arduino sử dụng PWM
- Power LED Dimmer sử dụng Vi điều khiển ATmega32