C7. CCP Module

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 64

ÐẠI HỌC CÔNG NGHIỆP TP.

HỒ CHÍ MINH
KHOA CÔNG NGHỆ ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ MÁY TÍNH

CHƯƠNG 7
MODUL CCP
(CAPTURE/COMPARE/PWM)
1
CHƯƠNG 6: MODUL CCP
Nội dung bao gồm:
Ø Tổng quan về modul CCP
l Capture: Bắt sự kiện
l Compare: So sánh
l PWM: Điều chế độ rộng xung
Ø Các thanh ghi của modul CCP
Ø Giới thiệu sơ lược về chế độ Capture
Ø Giới thiệu sơ lược về chế độ Compare
Ø Giới thiệu sơ lược về chế độ PWM
Ø Các tính năng nâng cao của modul CCP1
Ø Ví dụ minh họa và bài tập ứng dụng.
2
TỔNG QUAN VỀ MODUL CCP
Ø PIC16F887 có 2 modul CCP (CCP1 và
CCP2). Cách thức cấu hình và hoạt động
hoàn toàn tương tự nhau trong chế độ bình
thường, ngoại trừ các tính năng nâng cao
PWM chỉ có trên CCP1
Ø Các Timer sử dụng cho modul CCP.

Chế độ CCP Timer sử dụng


Capture Timer 1
Compare Timer 1
PWM Timer 2
3
TỔNG QUAN VỀ MODUL CCP
Ø Chế độ Capture:
l Xác định khoảng thời gian tồn tại của một sự
kiện bên ngoài được phản ánh thông qua một
ngõ vào của vi điều khiển
Ø Chế độ Compare:
l Thay đổi trạng thái của một chân ngõ ra hoặc
tạo ra một ngắt sau một khoảng thời gian xác
định
Ø Chế độ PWM:
l Tạo ra sóng vuông có chu kỳ nhiệm vụ thay đổi
được tại một tần số xác định
l Cung cấp những tính năng nâng cao cho nhiều4

kết nối yêu cầu khác nhau.


THANH GHI CỦA MODUL CCP
CCP1 Control Register (CCP1CON)
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

BIT Chức năng


Các bit chọn chế độ CCP, cấu hình
CCP1M<3:0> modul này như là ngõ vào Capture,
ngõ ra Compare hoặc ngõ ra PWM

5
THANH GHI CỦA MODUL CCP
CCPx CCPx CCPx CCPx Chế độ cho modul CCPx
M3 M2 M1 M0
0 0 0 0 Tắt Capture/Compare/PWM (reset modul CCP)
0 0 0 1 Không dùng
0 0 1 0 Chế độ Compare, đảo ngõ ra khi bằng nhau
0 0 1 1 Không dùng
0 1 0 0 Chế độ Capture, tại mỗi cạnh xuống
0 1 0 1 Chế độ Capture, tại mỗi cạnh lên
0 1 1 0 Chế độ Capture, tại mỗi cạnh lên thứ 4
0 1 1 1 Chế độ Capture, tại mỗi cạnh lên thứ 16
1 0 0 0 Chế độ Compare, đặt ngõ ra khi bằng nhau
1 0 0 1 Chế độ Compare, xóa ngõ ra khi bằng nhau
1 0 1 0 Chế độ Compare, tạo ngắt phần mềm khi bằng nhau
1 0 1 1 Chế độ Compare, kích sự kiện đặc biệt
1 1 0 0 Chế độ PWM; P1A, P1C active-high; P1B, P1D active-high
1 1 0 1 Chế độ PWM; P1A, P1C active-high; P1B, P1D active-low
1 1 1 0 Chế độ PWM; P1A, P1C active-low; P1B, P1D active-high
6
1 1 1 1 Chế độ PWM; P1A, P1C active-low; P1B, P1D active-low
THANH GHI CỦA MODUL CCP
CCP1 Control Register (CCP1CON)
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

BIT Chức năng


Các bit chọn chế độ CCP, cấu hình
CCP1M<3:0> modul này như là ngõ vào Capture,
ngõ ra Compare hoặc ngõ ra PWM
2 bit LSB qui định chu kỳ nhiệm vụ
CCP1<X:Y> cho xung PWM (8 bit MSB được
chứa trong thanh ghi CCPR1L)
Các bit cấu hình ngõ ra PWM này
chỉ có thể dùng cho modul ECCP
P1M<1:0>
(Enhanced CCP). Điều khiển lái ngõ
ra toàn cầu hoặc nữa cầu. 7
CHẾ ĐỘ CAPTURE
Ø Trongchế độ này, giá trị thanh ghi TMR1
(TMR1H:TMR1L) được sao chép vào thanh
ghi CCPx (CCPRxH:CCPRxL) và cờ báo
CCPxIF được đặt khi xảy ra:
l Mỗi cạnh xuống tại chân CCPx
l Mỗi cạnh lên tại chân CCPx
l Mỗi cạnh lên thứ 4 tại chân CCPx
l Mỗi cạnh lên thứ 16 tại chân CCPx
Ø Điều kiện cần có:
l Chân CCPx phải được cấu hình là ngõ vào
l Modul Timer 1 phải được cấu hình hoạt động ở
chế độ định thời gian hoặc bộ đếm đồng bộ.8
SƠ ĐỒ KHỐI CHẾ ĐỘ CAPTURE

