Upload
doublemint1001
View
320
Download
6
Embed Size (px)
DESCRIPTION
bam xung PWM
Citation preview
Băm xung (PWM) là gì
Trong phần timer ta đã học tạo ra các xung có thời gian ở mức 1 = thời gian ở mức 0
Xung pWm
• Xung pwm có chu kì không đổi. Nhưng thời gian mức 1 có thể khác hoặc bằng thời gian mức 0
Duty cycle
Period
Xung PWM để làm gì?
• Nếu chúng ta cấp vào 2 bóng đèn xung có cùng tần số, và mỗi bóng đèn có duty cycle khác nhau
• => thì bóng đèn có độ rộng xung(duty cycle) rộng hơn thì sáng nhiều hơn
• Nếu thay bóng đèn bằng động cơ. Thì động cơ nào được cấp xung có độ rộng xung(duty cycle) lớn hơn thì quay nhanh hơn
Cho nên:
• Dùng pwm để điều khiển tốc độ động cơ• Hay điều khiển độ sáng bóng đèn• Và nhiều chức năng khác
• Nguyên lý đơn giản là bật tắt liên tục. Bóng đèn nào có thời gian bật lớn hơn thì sáng hơn và ngược lại
Bộ PWM của PIC18f4520
• Có 2 bộ tạo xung• PWM1• PWM2Pwm1 cấp xung ra trên chân CCP1/ RC2Pwm2 cấp xung ra trên chân CCp2/RC1 hoặc RB3
Muốn sử dụng các chân ccp này cần đặt tris ở mức 0( đầu ra)
Cách bộ tạo xung hoạt động
PR2
OUT PUT
TMR2
Comparator
CCPRxH
CCPRxL
Comarator
R Q
S
CCPxCON<5:4>
TRIS BIT
Thiết lập chu kì và độ rộng xung
• Chu kì = (PR2+1)*4*TOSC*(TMR2 prescaler value)• Độ rộng= (A*TOSC*(TMR2 prescaler value)• A là: giá trị gộp lại từ thanh ghi 8 bit CCPRxL và 2
bít CCPxCON<5:4>• X là 1 hoặc 2. đại diện cho bộ CCP1 và CCP2
• PR2 là thanh ghi 8 bit nên giá trị không quá 256
Ví dụ tạo xung 1Khz. Duty cycle = 70%
• Sử dụng thạch anh 4 MHz=> TOSC = 1/4 us• Xung 1khz = > chu kì xung là 1000 (us)• Duty cycle = 70% = 70.1000/100 = 700 (us)
• Chọn hệ số TMR2 prescaler = 4• => PR2+1= 1000/4/0.25/4= 250=>PR2=249• A = 700/(4x0.25) = 700
Thư viện PWM.H
• Có 3 hàm để sử dụng• ClosePWMx: cấm hoạt động kênh x• OpenPWMx: khởi tạo kênh x• SetDCPWMx: cài đặt độ rộng xung cho kênh x
• X: là kênh 1 hoặc 2
Ví dụ tạo xung 1khz. Duty cycle = 70%
• Đã tính được PR2 = 249• A = 700• #include<p18f4520.h>• #include<pwm.h>• #pragma config OSC = HS• #pragma config WDT = OFF• #pragma config MCLRE= OFF
• void main()
• {• TRISC=0; // su dugn CCP1/ RC2• T2CONbits.T2CKPS1=0;• T2CONbits.T2CKPS0=1;// TMR2 prescaler =4• ADCON1= 0x0f;• OpenPWM1(249);// khoi tao Pwm1• SetDCPWM1(700);// do rong xung là 700• while(1);
• }