Tải bản đầy đủ

Bai giang PWM chip 18f4520

Bài giảng: Điều chế độ rộng xung (PWM)
Nội dung:
-

Khái niệm, ứng dụng của PWM
Module PWM trên PIC18F4520
Lập trình điều chế độ rộng xung

1. Khái niệm, ứng dụng của PWM
Xem mục 6.1.1 trong giáo trình. Tham khảo thêm:
https://viettech.edu.vn/news/dieu-che-pwm-la-gi/
2. Module PWM trên PIC18F4520
Xem mục 6.1.2 trong giáo trình.
3. Lập trình điều chế độ rộng xung
Có 2 cách lập trình điều chế độ rộng xung bao gồm:
- Lập trình sử dụng thanh ghi (xem mục 6.3.1 và 6.3.2 trong giáo trình)
- Lập trình sử dụng các hàm trong thư viện pwm.h (xem mục 5.4 trong tài liệu tra cứu PIC).
Cách này đơn giản hơn.
3.1. Thiết lập chu kỳ và độ rộng xung dương
Thiết lập chu kỳ: Dùng hàm OpenPWM1(char period) hoặc OpenPWM2(char period)
Tham số period là một số nguyên nằm trong khoảng từ 0 đến 255 và được tính theo công

thức sau:
period = PWM_period/(4 *TOSC*prescaler)-1.
Trong đó: PWM_period là chu kỳ của xung cần tạo; TOSC là chu kỳ của bộ dao động thạch
anh; prescaler là hệ số chia tần trước của timer2 (lưu ý là với timer2, prescaler chỉ có thể là 1
hoặc 4 hoặc 16).
Ví dụ: Nếu muốn tạo xung có chu kỳ 300µs, biết TOSC=1/12 µs (tần số thạch anh là 12Mhz
– đây là tần số được dùng trên thiết bị thực hành, thi), tham số period sẽ được tính chọn như
sau:
period = 300/(4 *(1/12)*prescaler)-1.
Nếu chọn prescaler=1, period=899 => không được vì tham số period nằm trong khoảng từ 0
đến 255
Nếu chọn prescaler=4, period=224 => OK
Thiết lập độ rộng xung dương: Dùng hàm SetDCPWM1 (unsigned int dutycycle );
hoặc SetDCPWM2 ( unsigned int dutycycle );
Tham số dutycycle là một số nguyên nằm trong khoảng từ 0 đến 1024 và được tính như sau:
dutycycle = PWM_Duty_Cycle/(TOSC*prescaler)


Trong đó, PWM_Duty_Cycle là độ rộng của nửa chu kỳ dương cần tạo.
Ví dụ: Với xung có chu kỳ 300µs như trên, nếu muốn nửa chu kỳ dương có độ rộng là 120µs,
tham số dutycycle sẽ được tính như sau:
dutycycle = 120/((1/12)*prescaler)
Do ở trên đã chọn prescaler=4 nên: dutycycle = 120/((1/12)*4)=360.
Như vậy nếu tần số thạch anh là 12Mhz và chọn hệ số chia tần trước của timer2 là 4, các lệnh
sau:
OpenPWM1(224);
SetDCPWM1(360);
Sẽ tạo ra xung có có chu kỳ 300µs, độ rộng nửa chu kỳ dương là 120µs (40%) trên chân
CCP1.
3.2. Các bước lập trình sử dụng module PWM tạo xung
- Tính chọn các tham số period và prescaler; tính tham số dutycycle.
(Mở mục 5.4 trong Tài liệu tra cứu để xem lại công thức)
- Copy khung chương trình (không sử dụng ngắt); chèn vào chương trình chính các lệnh sau:
+ Khởi tạo cho chân được sử dụng để tạo xung có chiều ra (1 trong 3 chân RC1, RC2 hoặc
RB3).
+ Đặt hệ số chia tần trước cho timer2 (dùng Opentimer2(…) hoặc T2CON=…).
+ Lệnh OpenPWM1(…) hoặc OpenPWM2(…) tùy theo yêu cầu đề bài
+ Lệnh SetDCPWM1(…) hoặc SetDCPWM2 (…)tùy theo yêu cầu đề bài.
Ví dụ sau đây sẽ minh họa cho quá trình lập trình:
Vẽ, lắp ráp mạch điện và lập trình theo yêu cầu:


a. Vẽ, lắp ráp mạch điện như sau:
Chân RC2/CCP1 nối với máy hiện sóng (oscilloscope) như hình bên