CCP1 trong chế độ CAPTURE 9


SƠ ĐỒ KHỐI CHẾ ĐỘ CAPTURE

Prescaler CCPxIF
CCPx ÷ 1, 4, 16 trong PIRx

TMR1H TMR1L
Edge Detect
and Bộ đệm

System Clock (Fosc)

CCPRxH CCPRxL

P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

CCPxCON

10
SƠ ĐỒ KHỐI CHẾ ĐỘ CAPTURE
1
Prescaler CCPxIF
CCPx ÷ 1, 4, 16 trong PIRx

CCPxM3 CCPxM2 CCPxM1 CCPxM0 TMR1H


Chế độ của TMR1L
CCPx
0 1 Edge
0 Detect0 Capture tại mỗi cạnh xuống
and Bộ đệm
0 1 0 1 Capture tại mỗi cạnh lên
0 1 1 0 Capture tại mỗi cạnh lên thứ 4
System Clock (Fosc)
0 1 1 1 Capture tại mỗi cạnh lên thứ 16
CCPRxH
TMR1H
CAPTURE
CCPRxL
TMR1L

P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

CCPxCON

11
MINH HỌA KHỞI ĐỘNG CAPTURE
;Tắt modul CCP 1
TMR1H
banksel CCP1CON
clrf CCP1CON 0 0 0 0 0 0 0 0
;Tắt (dừng) Timer 1 TMR1L
bcf T1CON, TMR1ON
;Xóa giá trị Timer 1 0 0 0 0 0 0 0 0
clrf TMR1H CCPR1H
clrf TMR1L
;Cấm các ngắt dùng cho CCP1
bcf PIR1, CCP1IF CCPR1L
banksel PIE1
bcf PIE1, CCP1IE
;Cấu hình chân CCP1 là ngõ vào PIR1
bsf TRISC, 2
;Khởi động bắt sự kiện tại mỗi cạnh lên thứ 4 0
banksel CCP1CON CCP1IF
movlw b’00000110’ CCP1CON
movwf CCP1CON 0 0 0 0 0 0
1 1
0 0
;Bật (khởi động) Timer 1
bsf T1CON, TMR1ON
;Kiểm tra cờ CCP1IF để bắt sự kiện (Capture) T1CON
btfss PIR1, CCP1IF 0
goto $-1
< Tiếp theo > TMR1ON
12
MINH HỌA KHỞI ĐỘNG CAPTURE
;Tắt modul CCP 1
TMR1H
banksel CCP1CON
clrf CCP1CON 0 0 0 0 0 0 0 0
;Tắt (dừng) Timer 1 TMR1L
bcf T1CON, TMR1ON
;Xóa giá trị Timer 1 0 0 10đang
TIMER 0 tăng
0 0giá0trị !!!
0
clrf TMR1H CCPR1H
clrf TMR1L
;Cấm các ngắt dùng cho CCP1
bcf PIR1, CCP1IF CCPR1L
banksel PIE1
bcf PIE1, CCP1IE
;Cấu hình chân CCP1 là ngõ vào PIR1
bsf TRISC, 2
;Khởi động bắt sự kiện tại mỗi cạnh lên thứ 4 0
banksel CCP1CON CCP1IF
movlw b’00000110’ CCP1CON
movwf CCP1CON 0 0 0 0 0 0
1 1
0 0
;Bật (khởi động) Timer 1
bsf T1CON, TMR1ON
;Kiểm tra cờ CCP1IF để bắt sự kiện (Capture) T1CON
btfss PIR1, CCP1IF 1
0
goto $-1
< Tiếp theo > TMR1ON
13
MINH HỌA KHỞI ĐỘNG CAPTURE
;Tắt modul CCP 1
TMR1H
banksel CCP1CON
clrf CCP1CON 0 0 0 0 0 0 0 0
;Tắt (dừng) Timer 1
bcf T1CON, TMR1ON
TMR1L
Phát hiện
0 0 10đang
TIMER 0 tăng
0 0giá0trị !!!
0
CCP1 cạnh lên thứ 4
;Xóa giá trị Timer 1
clrf TMR1H
clrf TMR1L 0
1 CCPR1H
;Cấm các ngắt dùng cho CCP1
bcf PIR1, CCP1IF 24
3
1nd
rd
st
th của sự kiện !!!
CCPR1L
banksel PIE1
bcf PIE1, CCP1IE
;Cấu hình chân CCP1 là ngõ vào PIR1
bsf TRISC, 2
;Khởi động bắt sự kiện tại mỗi cạnh lên thứ 4 1
0
banksel CCP1CON CCP1IF
movlw b’00000110’ CCP1CON
movwf CCP1CON 0 0 0 0 0 0
1 1
0 0
;Bật (khởi động) Timer 1
bsf T1CON, TMR1ON
;Kiểm tra cờ CCP1IF để bắt sự kiện (Capture) T1CON
btfss PIR1, CCP1IF 1
0
goto $-1
< Tiếp theo > TMR1ON
14
MINH HỌA KHỞI ĐỘNG CAPTURE
;Tắt modul CCP 1
TMR1H
banksel CCP1CON
clrf CCP1CON 0 0 0 0 0 0 0 0
;Tắt (dừng) Timer 1 TMR1L
bcf T1CON, TMR1ON
;Xóa giá trị Timer 1 Giá
0 trị
0 hiện
0 0tại 0của0Timer
0 01
clrf TMR1H CCPR1H
clrf TMR1L
;Cấm các ngắt dùng cho CCP1
bcf PIR1, CCP1IF CCPR1L
banksel PIE1
bcf PIE1, CCP1IE Giá trị hiện tại của Timer 1
;Cấu hình chân CCP1 là ngõ vào PIR1
bsf TRISC, 2
;Khởi động bắt sự kiện tại mỗi cạnh lên thứ 4 1
0
banksel CCP1CON CCP1IF
movlw b’00000110’ CCP1CON
movwf CCP1CON 0 0 0 0 0 0
1 1
0 0
;Bật (khởi động) Timer 1
bsf T1CON, TMR1ON
;Kiểm tra cờ CCP1IF để bắt sự kiện (Capture) T1CON
btfss PIR1, CCP1IF 1
0
goto $-1
< Tiếp theo > TMR1ON
15
VÍ DỤ MINH HỌA
Ø Ví dụ 1: Dựa vào sơ đồ, viết chương trình điều
khiển để đo chu kỳ của xung vuông (f = 20Hz –
25KHz) tại chân CCP1 (RC2). Sử dụng modul CCP
ở chế độ Capture để đo chu kỳ của xung vuông.
l Sơ đồ nguyên lý:
+ A

