I. GIỚI THIỆU
Vi điều khiển PIC họ 16F877A có 2 bộ PWM dùng để điều khiển tốc độ động cơ DC.
Phần này sẽ khảo sát chi tiết khối PWM của PIC và tập lệnh lập trình C cho PWM.
II. KHẢO SÁT PWM
Vi điều khiển PIC họ 16F877A có 2 bộ PWM dùng để điều khiển tốc độ động cơ DC.
Phần này sẽ khảo sát chi tiết khối PWM của PIC và tập lệnh lập trình C cho PWM.
II. KHẢO SÁT PWM
1. SƠ ĐỒ KHỐI PWM của PIC16F877A có sơ đồ khối như hình 7-1:
Khối PWM gồm có 2 mạch so sánh: mạch so sánh 8 bit với mạch so sánh 10 bit. Mạch so sánh 8 bit sẽ so sánh giá trị đếm của timer2 với giá trị của thanh ghi PR2 (period register), giá trị trong timer2 tăng từ giá trị đặt trước cho đến khi bằng giá trị của PR2 thì mạch so sánh sẽ set flip flop RS làm ngõ ra CCPx lên mức 1. Đồng thời nạp giá trị 10 bit từ thanh ghi CCPRxL sang thanh ghi CCPRxH, timer2 bị reset và bắt đầu đếm lại cho đến khi giá trị của timer2 bằng giá trị của CCPRxH thì mạch so sánh sẽ reset flip flop RS làm ngõ ra CCPx về mức 0. Quá trình này lặp lại.
Dạng sóng điều chế PWM như hình 7-2:
Chu kỳ không thay đổi, muốn thay đổi thời gian xung ở mức 1 thì ta thay đổi hệ số chu kỳ (duty cycle). Khi hệ số chu kỳ thay đổi thì điện áp hay dòng trung bình thay đổi. Hệ số chu kỳ càng lớn thì dòng trung bình càng lớn, nếu điều khiển động cơ sẽ làm thay đổi tốc độ.
2. TÍNH CHU KỲ XUNG PWM
Chu kỳ PWM của PIC16F877A được tính theo công thức:
PVTMR2 (prescale value) giá trị chia trước của timer2.
Khi giá trị của timer 2 (TMR2) bằng giá trị của thanh ghi PR2 thì 3 sự kiện theo sau sẽ xảy ra:
Giá trị của hệ số chu kỳ là 10 bit nên có thể thay đổi từ 0 đến 1023 tạo ra 1024 cấp giá trị điều khiển. Giá trị 10 bit thì 8 bit có trọng số lớn lưu trong thanh ghi CCPRxL và 2 bit còn lại có trọng số thấp thì ở CCPxCON<5:4>.
Hệ số chu kỳ của PIC16F877A được tính theo công thức:
Chu kỳ PWM của PIC16F877A được tính theo công thức:
PERIODPWM = [(PR2) +1] * 4 * TOSC * PVTMR2
Trong đó: TOSC là chu kỳ của tụ thạch anh tạo dao động.PVTMR2 (prescale value) giá trị chia trước của timer2.
Khi giá trị của timer 2 (TMR2) bằng giá trị của thanh ghi PR2 thì 3 sự kiện theo sau sẽ xảy ra:
- Thanh ghi TMR2 bị xóa
- Tín hiệu ngõ ra CCPx lên mức 1, ngoại trừ hệ số chu kỳ bằng 0% thì CCPx vẫn ở mức 0.
- Hệ số chu kỳ PWM được chuyển từ thanh ghi CCPRxL sang thanh ghi CCPRxH. 3. TÍNH HỆ SỐ CHU KỲ XUNG PWM
Giá trị của hệ số chu kỳ là 10 bit nên có thể thay đổi từ 0 đến 1023 tạo ra 1024 cấp giá trị điều khiển. Giá trị 10 bit thì 8 bit có trọng số lớn lưu trong thanh ghi CCPRxL và 2 bit còn lại có trọng số thấp thì ở CCPxCON<5:4>.
Hệ số chu kỳ của PIC16F877A được tính theo công thức:
DUTY_ CYCLEPWM = (CCPRxL : CCPxCON < 5 : 4 >) * TOSC * PVTMR2
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <16f877a.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#define use_portd_lcd TRUE
#include <lcd.c>
unsigned long int pot_data=0;
unsigned long int pwm_data=0;
void main()
{
setup_psp(psp_disabled);
setup_ccp1(ccp_pwm);
setup_ccp2(ccp_off);
setup_timer_1(t1_disabled);
setup_timer_2(t2_div_by_1,170,1);
setup_adc_ports(AN0_AN1_AN3);
setup_adc(adc_clock_internal);
lcd_init();
printf(lcd_putc,"\f DEMO PWM\nBY LAM 3 NGON");
delay_ms(2000);
do
{
set_adc_channel(0);
delay_us(20);
pot_data=read_adc();
pwm_data=pot_data/6;
set_pwm1_duty(pwm_data);
printf(lcd_putc,"\fValue ADC.= %lu\nValue PWM= %lu",pot_data,pwm_data);
delay_ms(1000);
}
while(1);
}
Muốn cho hiển thị lên led 7 thanh đc không pác ơi !
ReplyDeleteĐược chứ !
Deletecho em hỏi pwm_data=pot_data/6; chỗ adc đọc về sao lại chia 6 vậy a
ReplyDelete