Bài 4: CCP
Nội dung
Capture
Compare
PWM
Ứng dụng của bộ CCP
Giới thiệu
PIC16F877A có 2 modul CCP(Capture/Compare/PWM )
giống hệt nhau về hoạt động
Các module này có nguồn là các Timer
Giới thiệu
Sự ảnh hưởng qua lại giữa 2 CCP
Các thanh ghi
Giới thiệu
Thanh ghi CCP1CON /CCP2CON (ADDRESS 17h/1Dh):
Bit 5,4 CCPxX:CCPxY: PWM least Significant bits (chỉ
tác dụng ở chế độ PWM)
2 bit MSB chứa giá trị tính độ rộng xung (duty
cycle) của khối PWM ( 8 bit còn lại được chứa trong
thanh ghi CCPRxL).
Bit 3-0 CCPxM3:CCPxM0 CCPx Mode Select bit
Các bit dùng để xác lập các chế độ hoạt động
của khối CCPx
Chế độ Capture
Khi có một “hiện tượng” xảy ra tại pin RC2/CCP1( hoặc
RC1/T1OSI/CCP2), giá trị của thanh ghi TMR1 sẽ được đưa vào
thanh ghi CCPR1( CCPR2).
“Hiện tượng”:
Mỗi khi có cạnh xuống tại các pin CCP
Mỗi khi có cạnh lên
Mỗi cạnh lên thứ 4
Mỗi cạnh lên thứ 16
Capture
Chân CCPx phải cấu hình là đầu vào
Sau khi giá trị của thanh ghi TMR1 được đưa vào
thanh ghi CCPRx, cờ ngắt CCPxIF được set
Cờ ngắt CCPxIF nên được xóa bằng phần mềm mỗi
khi được set
CCP còn được tích hợp bộ chia tần số prescaler được
điều khiển bởi các bit CCPxM3:CCPxM0
Chế độ Compare
Khi hai thanh ghi chứa giá trị bằng nhau, các pin của
CCP được thay đổi trạng thái (được đưa lên mức cao,
đưa xuống mức thấp hoặc giữ nguyên trạng thái)
Cờ ngắt CCPIF cũng sẽ được set
Sự thay đổi trạng thái của pin có thể được điều khiển
bởi các bit CCPxM3:CCPxM0 (CCPxCON <3:0>)
Compare
Cấu hình chân CCPx là đầu ra
Sự kiện đặc biệt làm reset giá trị cặp thanh ghi TMR1
Chế độ PWM
PWM
chu kỳ(period):
PWM Period = [(PR2) + 1] .4 . TOSC .( TMR2 Prescale Value-
1,4,16)
Khi giá trị thanh ghi PR2 bằng với giá trị thanh ghi TMR2 thì :
Thanh ghi TMR2 tự động được xóa.
Pin của khối CCP được set.
Giá trị thanh ghi CCPRxL được đưa vào thanh ghi CCPRxH.
PWM
duty:
PWM Duty Cycle =(CCPRxL:CCPxCON<5:4>) .TOSC.
(TMR2 Prescale Value)
Duty Cycle được xác đinh bởi thanh ghi CCPRxL và 2
bit CCPxCON<5:4>. 2 bit CCPxCON<5:4> sẽ chứa 2 bit
LSB
Khi giá trị trong thanh ghi CCPRxH bằng với giá trị trong
thanh ghi TMR2 và hai bit CCPxCON<5:4> bằng với giá
trị 2 bit của bộ chia tần số prescaler, pin của khối CCP
lại được đưa về mức thấp.
PWM
Xác định các thông số để tạo ra 1 sóng vuông có
tần số 40Khz, duty=50%, thạch anh sử dụng
4Mhz, prescale=1
+ Chu kỳ T = 1/40e3 = 2.5e-5 sec
+ XTAL Tosc = 1/4e6 = 2.5e-7 sec
+ PR2= (2.5e-5 / (4*2.5e-7 * 1)) - 1 = 24
+ Dpwm = (50* 2.5e-5) / 100 = 1.25e-5 sec
+ CCPR1= (1.25e-5) / (2.5e-7 * 1) = 50
00001100 10
PWM
void InitPWM(void)
{
PR2 = 24; //Set TIMER2 frequency
CCPR1L = 0b00001100; //Set TIMER2 duty cycle
CCP1CON = 0B00101111; //Set x,y CCP1CON<5:4>
//CCP1CON<3:0> = 11xx = PWM mode
TMR2 = 0; //Clear TMR2 first
T2CON = 0b01111000;
}
PWM
CCS
CCS
-setup_ccp1(mode) hay setup_ccp2(mode)
Mode có thể là:
Cấm CCP: CCP_OFF
Chế độ PWM: CCP_PWM
Chế độ Capture:
Chế độ Compare:
CCS
-set_pwm1_duty(value) hay set_pwm2_duty(value)
xác định khoảng thời gian tín hiệu PWM ở mức cao trong
mỗi chu kỳ là : value*(1/clock)*t2div
-Ngắt INT_CCP1, INT_CCP2
-Các lệnh về Timer1 và Timer2 hỗ trợ cho khối CCP
Ví dụ
// For a 20 mhz clock, 1.2 khz frequency,
// t2DIV set to 16
// the following sets the duty to 50% (or 416 us).
long duty;
duty = 512; // .000416/(16*(1/20000000))
set_pwm1_duty(duty);
Bài toán
Thực hiện băm xung trên chân RC2/ CCP1
Bài toán
•
#include <16f877a.h>
•
#include <def_877a.h>
•
#device *=16 ADC=8
•
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,
NOCPD, NOWRT
•
#use delay(clock=20000000)
•
int16 j;
•
void main()
•
{
•
trisc=0;//output
•
portc=0xff;//dau tien led sang
•
setup_ccp1(CCP_PWM); // che do PWM
•
setup_timer_2(T2_DIV_BY_16, 255, 1);
•
//chu ky PWM se la:
•
//(1/20.000.000)*4*16*(255+1)=819.2(us)
•
//t2div=4
•
while(1)
•
{
•
for(j=1023;j>=0;j )
•
{
•
delay_ms(10);
•
SET_PWM1_DUTY(j );//dat duty cycle
•
}
•
}
•
}
Bài toán
Sử dụng Compare, viết chương trình cứ sau 1s giá trị
của portd lại được tăng lên 1.