AM FM
- C

C7 Y1 D
4MHz
OSC2
U2
CLK
22p MCLR 1 15
OSC1
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
CE BAI TAP UNG DUNG DIEU KHIEN MODUL ECCP (Capture)
RC1/T1OSI/CCP2 RST
2 17 CLK
C6 +5V
3
RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1
18
4
RA1/AN1/C12IN1- RC3/SCK/SCL
23
+5V RP1 +5V RP2
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA +5V +5V
5 24 10K 10K
RA3/AN3/VREF+/C1IN+ RC5/SDO
22p 6 25
7
RA4/T0CKI/C1OUT RC6/TX/CK
26 U3 1 U1 1
RA5/AN4/SS/C2OUT RC7/RX/DT
R2 OSC2 14
RA6/OSC2/CLKOUT COM
10
COM
10
OSC1 13 19 1 18 D0 D0 2 RB0 1 18 B0 B0 2
10K RA7/OSC1/CLKIN RD0 1B 1C 1B 1C
20 2 17 D1 D1 3 RB1 2 17 B1 B1 3
RD1 2B 2C 2B 2C
RB0 33 21 3 16 D2 D2 4 RB2 3 16 B2 B2 4
R49 MCLR RB1 34
RB0/AN12/INT RD2
22 4
3B 3C
15 D3 D3 5 RB3 4
3B 3C
15 B3 B3 5
RB1/AN10/C12IN3- RD3 4B 4C 4B 4C
RB2 35 27 5 14 D4 D4 6 RB4 5 14 B4 B4 6
100R RB2/AN8 RD4 5B 5C 5B 5C
RB3 36 28 6 13 D5 D5 7 RB5 6 13 B5 B5 7
RB3/AN9/PGM/C12IN2- RD5/P1B 6B 6C 6B 6C
SW1 C10 RB4 37
RB4/AN11 RD6/P1C
29 7
7B 7C
12 D6 D6 8 RB6 7
7B 7C
12 B6 B6 8
RB5 38 30 8 11 D7 D7 9 RB7 8 11 B7 B7 9
0.1uF RB5/AN13/T1G RD7/P1D 8B 8C 8B 8C
RB6 39
RB6/ICSPCLK
RB7 40 8 ULN2803 ULN2803
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7 +5V +5V +5V +5V +5V +5V +5V +5V +5V +5V +5V +5V +5V +5V +5V +5V
PIC16F887

R17 R16 R15 R14 R13 R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R1


330 330 330 330 330 330 330 330 330 330 330 330 330 330 330 330

D16 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1

16
D7

D6

D5

D4

D3

D2

D1

D0

B7

B6

B5

B4

B3

B2

B1

B0
VÍ DỤ MINH HỌA
l Giải thuật:

17
VÍ DỤ MINH HỌA
l Cấu hình (Hi-Tech C):
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON &
MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF &
IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);

#define _XTAL_FREQ 4000000

