Bai giang PWM chip 18f4520

4 180 0
Bai giang PWM chip 18f4520

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

Thông tin tài liệu

Bài giảng: Điều chế độ rộng xung (PWM) Nội dung: - Khái niệm, ứng dụng PWM Module PWM PIC18F4520 Lập trình điều chế độ rộng xung Khái niệm, ứng dụng PWM Xem mục 6.1.1 giáo trình Tham khảo thêm: https://viettech.edu.vn/news/dieu-che-pwm-la-gi/ Module PWM PIC18F4520 Xem mục 6.1.2 giáo trình Lập trình điều chế độ rộng xung Có cách lập trình điều chế độ rộng xung bao gồm: - Lập trình sử dụng ghi (xem mục 6.3.1 6.3.2 giáo trình) - Lập trình sử dụng hàm thư viện pwm.h (xem mục 5.4 tài liệu tra cứu PIC) Cách đơn giản 3.1 Thiết lập chu kỳ độ rộng xung dương Thiết lập chu kỳ: Dùng hàm OpenPWM1(char period) OpenPWM2(char period) Tham số period số nguyên nằm khoảng từ đến 255 tính theo cơng thức sau: period = PWM_period/(4 *TOSC*prescaler)-1 Trong đó: PWM_period chu kỳ xung cần tạo; TOSC chu kỳ dao động thạch anh; prescaler hệ số chia tần trước timer2 (lưu ý với timer2, prescaler 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 12Mhz – tần số dùng thiết bị thực hành, thi), tham số period tính chọn sau: period = 300/(4 *(1/12)*prescaler)-1 Nếu chọn prescaler=1, period=899 => khơng tham số period nằm khoảng từ đế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 ); SetDCPWM2 ( unsigned int dutycycle ); Tham số dutycycle số nguyên nằm khoảng từ đến 1024 tính sau: dutycycle = PWM_Duty_Cycle/(TOSC*prescaler) Trong đó, PWM_Duty_Cycle độ rộng nửa chu kỳ dương cần tạo Ví dụ: Với xung có chu kỳ 300µs trên, muốn nửa chu kỳ dương có độ rộng 120µs, tham số dutycycle tính sau: dutycycle = 120/((1/12)*prescaler) Do chọn prescaler=4 nên: dutycycle = 120/((1/12)*4)=360 Như tần số thạch anh 12Mhz chọn hệ số chia tần trước timer2 4, lệnh sau: OpenPWM1(224); SetDCPWM1(360); Sẽ tạo xung có có chu kỳ 300µs, độ rộng nửa chu kỳ dương 120µs (40%) 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 tham số period prescaler; tính tham số dutycycle (Mở mục 5.4 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 lệnh sau: + Khởi tạo cho chân sử dụng để tạo xung có chiều (1 chân RC1, RC2 RB3) + Đặt hệ số chia tần trước cho timer2 (dùng Opentimer2(…) T2CON=…) + Lệnh OpenPWM1(…) OpenPWM2(…) tùy theo yêu cầu đề + Lệnh SetDCPWM1(…) SetDCPWM2 (…)tùy theo yêu cầu đề Ví dụ sau minh họa cho trình lập trình: Vẽ, lắp ráp mạch điện lập trình theo yêu cầu: a Vẽ, lắp ráp mạch điện sau: Chân RC2/CCP1 nối với máy sóng (oscilloscope) 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ố hàm OpenPWMx), giá trị khởi tạo cho CCPRxL:CCPxCON (hoặc đối số hàm SetDCPWMx) viết chương trình theo yêu cầu sau: Tạo xung chân CCP1 có chu kỳ 300µs, độ rộng nửa chu kỳ dương: 120µs Giải: - Tính chọn tham số period prescaler; tính tham số dutycycle (như mục 3.1 trình bày) - Chèn vào chương trình lệnh: ADCON1=0x0F; //vào số TRISC=0; //cả PORTC có chiều ra, bao gồm chân RC2/CCP1 T2CON=0b00000001; // prescaler =4, 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 120µs Dưới 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 du?c c?u hình thành chân vào/ra s? //ON: PORTB du?c c?u hình thành 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 Vdd xu?ng th?p du?i 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 OpenTimer2(T2_PS_1_4); //T2CON=0b00000001; // he so chia(TMR2 Prescale Value) = ADCON1=0X0F;// ADC OFF OpenPWM1(224); // PWM_Period = 300 us SetDCPWM1(360); // PWM Duty Cycle = 120 while(1); } Kết mô phỏng: Bài tập: Câu Vẽ mạch điện lập trình theo yêu cầu: a Vẽ mạch điện sau: Chân RB3/CCP2A nối với máy sóng (oscilloscope) 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ố hàm OpenPWMx), giá trị khởi tạo cho CCPRxL:CCPxCON (hoặc đối số hàm SetDCPWMx) viết chương trình theo yêu cầu sau: Tạo xung chân CCP2A có chu kỳ 800µs, độ rộng nửa chu kỳ dương: 240µs Câu Vẽ mạch điện lập trình theo yêu cầu: a Vẽ mạch điện sau: Chân RC1/CCP2B nối với máy sóng (oscilloscope) 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ố hàm OpenPWMx), giá trị khởi tạo cho CCPRxL:CCPxCON (hoặc đối số hàm SetDCPWMx) viết chương trình theo yêu cầu sau: Tạo xung 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 họ tên SV + số cuối mã SV (VD: NguyenVanThang241.docx) Nội dung file bao gồm code kết mô (tương tự hình trên) Hạn nộp bài: 12h00 ngày CN, 29/3/2020 Lưu ý: Bài nộp hạn làm tính điểm kiểm tra thường xuyên Những SV khơng nộp tính điểm vào điểm kiểm tra thường xuyên số ... 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 120µs Dưới chương trình đầy đủ #include #include #include #include... chia tần trước cho timer2 (dùng Opentimer2(…) T2CON=…) + Lệnh OpenPWM1(…) OpenPWM2(…) tùy theo yêu cầu đề + Lệnh SetDCPWM1(…) SetDCPWM2 (…)tùy theo yêu cầu đề Ví dụ sau minh họa cho trình lập trình:... //T2CON=0b00000001; // he so chia(TMR2 Prescale Value) = ADCON1=0X0F;// ADC OFF OpenPWM1(224); // PWM_ Period = 300 us SetDCPWM1(360); // PWM Duty Cycle = 120 while(1); } Kết mô phỏng: Bài tập: Câu Vẽ mạch điện

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

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan