1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bai giang PWM chip 18f4520

4 185 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 51,36 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng: Điều chế độ rộng xung PWMNộ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.. Lập trình điều chế độ rộng xung Có 2 cách l

Trang 1

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)

Trang 2

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 P x

o s c i l l o s c o p e

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:

Trang 3

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 <p18f4520.h>

#include <pwm.h>

#include <P18f4520.h>

#include <timers.h>

//C?u hình cho vi di?u khi?n, ví d?:

#pragma config PBADEN = OFF //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

//(reset khi Vdd xu?ng th?p du?i 1 ngu?ng)

//(Single-Supply ICSP Programming)

void main()

{

TRISC =0b00000000; // chon CCP1 co chieu ra

OpenTimer2(T2_PS_1_4);

ADCON1=0X0F;// ADC OFF

while(1);

}

Kết quả mô phỏng:

Trang 4

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 P x

o s c i l l o s c o p e

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 P x

o s c i l l o s c o p e

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.

Ngày đăng: 24/04/2020, 18:07

TỪ KHÓA LIÊN QUAN

w