18
VÍ DỤ MINH HỌA
l Chương trình (Hi-Tech C):
unsigned int tOld, tNew; void init_interrupts(void)
unsigned int tword; {
bit edge = 0; CCP1IF = 0;
bit capture = 0; CCP1IE = 1;
void init_CCP(void) PEIE = 1;
{ GIE = 1;
CCP1CON = 0X05; }
TRISC2 = 1;
}
void init_Timer1(void)
{
TMR1H = 0;
TMR1L = 0;
T1CON = 0X01;
}
19
VÍ DỤ MINH HỌA
l Chương trình (Hi-Tech C):
void interrupt ISR(void)
{
if(CCP1IF)
{
if(!edge)
{
tOld = (256*CCPR1H)+CCPR1L;
edge = 1;
}
else
{
tNew = (256*CCPR1H)+CCPR1L;
capture = 1;
edge = 0;
}
CCP1IF = 0;
} 20
}
VÍ DỤ MINH HỌA
l Chương trình (Hi-Tech C):
void main(void) while(1)
{ {
ANSEL = 0; if(capture)
ANSELH = 0; {
CCP1IE = 0;
TRISB = 0x00; capture = 0;
TRISD = 0x00; tword = ~tOld + tNew+1;

init_CCP(); PORTD = tword / 256;


init_Timer1(); PORTB = tword % 256;
init_interrupts(); CCP1IF = 0;
CCP1IE = 1;
}
}
}
21
CHẾ ĐỘ COMPARE
Ø Trong chế độ này, giá trị trong thanh ghi
CCPx (không đổi) được so sánh với giá trị
trong thanh ghi TMR1 và khi giá trị của
chúng bằng nhau thì:
l Cờ báo CCPxIF được đặt
l Thay đổi trạng thái logic của chân CCPx
l Kích các sự kiện đặc biệt
Ø Điều kiện cần có:
l Chân CCPx phải được cấu hình là ngõ ra
l Modul Timer 1 phải được cấu hình hoạt động ở
chế độ định thời gian hoặc bộ đếm đồng bộ.
22
SƠ ĐỒ KHỐI CHẾ ĐỘ COMPARE

CCP1 trong chế độ COMPARE 23


SƠ ĐỒ KHỐI CHẾ ĐỘ COMPARE

CCP2 trong chế độ COMPARE 24


SƠ ĐỒ KHỐI CHẾ ĐỘ COMPARE

TMR1H TMR1L CCPxIF


trong PIRx

SO SÁNH NO
TMR1H:TMR1L
= Logic CCPx
CCPRxH:CCPRxL YES ngõ ra
???

CCPRxH CCPRxL
Kích sự kiện đặc biệt

P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0


25
CCPxCON
SƠ ĐỒ KHỐI CHẾ ĐỘ COMPARE
CCPxM3 CCPxM2 CCPxM1 1 CCPx
Chế độ của
TMR1H TMR1L CCPxM0 CCPxIF
Đặt ngõ ra khi bằng
trong nhau
PIRx
1 0 0 0
(CCPxIF = 1)
Xóa ngõ ra khi bằng nhau
1 SO
0 SÁNH
0 1 NO
TMR1H:TMR1L (CCPxIF = 1)
= Tạo ngắt phầnLogic
mềm khi bằng nhau
CCPx
CCPRxH:CCPRxL YES
1 0 1 0 (CCPxIF = 1,ngõ
chânra
CCP1 không bị
??? tác động)
Kích các sự kiện đặc biệt
(CCPxIF = 1, CCP1 reset TMR1
1 0 1 1
hoặc TMR2 và bắt đầu thực hiện
CCPRxH CCPRxL chuyển đổi AD nếu được cho phép)
Kích sự kiện đặc biệt

P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0


26
CCPxCON
MINH HỌA KHỞI ĐỘNG COMPARE
;Tắt modul CCP 1 TMR1H
banksel CCP1CON
clrf
;Tắt (dừng) Timer 1
CCP1CON 0 0 0 0
TMR1H:TMR1L 0 00000 0000
= 1000 0 0000
0
bcf T1CON, TMR1ON TMR1L
;Xóa giá trị Timer 1
clrf TMR1H 0 0(bằng10
TIMER đang
giá 0 CCPR1H:CCPR1L)
trị của 0 0giá0trị 0
tăng !!!
TMR1H:TMR1L = 1000 0000 0000 0000