C C Px

oscilloscope

b. Xác định hệ số chia tần, giá trị khởi tạo cho PR2 (hoặc đối số của hàm OpenPWMx), giá
trị khởi tạo cho CCPRxL:CCPxCON<5:4> (hoặc đối số của hàm SetDCPWMx) và viết
chương trình theo yêu cầu như sau:
Tạo xung trên chân CCP1 có chu kỳ 300µs, độ rộng nửa chu kỳ dương: 120µs
Giải:
- Tính chọn các tham số period và prescaler; tính tham số dutycycle (như mục 3.1 đã trình
bày)
- Chèn vào chương trình chính các lệnh:


ADCON1=0x0F; //vào ra số
TRISC=0; //cả PORTC có chiều ra, bao gồm cả chân RC2/CCP1
T2CON=0b00000001; // prescaler =4, hoặc có thể viết OpenTimer2(T2_PS_1_4)
OpenPWM1(224); // tạo xung có chu kỳ 300µs
SetDCPWM1(360); // độ rộng nửa chu kỳ dương là 120µs

Dưới đây là chương trình đầy đủ
#include
#include
#include
#include
//C?u hình cho vi di?u khi?n, ví d?:
#pragma config OSC = HS
#pragma config MCLRE = ON
#pragma config WDT = OFF
#pragma config PBADEN = OFF

//ch? d? dao d?ng HS
//s? d?ng RE3 làm chân reset (OFF: không s? d?ng)
//không dùng Watchdog timer
//PORTB<4:0> du?c c?u hình thành các chân vào/ra s?
//ON: PORTB<4:0> du?c c?u hình thành các chân AN8-AN12
#pragma config PWRT=ON
// s? d?ng Power-up timer
#pragma config BOREN=OFF
// không s? d?ng ch?c nang Bown-out reset
//(reset khi Vdd xu?ng th?p du?i 1 ngu?ng)
#pragma config LVP=OFF
//không d?ng ch? d? c?p ngu?n ch? t? m?ch n?p
//(Single-Supply ICSP Programming)
void main()
{
TRISC =0b00000000; // chon CCP1 co chieu ra
OpenTimer2(T2_PS_1_4);
//T2CON=0b00000001; // he so chia(TMR2 Prescale Value) = 4
ADCON1=0X0F;// ADC OFF
OpenPWM1(224);
// PWM_Period = 300 us
SetDCPWM1(360);
// PWM Duty Cycle = 120
while(1);
}

Kết quả mô phỏng:


Bài tập:
Câu 1. Vẽ mạch điện và lập trình theo yêu cầu:
a. Vẽ mạch điện như sau:
Chân RB3/CCP2A nối với máy hiện sóng (oscilloscope) như hình bên

C C Px

oscilloscope

b. Xác định hệ số chia tần, giá trị khởi tạo cho PR2 (hoặc đối số của hàm OpenPWMx), giá trị khởi tạo
cho CCPRxL:CCPxCON<5:4> (hoặc đối số của hàm SetDCPWMx) và viết chương trình theo yêu cầu
như sau:
Tạo xung trên chân CCP2A có chu kỳ 800µs, độ rộng nửa chu kỳ dương: 240µs
Câu 2. Vẽ mạch điện và lập trình theo yêu cầu:
a. Vẽ mạch điện như sau:
Chân RC1/CCP2B nối với máy hiện sóng (oscilloscope) như hình bên

C C Px

oscilloscope

b. Xác định hệ số chia tần, giá trị khởi tạo cho PR2 (hoặc đối số của hàm OpenPWMx), giá trị khởi tạo
cho CCPRxL:CCPxCON<5:4> (hoặc đối số của hàm SetDCPWMx) và viết chương trình theo yêu cầu
như sau:
Tạo xung trên chân CCP2B có chu kỳ 80µs, độ rộng nửa chu kỳ dương: 20µs

Hình thức nộp bài:
Nộp file .docx có tên là họ tên SV + 3 số cuối mã SV (VD: NguyenVanThang241.docx)
Nội dung file bao gồm code và kết quả mô phỏng của 2 bài (tương tự các hình trên)
Hạn nộp bài: 12h00 ngày CN, 29/3/2020.
Lưu ý:
Bài nộp đúng hạn và làm đúng được tính điểm kiểm tra thường xuyên.
Những SV không nộp bài được tính điểm 0 vào điểm kiểm tra thường xuyên số 1.



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×