clrf TMR1L
;Cấm các ngắt dùng cho CCP1
;và đảm bảo rằng các cờ của nó được xóa
CCPR1H
banksel
bcf
PIE1
PIE1, CCP1IE
1 0 0 0 0 0 0 0
banksel PIR1 CCPR1L
bcf PIR1, CCP1IF
;Cấu hình chân CCP1 là ngõ ra
banksel TRISC
0 0 0 0 0 0 0 0
bcf TRISC, 2
;Khởi động chế độ so sánh để đặt ngõ ra khi bằng nhau T1CON
banksel CCP1CON
movlw b’00001000’ 1
0
movwf CCP1CON
;Đặt giá trị cần so sánh vào thanh ghi TMR1ON
;CCPR1H:CCPR1L CCP1CON
banksel CCPR1H
movlw b’10000000’ 0 0 0 0 1
0 0 0 0
movwf CCPR1H
clrf CCPR1L
;Bật (khởi động) Timer 1 PIR1
bsf T1CON, TMR1ON
;Kiểm tra cờ CCP1IF để biết giá trị Timer1 bằng CCPRx 0
1
btfss PIR1, CCP1IF
CCP1IF 27
goto $-1
< Tiếp theo >
VÍ DỤ MINH HỌA
Ø Ví dụ 2: Dựa vào sơ đồ, viết chương trình điều
khiển tạo xung có tần số thay đổi trong khoảng từ
122,3Hz - 244,1Hz tại chân CCP1 (RC2). Sử dụng
modul CCP ở chế độ Compare để tạo xung.
l Sơ đồ nguyên lý:
Y1 BAI TAP UNG DUNG DIEU KHIEN MODUL ECCP (PWM)
C7 4MHz
OSC2
U2
22p MCLR 1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
OSC1 16 RC2
RC1/T1OSI/CCP2 A
2 17 RC2
C6 +5V
3
RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1
18
RA1/AN1/C12IN1- RC3/SCK/SCL B
4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO C
22p 6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
RA5/AN4/SS/C2OUT RC7/RX/DT D
R2 OSC2 14
RA6/OSC2/CLKOUT
OSC1 13 19
10K RA7/OSC1/CLKIN RD0
20
RD1
33 21 RC2
R49 MCLR 34
RB0/AN12/INT RD2
22
CLK
RB1/AN10/C12IN3- RD3 CE
35 27
100R RB2/AN8 RD4 RST
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
SW1 C10 37
RB4/AN11 RD6/P1C
29
+5V
0.1uF 38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887
BUZZER

R1 Q1
RC2
NPN
1K
28
VÍ DỤ MINH HỌA
l Giải thuật:

29
VÍ DỤ MINH HỌA
l Giải thuật:

� � 30
� = �����: ����� × × ���. = ������: ������ × × ���.
���� ����
VÍ DỤ MINH HỌA
l Cấu hình (Hi-Tech C):
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON &
MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF &
IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);

#define _XTAL_FREQ 4000000

31
VÍ DỤ MINH HỌA
l Chương trình (Hi-Tech C):
void interrupt OC_interrupt(void) void init_Timer1(void)
{ {
CCP1IF = 0; T1CON = 0X30;
PORTC ^= 0X04; }
--CCPR1L;
} void init_interrupts(void)
{
void init_CCP(void) CCP1IE = 1;
{ PEIE = 1;
CCP1CON = 0X0B; GIE = 1;
CCPR1L = 0X00; }
CCPR1H = 0X01;
TRISC2 = 0;
}
32
VÍ DỤ MINH HỌA
l Chương trình (Hi-Tech C):
void main(void)
{
init_CCP();
init_Timer1();
init_interrupts();

TMR1ON = 1;

while(1);
}

33
CHẾ ĐỘ PWM
Ø Trong chế độ này, tại chân CCPx sẽ xuất ra
tín hiệu PWM (Pulse-Width Modulated)

34
CHẾ ĐỘ PWM
Ø Chu kỳ nhiệm vụ (Duty cycle), chu kỳ
(Period) và độ phân giải (Resolution) có thể
điều khiển được bằng các thanh ghi sau:
PR2 T2CON CCPRxL CCPxCON

35
CHẾ ĐỘ PWM
Ø Điều kiện cần có:
l Chân CCPx phải được cấu hình là ngõ ra
l Đặc biệt lưu ý rằng độ rộng xung PWM phải
luôn luôn nhỏ hơn chu kỳ PWM, nếu không sẽ
làm cho ngõ ra không thể thay đổi trạng thái
l Bộ chia tỉ lệ sau của Timer 2 (Postscaler) không
được dùng để tạo ra chu kỳ PWM dài hơn.

36
CHẾ ĐỘ PWM
Ø Các công thức tính toán của PWM:
l Chu kỳ PWM (PWM Period):

���� = ��� + � × � × × ���.
����
TPWM: Chu kỳ xung PWM (s)
fOSC: Tần số dao động (MHz)
Pre.: Giá trị hệ số Prescaler (Pre = 1, 4, 16)
[PR2]: Giá trị cần ghi vào thanh ghi PR2.
� ≤ ��� ≤ ���

37
CHẾ ĐỘ PWM
Ø Các công thức tính toán của PWM:
l Chu kỳ PWM (PWM Period):

���� = ��� + � × � × × ���.
����

TẦN SỐ PWM [KHZ] 1.22 4.88 19.53 78.12 156.3 208.3


Prescaler của Timer 2 16 4 1 1 1 1
Thanh ghi PR2 FFh FFh FFh 3Fh 1Fh 17h
Ví dụ minh họa các tần số xung PWM (PIC sử dụng thạch
anh 20MHz)
38
CHẾ ĐỘ PWM
Ø Các công thức tính toán của PWM:
l Độ rộng xung PWM (PWM Pulse Width):

�� = ������: ������� < �: � > × × ���
����

PW: Độ rộng xung PWM (s)


fOSC: Tần số dao động (MHz)
Pre: Giá trị hệ số Prescaler (Pre = 1, 4, 16)
[CCPRxL:CCPxCON<5:4>]: Con số có giá trị 10 bit (gồm 8
bit MSB trong thanh ghi CCPRxL và 2 bit LSB trong thanh
ghi CCPxCON).

� ≤ ������: ������� < �: � > ≤ ���� 39


CHẾ ĐỘ PWM
Ø Các công thức tính toán của PWM:
l Tỉ số chu kỳ nhiệm vụ (Duty Cycle Ratio):

������: ������� < �: � >


��� = × ���%
� × ��� + �
DCR: Tỉ số chu kỳ nhiệm vụ (%)
[PR2]: Giá trị của thanh ghi PR2.
[CCPRxL:CCPxCON<5:4>]: Con số có giá trị 10 bit (gồm 8
bit MSB trong thanh ghi CCPRxL và 2 bit LSB trong thanh
ghi CCPxCON).

40
THANH GHI CỦA MODUL CCP
CCP1 Control Register (CCP1CON)
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

BIT Chức năng


Các bit chọn chế độ CCP, cấu hình
CCP1M<3:0> modul này như là ngõ vào Capture,
ngõ ra Compare hoặc ngõ ra PWM
2 bit LSB qui định chu kỳ nhiệm vụ
CCP1<X:Y> cho xung PWM (8 bit MSB được
chứa trong thanh ghi CCPR1L)
Các bit cấu hình ngõ ra PWM này
chỉ có thể dùng cho modul ECCP
P1M<1:0>
(Enhanced CCP). Điều khiển lái ngõ
ra toàn cầu hoặc nữa cầu. 41
CHẾ ĐỘ PWM
Ø Các công thức tính toán của PWM:
l Độ phân giải PWM (PWM Resolution):

���
log � × ��� + �
=
log 2
Res: Độ phân giải PWM (bit)
[PR2]: Giá trị của thanh ghi PR2.
1.22 4.88 19.53 78.12 156.3 208.3
TẦN SỐ PWM
KHZ KHZ KHZ KHZ KHZ KHZ
Prescale Timer 2 16 4 1 1 1 1
Giá trị PR2 FFh FFh FFh 3Fh 1Fh 17h
Độ phân giải lớn nhất 10 10 10 8 7 6

Ví dụ minh họa quan hệ tần số xung PWM và độ phân giải


42
của PWM (PIC sử dụng thạch anh 20MHz)
CHẾ ĐỘ PWM
Ø Các công thức tính toán của PWM:
l Độ phân giải PWM (PWM Resolution):

���
log � × ��� + �
=
log 2
Res: Độ phân giải PWM (bit)
[PR2]: Giá trị của thanh ghi PR2.
1.22 4.90 19.61 76.92 153.85 200.0
TẦN SỐ PWM
KHZ KHZ KHZ KHZ KHZ KHZ
Prescale Timer 2 16 4 1 1 1 1
Giá trị PR2 65h 65h 65h 19h 0Ch 09h
Độ phân giải lớn nhất 8 8 8 6 5 5

Ví dụ minh họa quan hệ tần số xung PWM và độ phân giải


43
của PWM (PIC sử dụng thạch anh 8MHz)
CHẾ ĐỘ PWM

CCP1
trong
chế
độ
PWM
44
SƠ ĐỒ KHỐI PWM

CCPR1L CCP1<X:Y>

Bộ đệm 10
đôi
CCPR1H LATCH

10
Chân ra CCP1
Bộ so sánh

10 R
Bộ
TMR 2 (1) chốt
8 S CCP1
Bộ so sánh

8 (1) TMR2 được liên kết với 2 bit


PR2 FOSC hoặc 2 bit từ Prescaler để
tạo ra thời gian cơ sở 10 bit
SƠ ĐỒ KHỐI PWM
Chu kỳ 1 Chu kỳ 2

CCPR1L
Giá trị chu kỳ nhiệmCCP1<X:Y>
vụ
Bộ đệm 10
đôi
CCPR1H LATCH

10
Bắt đầu Chân ra CCP1
COMPARATOR
TMR2 = CCPR1H chu kỳ

10 R
Bộ
TMR2
TMR2đang
bị xóa
tăng
về lên
0 (1) chốt 0
1
8 S
CCP1
COMPARATOR
TMR2 = PR2

8 (1) TMR2 được liên kết với 2 bit


PR2 FOSC hoặc 2 bit từ Prescaler để
tạo ra thời gian cơ sở 10 bit
PWM: MỘT SỐ ĐIỂM CẦN LƯU Ý
Ø Để cấu hình modul CCP ở chế độ PWM:
l BƯỚC 1: Cấm xuất xung PWM
• Cấm bộ điều khiển xuất của chân CCPx (cấu
hình chân này là ngõ vào)
l BƯỚC 2: Đặt giá trị chu kỳ PWM (đặt vào
thanh ghi PR2 giá trị thích hợp)
l BƯỚC 3: Cấu hình modul CCP ở chế độ
PWM (đặt vào thanh ghi CCPxCON giá trị
thích hợp)
l BƯỚC 4: Đặt giá trị chu kỳ nhiệm vụ PWM
(đặt vào thanh ghi CCPRxL và các bit
DCxB<1:0> của thanh ghi CCPxCON 47
PWM: MỘT SỐ ĐIỂM CẦN LƯU Ý
Ø Để cấu hình modul CCP ở chế độ PWM:
l BƯỚC 5: Cấu hình và kích hoạt Timer 2
• Xóa cờ ngắt TMR2IF của thanh ghi PIR1
(TMR2IF = 0)
• Đặt giá trị prescaler của Timer 2 (đặt vào các
bit T2CKPS của thanh ghi T2CON giá trị thích
hợp)
• Kích hoạt Timer 2 (TMR2ON = 1)
l BƯỚC 6: Cho phép xuất xung PWM
• Chờ cho đến khi Timer 2 tràn (TMR2IF = 1)
• Cho phép bộ điều khiển xuất của chân CCPx
(cấu hình chân này là ngõ ra) 48
MINH HỌA KHỞI ĐỘNG PWM
;Tắt chân CCPx bằng cách cấu hình CCPx là ngõ vào
banksel TRISC TMR2
bsf TRISC, 2 0 0 0 0 0 0 0 0
;Xóa Timer 2
banksel TMR2 PR2
clrf TMR2
;Thiết lập chu kỳ và chu kỳ nhiệm vụ với fOSC = 8MHz
0 1 1 1 1 1 1 1
banksel PR2 CCPR1L
movlw b’01111111’ ;
movwf PR2 ;Nạp giá trị chu kỳ 64S 0 0 0 1 1 1 1 1
banksel CCPR1L CCP1CON
movlw b’00011111’ ;
movwf CCPR1L ;Nạp giá trị chu kỳ nhiệm 0 0 1 0 1 1 0 0
;vụ của xung PWM (25%)
;Cấu hình modul ECCP cho PWM đơn LSB của chu kỳ Chế độ PWM
;với P1A kích hoạt mức cao và các bit nhiệm vụ CCP1M <3:0>
;LSB của chu kỳ nhiệm vụ là ’10’ DC1B<1:0>
movlw b’00101100’ ; T2CON
movwf CCP1CON ;Modul ECCP được cấu
;hình cho PWM và các bit
0 0 0 0 0 1 0 0
;LSB của chu kỳ được nạp
Prescaler Postscaler
;Bật chân CCPx trở lại
banksel TRISC TOUTPS<3:0> T2CKPS<1:0>
bcf TRISC, 2 ;Làm cho CCP1 là ngõ ra
TMR2ON
;Timer 2 chạy khi TMR2ON = 1
banksel T2CON
movlw b’00000100’ ; 49
movwf T2CON ;Prescaler và Postscaler
;đều có giá trị 1:1
VÍ DỤ MINH HỌA
Ø Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều
khiển tạo xung PWM có fPWM = 4KHz, D = 50% tại
chân CCP1 (RC2). Sử dụng modul CCP ở chế độ
PWM để tạo xung.(fosc=4Mhz,pre=1)
l Sơ đồ nguyên lý:
Y1 BAI TAP UNG DUNG DIEU KHIEN MODUL ECCP (PWM)
C7 4MHz
OSC2
U2
22p MCLR 1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
OSC1 16 RC2
RC1/T1OSI/CCP2 A
2 17 RC2
C6 +5V
3
RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1
18
RA1/AN1/C12IN1- RC3/SCK/SCL B
4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO C
22p 6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
RA5/AN4/SS/C2OUT RC7/RX/DT D
R2 OSC2 14
RA6/OSC2/CLKOUT
OSC1 13 19
10K RA7/OSC1/CLKIN RD0
20
RD1
33 21 RC2
R49 MCLR 34
RB0/AN12/INT RD2
22
CLK
RB1/AN10/C12IN3- RD3 CE
35 27
100R RB2/AN8 RD4 RST
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
SW1 C10 37
RB4/AN11 RD6/P1C
29
+5V
0.1uF 38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887
BUZZER

R1 Q1
RC2
NPN
1K
50
Tính toán giá trị thanh ghi

• fPWM =4KHz, fOSC =4MHz, chọn prescaler =1


1 1
TPWM    250 s
f PWM 4000


���� = ��� + � × � × × ���.
����

• Thay TPWM, fOSC , pre vào ta tính được PR2 = 249


• Với CCP1: D% = 50%
Tính được D.T 50.250
PW  PWM
  125s
100 100
51
Tính toán giá trị thanh ghi
• Từ công thức :

�� = ������: ������� < �: � > × × ���
����
• Đặt E =(CCPR1L:CCP1CON<5:4> ) suy ra E=125x4=500
• CCPR1L = E/4 = 125 ;
• CCP1CON<5:4> = E%4 = 0 suy ra giá trị từ bảng TT
ta có : CCPxCON<5:4> DCxB1 DCxB0
DC1B1=0 và DC1B0=0

0 0 0
1 0 1
2 1 0 52

3 1 1
VÍ DỤ MINH HỌA
l Giải thuật:

53
VÍ DỤ MINH HỌA
l Cấu hình (Hi-Tech C):
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON &
MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF &
IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);

#define _XTAL_FREQ 4000000

54
VÍ DỤ MINH HỌA
l Chương trình (Hi-Tech C):
void setup_ccp(void)
{ void main(void)
TRISC2 = 1; {
ANSEL=ANSELH=0;
TMR2 = 0x00; setup_ccp();
while(1);
PR2 = 249;
}
CCPR1L = 125;
CCP1CON = 0x0C;
DC1B1=0;DC1B0=0;
TRISC2 = 0;
T2CON = 0X00;
TMR2ON =1; 55

}
BÀI TẬP ỨNG DỤNG
Ø Bài tập 1: Viết chương trình điều khiển tạo
xung PWM có fPWM = 5KHz, D = 40% tại chân
CCP2. Sử dụng modul CCP ở chế độ PWM
để tạo xung.
Ø Bài tập 2: Viết chương trình điều khiển tạo
xung PWM có fPWM = 10KHz, D1 = 80% tại
chân CCP1 và D2 = 20% tại chân CCP2. Sử
dụng modul CCP ở chế độ PWM để tạo
xung.
Biết rằng fosc = 4MHz

56
BÀI TẬP ỨNG DỤNG

Ø Bài
tập 3: Viết chương trình điều khiển tạo
xung PWM có fPWM = 8KHz, D1 = 60% tại
chân CCP1 và D2 = 40% tại chân CCP2.
Sử dụng modul CCP ở chế độ PWM để tạo
xung.
Biết rằng fosc = 4MHz
Bài tập 4 :Thiết kế mạch điện tạo ra 2 xung PWM có
Tần số xung PWM: fPWM = 5 kHz
Chu kì nhiệm vụ của xung tại chân RC2 là DRC2 =30%
Chu kì nhiệm vụ của xung tại chân RC1 là DRC1 =70%
Cho biết mạch điện sử dụng vi điều khiển PIC16F887 với tần
số X_TAL 4MHz.
Yêu cầu sử dụng modul CCP hoạt động ở chế độ PWM để
thực hiện yêu cầu tạo xung PWM.
a) Xác định đầu vào/ đầu ra của mạch điện. [CDRMH3]
b) Vẽ sơ đồ mạch nguyên lý.[CDRMH4]
c) Tính toán các giá trị thanh ghi sử dụng chức năng PWM
của khối CCP. [CDRMH2]
d) Vẽ lưu đồ giải thuật. [CDRMH6]
e) Viết chương trình. [CDRMH6]
Bài tập 5:Thiết kế mạch điện tạo ra 2 xung PWM có :
Tần số xung PWM: fPWM = 5 kHz
Nhấn-nhả SW4 : tạo xung PWM có chu kì nhiệm vụ tại chân
RC2 là D =40%
Nhấn-nhả SW5 :tạo xung PWM có chu kì nhiệm vụ tại chân
RC1 là D =60%
Nhấn-nhả SW6 :dừng phát xung PWM
Cho biết mạch điện sử dụng vi điều khiển PIC16F8xx, 3 nút
nhấn SW4 (nối chân RB0), SW5(nối chân RB1), SW6 (nối chân
RB2).
a) Xác định đầu vào/ đầu ra của mạch điện. [CDRMH3]
b) Vẽ sơ đồ mạch nguyên lý.[CDRMH4]
c) Tính toán các giá trị thanh ghi sử dụng chức năng PWM
của khối CCP. [CDRMH2]
d) Vẽ lưu đồ giải thuật. [CDRMH6]
e) Viết chương trình. [CDRMH6]
a) Xác định đầu vào/ đầu ra của mạch điện.

b) Vẽ sơ đồ mạch nguyên lý.


Ø c) Tính toán các giá trị thanh ghi sử dụng chức
năng PWM của khối CCP.

Ø PR2=?
Ø Với CCP1: D%=40% >CCPR1L,CCP1CON=?
Ø Với CCP2: D%=60% >CCPR2L,CCP2CON=?
d) Vẽ lưu đồ giải thuật.
#include <xc.h>
#define _XTAL_FREQ 4000000
__CONFIG(……..);
void main (void)
{ ANSEL=ANSEL=0;
TRISB =0X07 ; nRBPU = 0; WPUB = 0x07;
while(1)
{
if (!RB0 )
{
while(!RB0);
TRISC2 = 1;TRISC1=1;
TMR2 = 0;
PR2 = 199;
CCPR1L =80; CCP1CON = 0X0C;
TRISC2 = 0;T2CON = 0x00;TMR2ON = 1;}
else if (!RB1)
{
while(!RB1);
TRISC1 = 1; TRISC2=1;
TMR2 = 0; PR2 =199;
CCPR2L = 120;CCP2CON = 0X0C;
TRISC1 = 0;
T2CON = 0x00; TMR2ON = 1;
}
else if (!RB2 )
{
while(!RB2);
TRISC2 = 1;
TRISC1 = 1;
}

You might also like