You are on page 1of 90

MÔN HỌC

VI XỬ LÝ PIC 16F8XX
CHƯƠNG 8 CCP MODULE

LẬP TRÌNH ĐIỀU KHIỂN NGOẠI VI


MODUL BẮT GIỮ/SO SÁNH/ ĐIỀU RỘNG XUNG

(CCP - CAPTURE/COMPARE/PWM)
YÊU CẦU
• Phân tích được cấu trúc và sử dụng được tập lệnh của
Vi điều khiển PIC16F8xx.

• Nắm được cấu trúc và nguyên lý hoạt động của Module


Bắt giữ/ so sánh/ điều rộng xung (CCP).

• Thực hiện được cách xây dựng lưu đồ và viết các


chương trình điều khiển cho các ứng dụng có sử dụng
modul CCP.

• Nắm được sơ đồ và nguyên lí hoạt động của hệ ứng


dụng KIT-RP; lập trình điều khiển cho các ứng dụng sử
dụng CCP modul trên KIT-RP.
MỤC ĐÍCH
• Lập trình ứng dụng trên máy tính, biên dịch CT, mô
phỏng, nạp vào vi điều khiển, sử dụng mô hình kiểm
chứng.

• Điều khiển thiết bị ngoại vi bằng các port của PIC.

• Điều khiển hoạt động của modul CCP được tích hợp sẵn
trong PIC.

• Thiết kế và lập trình điều khiển cho các ứng dụng có sử


dụng mô dul CCP.
TỔNG QUAN VỀ CCP MODUL

Các mode CCP module gồm:


• Capture

• Compare

• PWM
Tổng quan về CCP modul

• Capture
– Xác định thời gian tồn tại 1 sự kiện bên ngoài thông qua
ngõ vào của vi điều khiển
• Compare
– Thay đổi trạng thái của 1 chân ngõ ra hoặc thực hiện
các thao tác trong chương trình ngắt sau khoảng thời
gian nhất định
• Pulse Width Modulation (PWM)
– Tạo ra sóng xung vuông có chu kỳ nhiệm vụ thay đổi ở
tần số xác định
– Cung cấp những tính năng thuận lợi cho việc kết nối với
dạng mạch điều khiển cầu.
Tổng quan về CCP

Module CCP có liên hệ chặt chẽ với


Timers 1 and 2

CCP MODE Timer Resource


Capture Timer 1
Compare Timer 1
PWM Timer 2
Thanh ghi điều khiển CCP
Thanh ghi điều khiển(CCP1CON)
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

BIT FUNCTION
Định cấu hình hoạt động cho module như: ngõ vào
CCP1M<3:0>
Capture, ngõ ra so sánh, hoặc PWM
Thiết lập độ rộng xung điều chế: 2 Bit thấp (8 bit cao
CCP1<X:Y>
được chứa trong thanh ghi CCPR1L)
Định cấu hình ngõ ra của module PWM. Các bit chức
P1M<1:0> năng này chỉ có ở những module ECCP (Enhanced
CCP), cho phép các ngõ ra được cấu hình ở dạng cầu
Các thanh ghi
Thanh ghi điều khiển (CCP1CON)
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

CCPxM3BIT
CCPxM2 CCPxM1 CCPxM0 Lựa chọn chế độ CCP
FUNCTION
0 0 0 0 Capture/ so sánh/ PWM off (resets CCP modlue)
Định cấu hình hoạt động cho module như: ngõ vào
CCP1M<3:0>
0 0 0 1 Không dùng
0 0 Capture,
1 ngõ
0 ra so
Chếsánh,
độ sohoặc
sánh,PWM
ngõ ra đảo
0 0 Thiết
1 lập độ
1 rộng xungdùng
Không điều chế: 2 Bit thấp (8 bit cao
CCP1<X:Y>
0 1 được
0 chứa 0trongChế
thanh ghi CCPR1L)
độ Capture, mỗi cạnh xuống
0 1 0 1 Chế độ Capture, mỗi cạnh lên
0 1
Định
1
cấu hình
0
ngõ ra của module PWM. Các bit chức
Chế độ Capture, mỗi cạnh lên thứ 4
0
P1M<1:0>1 năng
1 này chỉ
1 có ở những
Chế module
độ Capture, ECCP
mỗi (Enhanced
cạnh lên thứ 16
1 0 CCP),
0 cho phép
0 các
Chế ngõ
độ sora được
sánh, cấu
ngõ hình
ra lên ở dạng
mức cao cầu
1 0 0 1 Chế độ so sánh, ngõ ra xuống mức thấp
1 0 1 0 Chế độ so sánh, Ngắt bằng phần mềm tạo ra
1 0 1 1 Chế độ so sánh, xung Trigger đặc biệt tạo ra
1 1 x x Chế độ PWM

THANH GHI CCPRx : CCPRxH:CCPRxL


CAPTURE MODE
Chế độ Capture
• Trong chế độ này giá trị thanh ghi
TMR1(TMR1H:TMR1L) được sao chép vào
thanh ghiCCPx(CCPRxH:CCPRxL) và cờ báo
CCPxIFđược set khi xảy ra các điều kiện sau:
– Mỗi cạnh xuống tại chân CCPx
– Mỗi cạnh lên tại chân CCPx
– Mỗi cạnh lên thứ 4 tại chân CCPx
– 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
– Modul Timer1 phải cấu hình hoạt động ở chế độ định
thời gian hoặc bộ đếm đồng bộ
Chế độ Capture
Prescaler CCPxIF in PIRx
÷1, 4, 16
CCPx

TMR1H TMR1L
Edge Detect
and Single Buffered

System Clock (Fosc)


CCPRxH CCPRxL

P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

CCPxCON
Chế độ Capture
Prescaler CCPxIF in PIRx
CCPx
÷1, 4, 16

TMR1H TMR1L
Edge Detect
and Single Buffered

System Clock (Fosc)


CCPRxH CCPRxL
CCPxCON
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

CCPxM3 CCPxM2 CCPxM1 CCPxM0 MODE


0 1 0 0 Capture khi có cạnh xuống
0 1 0 1 Capture khi có cạnh lên
0 1 1 0 Capture ở cạnh lên thứ 4
0 1 1 1 Capture ở cạnh lên thứ 16
Trình tự

Khởi tạo chế độ Capture


• Tắt module CCP (xóa thanh ghi CCP1CON)
• Tắt Timer1 (TMR1ON=0)
• Xóa thanh ghi đếm Timer1 (TMR1=0000)
• Cấm tất cả các ngắt CCP (CCP1IE =CCP1IF=0)
• Set chân CCP1 là ngõ vào (TRISRC2=1)
• Set chế độ Capture ở cạnh lên thứ 1 or 4 or 16
(CCPXCON =05 OR06 OR 07)
• Bật Timer1
• Kiểm tra cờ ngắt CCP1IF lên mức 1
Khởi tạo chế độ Capture
;Tắt module CCP TMR1H
BANKSEL CCP1CON CCP1 0 0 0 0 0 0 0 0
CLRF CCP1CON Pin
;Tắt Timer1 0
1 TMR1L
BCF T1CON,TMR1ON
4
TIMER1
Current
0 INCREMENTING!!
0 0Timer1
0 Value
0 0 0 0
;Xóa thanh ghi đếm Timer1 21th
3 rd
nd
st

CLRF TMR1H
Rising Edge CCPR1H
CLRF TMR1L Detected!!
;Cấm tất cả các ngắt CCP CCPR1L
BCF PIR1,CCP1IF
BANKSEL PIE1 Captured!
BCF PIE1,CCP1IE PIR1
;Set chân CCP1 là ngõ vào
BSF TRISC,2
0
1
;Set chế độ Capture ở cạnh lên thứ 4 CCP1IF
BANKSEL CCP1CON CCP1CON
MOVLW B’00000110’ 0 0 0 0 0 10 0
1 0
MOVWF CCP1CON
;Bật Timer1 T1CON
BSF T1CON,TMR1ON
;Kiểm tra cờ ngắt CCP1IF lên mức 1 1
0
BTFSS PIR1,CCP1IF TMR1ON
GOTO $-1
Ví dụ 1:

Dựa vào sơ đồ, viết chương trình đo chu kỳ của xung


vuông ( t < 65536us) tại chân CCP1 (RC2) sử dụng
modul CCP chế độ capture.
• Tính toán các thông số và thanh ghi
Sơ đồ giải thuật
ISR
• thuật:
Chương trình
#include<htc.h>
__CONFIG();
unsigned char count = 0x00; unsigned int t1,t2,t;
void interrupt isr()
{ CCP1IF=0;
count++;
if(count==1)
t1=256*CCPR1H+CCPR1L;
if(count==2) {
count=0;
CCP1IE=0;
t2=256*CCPR1H+CCPR1L;
t=t2-t1;
PORTD=t/256; PORTB=t%256;
CCP1IE=1; }
}
void main(void)
{ TRISC2=1;//Set chan CCP1 la ngo vao
TRISB=0;//Thiet lap PORT B là ngõ ra
TRISD=0; //Thiet lap PORT D là ngõ ra
CCP1CON=0X05;//ngat o canh len thu 1
TMR1H=0;
TMR1L=0;
TMR1ON=1;
CCP1IF=0;
CCP1IE=1;
PEIE=1;
GIE=1;
while(1){}
}
COMPARE MODE
BỘ SO SÁNH

• Modul so sánh (Comparator) thực hiện


việc so sánh điện áp ngõ vào tưong tự với
điện áp tham chiếu (Vref) và xuất ra một
giá trị số ở ngõ ra.

• (Nguyên lý so sánh sử dụng Op-amp)

• PIC16F887 có 2 modul so sánh (C1 và


C2).
Thanh ghi của bộ so sánh
• Mỗi bộ so sánh (C1 và C2) đều có thanh
ghi điều khiển riêng của nó
– CM1CON0 và CM2CON0 dùng để điều khiển:
• Cho phép hoạt động
• Chọn lựa ngõ vào
• Chọn lựa tham chiếu,
• Chọn lựa ngõ ra
• Đảo trạng thái ngõ ra
– Bộ so sánh 2 (C2) có bổ sung thêm thanh ghi
CM2CON1 dùng cho giao tiếp với Timer 1.
Sơ đồ khối
• Sơ đồ khối bộ so sánh C2
Sơ đồ khối đơn giản mạch so sánh

Thanh ghi CMxCON0


Chế độ COMPARE
Trong chế độ này giá trị 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ì:
-Cờ báo CCPxIF được set
-Thay đổi trạng thái logic của chân CCPx
- 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
-Modul Timer1 phải cấu hình hoạt động ở chế
độ định thời gian hoặc đếm đồng bộ
TỔNG QUAN VỀ CCP MODUL

Các mode CCP module gồm:


• Capture

• Compare

• PWM
Tổng quan về CCP

Module CCP có liên hệ chặt chẽ với


Timers 1 and 2

CCP MODE Timer Resource


Capture Timer 1
Compare Timer 1
PWM Timer 2
Thanh ghi điều khiển CCP
Thanh ghi điều khiển(CCP1CON)
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

BIT FUNCTION
Định cấu hình hoạt động cho module như: ngõ vào
CCP1M<3:0>
Capture, ngõ ra so sánh, hoặc PWM
Thiết lập độ rộng xung điều chế: 2 Bit thấp (8 bit cao
CCP1<X:Y>
được chứa trong thanh ghi CCPR1L)
Định cấu hình ngõ ra của module PWM. Các bit chức
P1M<1:0> năng này chỉ có ở những module ECCP (Enhanced
CCP), cho phép các ngõ ra được cấu hình ở dạng cầu
Các thanh ghi
Thanh ghi điều khiển (CCP1CON)
P1M1 P1M0 CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0

CCPxM3BIT
CCPxM2 CCPxM1 CCPxM0 Lựa chọn chế độ CCP
FUNCTION
0 0 0 0 Capture/ so sánh/ PWM off (resets CCP modlue)
Định cấu hình hoạt động cho module như: ngõ vào
CCP1M<3:0>
0 0 0 1 Không dùng
0 0 Capture,
1 ngõ
0 ra so
Chếsánh,
độ sohoặc
sánh,PWM
ngõ ra đảo
0 0 Thiết
1 lập độ
1 rộng xungdùng
Không điều chế: 2 Bit thấp (8 bit cao
CCP1<X:Y>
0 1 được
0 chứa 0trongChế
thanh ghi CCPR1L)
độ Capture, mỗi cạnh xuống
0 1 0 1 Chế độ Capture, mỗi cạnh lên
0 1
Định
1
cấu hình
0
ngõ ra của module PWM. Các bit chức
Chế độ Capture, mỗi cạnh lên thứ 4
0
P1M<1:0>1 năng
1 này chỉ
1 có ở những
Chế module
độ Capture, ECCP
mỗi (Enhanced
cạnh lên thứ 16
1 0 CCP),
0 cho phép
0 các
Chế ngõ
độ sora được
sánh, cấu
ngõ hình
ra lên ở dạng
mức cao cầu
1 0 0 1 Chế độ so sánh, ngõ ra xuống mức thấp
1 0 1 0 Chế độ so sánh, Ngắt bằng phần mềm tạo ra
1 0 1 1 Chế độ so sánh, xung Trigger đặc biệt tạo ra
1 1 x x Chế độ PWM

THANH GHI CCPRx : CCPRxH:CCPRxL


PWM MODE
(PULSE WIDTH MODULATION)
Chế độ PWM
• Tín hiệu điều chế (PWM) phát ra trên 2 chân:
CCP1 và CCP2
• Thời gian của 1 chu kỳ, độ rộng xung của điều
chế và độ phân giải được xác định bởi các
thanh ghi sau:
Thanh ghi Giải thích

PR2 Thanh ghi Period

T2CON Thanh ghi điều khiểnTimer2

CCPRxL Thanh ghi xác định độ rộng xung

CCPxCON Thanh ghi điều khiển module CCP


Dạng tín hiệu
Pulse Width Modulation

• Pulse Width Modulation (PWM) is a technique of


modulation of a digital signal in order to obtain an analog
value.
• It based on generating a square wave with a given
frequency.
• In the square wave, the “0” part and the “1” part have
different duration.
• The difference, in percentage, is called duty cycle
Duty Cycle: Definition

• The Duty Cycle is defined as the percentage of Ton with


respect to the total period Ppwm of the signal:
Usage of Pulse Width Modulation

PWM has multiple utilisations:


1 To simply transfer an analog value over a digital line;
devices receiving a PWM signal can interpret the “analog value”
by measuring the duration of the “1” part with respect to the total
frequency;
2 To modulate a typical on/off system; e.g. to change the
intensity of a light generated by a lamp, a LED, etc.;
3 To drive power systems without affecting performances;
e.g. to drive a DC motor.
Sơ đồ khối PWM
Period 1 Period 2

CCPR1L
DUTY CYCLE VALUE CCP1<X:Y>

DOUBLE 10
BUFFER

CCPR1H LATCH

10
Period CCP1 Output Pin
TMR2 = CCPR1H
COMPARATOR Start

10 R
Latch
incrementing
TMR2 Reset to 0’s (1) 0
1
8 S CCP1
pin
COMPARATOR
TMR2 = PR2

8 Note (1): TMR2 kết hợp với 2 bit FOSC hoặc 2


bit xác định giá trị của bộ chia trước tạo thành
PR2 10 bit xác định độ rộng xung
Đặc điểm của Timer 2
 Là Timer 8 bit có bộ prescale và postscale
 Được sử dụng như bộ tạo xung có PWM cho chế
độ hoạt động PWM của khối CCP
 Thanh ghi TMR2 có thể đọc/ghi và xóa khi bị reset
 Bộ chia tần số trước prescale với bit điều khiển
T2CKPS1:T2CKPS2
 Ngõ ra, TMR2 đi qua bộ postscale 4 bit để tạo ra
yêu cầu ngắt TMR2 được chốt trong cờ
TMR2IF(PIR1<1>)
Đặc điểm của Timer 2
 Là Timer 8 bit có bộ prescale và postscale
 Được sử dụng như bộ tạo xung có PWM cho chế
độ hoạt động PWM của khối CCP
 Thanh ghi TMR2 có thể đọc/ghi và xóa khi bị reset
 Bộ chia tần số trước prescale với bit điều khiển
T2CKPS1:T2CKPS2
 Ngõ ra, TMR2 đi qua bộ postscale 4 bit để tạo ra
yêu cầu ngắt TMR2 được chốt trong cờ
TMR2IF(PIR1<1>)
Sơ đồ khối củaTimer2
TMR2
OUTPUT
TMR2
Prescaler
Fosc/4
1:1, 1:4, 1:16

Postscaler
COMPARATOR 1:1  1:16

PR2

Timer2 Control Register (T2CON)


TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

T2CKPS1 T2CKPS2 Scale


0 0 1:1 Timer2 ON
0 1 1:4 1 = Timer2 enabled
1 X 1:16
TOUTPS3
Sơ đồ khối củaTimer2
TOUTPS2 TOUTPS1 TOUTPS0 SCALE

0 0 0 0 1:1
0 0 0 1 1:2
0 0 1 0 1:3 TMR2
0 0 1 1 1:4 OUTPUT
0 1 0 0
TMR21:5
Prescaler
0 1 0 1 1:6

Fosc/4
1:1,
0 1:4,1 1:16 1 0 1:7
0 1 1 1 1:8

1 0 0 0 1:9
Postscaler
1

1
0

0
0

1
1

0
COMPARATOR
1:10

1:11 1:1  1:16


1 0 1 1 1:12
1 1 0 0 PR2 1:13
1 1 0 1 1:14
1 1 1 0 1:15

1 1 1 1 1:16

Timer2 Control Register (T2CON)


TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

T2CKPS1 T2CKPS2 Scale


0 0 1:1 Timer2 ON
0 1 1:4 1 = Timer2 enabled
1 X 1:16
Sơ đồ khối củaTimer2
Start Timer2
TMR2
Counting
OUTPUT
TMR2
Prescaler
1 1 1 1 0
1 1
0 0
1 1
0
Fosc/4
1:1, 1:4, 1:16

Postscaler
COMPARATOR 1:1  1:16

PR2
Load Period PIR1
1 1 1 1 1 0 0 0
Register 1
TMR2IF
Timer2 Control Register (T2CON)
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

Flag set on first


match with
postscaler = 1:1
Khởi tạo Timer2 Timer2
Incrementing
TMR2 (Timer2 Counter)
;Disable the Timer2 interrupts in the PIE1
;Cấm ngắt Timer2 trong thanh ghi PIE1 0
1 0
1 0
1 0
1 0
1 0 1 0
1 0 1
;Xóa cờ ngắt TMR2IF trong thanh ghi PIR1
BANKSEL PIE1 PR2 (Period Register Timer2)
BCF
BANKSEL
PIE1,TMR2IE
PIR1
1 0 0 0 0 0 0 0
BCF PIR1,TMR2IF PIE1 (Peripheral Interrupt Enable)
;Setup thanh ghi T2CON Postscaler = 1:15,
;Prescaler = 1:16, Timer2 off 0
MOVLW b’01110010’ TMR2IE
MOVWF T2CON PIR1 (Peripheral Interrupt Request)
;Xóa thanh ghi TMR2
BANKSEL TMR2 1
0
CLRF TMR2 TMR2IF
;Khởi tạo giá trị PR2 Flag is set
BANKSEL PR2
MOVLW b’10000000’ T2CON (Timer2 Control)
MOVWF PR2
;Timer2 bắt đầu đếm lên 0 1 1 1 0 0
1 1 0
BANKSEL T2CON
BSF T2CON,TMR2ON
TMR2ON
;Kiểm tra cờ ngắt TMR2IF Postscaler = 1:15
BTFSS PIR1,TMR2IF (TOUTPS<3:0>) Prescaler = 1:16
GOTO $-1
(T2CKPS<1:0>)
Cách xác định các thông số
*Chu kỳ của PWM: `
TPWM (period) = [(PR2)+1]*4*TOSC *(PresT2*PostT2)

PR2 =?
PresT2=?
PostT2=?
Độ rộng xung điều chế:
tx(PWM duty cycle)=(CCPRxL:CCPxCON<5:4>)*TOSC *(PresT2*PostT2)
 CCPRxL=?
CCPxCON<5,4>=?  CCPxCON = 00??1100;
;Tắt CCP1 bằng cách set các bit trong TRIS
BANKSEL TRISC
BSF TRISC, 2 ;Cấu hình các chân là ngõ vào

;Xóa Timer2
BANKSEL TMR2
CLRF TMR2

;Thiết lập chu kỳ và độ rộng xung


MOVLW B’01111111’ ;
MOVWF PR2 ;Thiết lập chu kỳ xung
MOVLW B’00011111’ ;
MOVWF CCPR1L ;Thiết lập độ rộng xung

;Thiết lập module CCP ở chế độ PWM, các bit thấp của độ rộng
xung là bits CCPxCON <5:4> b’yy’
MOVLW B’00101100’
MOVWF CCP1CON

;Cho phép chân CCP là ngõ ra


BANKSEL TRISC
BCF TRISC,2

;Cho PWM hoạt động bằng cách bật Timer2 ,Cấu hình
Prescaler và Postscaler là ….)
MOVLW B’00000100’
MOVWF T2CON
Khởi tạo PWM – Fosc-4MHz
TMR2
;Tắt CCP1 bằng cách set các bit trong TRIS 0 0 0 0 0 0 0 0
BANKSEL TRISC
BSF TRISC, 2 ;Cấu hình các chân là ngõ vào PR2

;Xóa Timer2 0 1 1 1 1 1 1 1
BANKSEL TMR2
CLRF TMR2 CCPR1L

;Thiết lập chu kỳ và độ rộng xung


0 0 0 1 1 1 1 1
MOVLW B’01111111’ ; CCP1CON
MOVWF PR2 ;Thiết lập chu kỳ xung
MOVLW B’00011111’ ; 0 0 1 0 1 1 0 0
MOVWF CCPR1L ;Thiết lập độ rộng xung

;Thiết lập module CCP ở chế độ PWM duty cycle PWM Mode
;các bit thấp của độ rộng xung là b’10’ LSBs CCP1M <3:0>
MOVLW B’00101100’ CCP1<X:Y>
MOVWF CCP1CON T2CON

;Cho phép chân CCP là ngõ ra 0 0 0 0 0 1 0 0


BANKSEL TRISC
BCF TRISC,2 Postcaler bits Prescaler bits
;Cho PWM hoạt động bằng cách bật Timer2
TOUTPS<3:0> T2CKPS<1:0>
;Cấu hình Prescaler và Postscaler là 1:1)
MOVLW B’00000100’
TMR2ON
MOVWF T2CON
Tính các giá trị (bài toán ngược)
• PresT2=PostT2=1
• Tosc=0,25us
• PR2 =0x7F= 127  Tpwm = 128us
• CCPR1L:CCP1CON = 0x7E= 126
• Tx = 126/4=31,5us
• Fpwm=1/Tpwm
• D =Tx/Tpwm
Bài tập chế độ PWM :
Viết chương trình tạo xung có tần
số 5Khz, chu kỳ nhiệm vụ D=30%
trên chân RC1
Sinh viên tự tính và viết CT

Slide 74
BT
• 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

Tính toán:
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
+T2CON = 0b00000100;
+ Tx= (50* 2.5e-5) / 100 = 1.25e-5 sec
+ CCPR1= (1.25e-5) / (2.5e-7 * 1) = 50  00001100 10
BT

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 = 1111=PWM mode
TMR2 = 0; //Clear TMR2 first
T2CON = 0b00000100;
}
• Vẽ sơ đồ mạch, vẽ lưu đồ giải thuật và viết chương trình
dùng module PWM điều khiển độ sáng của led được nối
với chân RC1 theo sự điều khiển của nút nhấn SW1
(nối với chân RB1). Nếu nhấn nhả nút SW1 thì xung
PWM liên tục được tạo ra tại RC1 với tần số f=4Khz và
chu kỳ nhiệm vụ là D1=75%.
Tính toán

• T(PWM)=(PR2+1)x4x(1/fosc)xPre
=1/(4Khz). fosc=8Mhz,
chon PresT2=1:4, postT2=1:1; PR2=124
• t1on(PWM)=
=(CCPR2L:CCP2CON<5:4>)x(1/fosc)xPre
=0.75*T -->CCPR2L:CCP2CON<5:4>=375
CCPR2L=0b01011101; CCP2CON<5:4>=11
CCP2CON= 00111111;
Lưu đồ
Khai báo thư viện
Khai báo cấu hình

//khai báo biến hàm..


#define SW1 RB1
void init()
{
SW1
nhấn ?

TRISB1=1;
TRISC1=0;
RC1=0;
RBPU=0;
SW1
}
nhả ?
void main(void)
{ init();
while(1)
{ if(!SW1)
{ __delay_ms(50);
while(!SW1);
TRISC1=1; TMR2=0; PR2=124;
CCPR2L=0b01011101;//chu ky nhiem vu 75%
//CCPR2L:CCP2CON<5:4> =375
CCP2CON=0b00111100;
TRISC1=0; //chon RC1: output
T2CON=0b00000001; //pre=1:4
TMR2ON=1; //Timer 2 chay
}
} }
• Vẽ sơ đồ mạch, Vẽ lưu đồ giải thuật và viết chương
trình dùng module PWM điều khiển độ sáng của 2
led được nối với chân RC1 và RC2 theo sự điều
khiển của 2 nút nhấn BRIGHT (nối với RB1) và
DARK (nối với RB0).
• Nếu nhấn nhả nút BRIGHT thì xung PWM liên
tục được tạo ra tại RC2 với tần số f=4Khz và chu kỳ
nhiệm vụ là D1=75%.
• Nếu nhấn nhả nút DARK thì xung PWM liên tục
được tạo ra tại RC1 với tần số f=4Khz và chu kỳ
nhiệm vụ là D2=40%.
• T(PWM)=(PR2+1)x4x(1/fosc)xPre
=1/(4Khz). fosc=8hz,
chon Pre=4, PR2=124
• t1on(PWM)=
=(CCPR2L:CCP2CON<5:4>)x(1/fosc)xPre
=0.75*T -->CCPR2L:CCP2CON<5:4>=375
CCPR2L=0b01011101; CCP2CON<5:4>=11

• t2on(PWM)=
=(CCPR1L:CCP1CON<5:4>)x(1/fosc)xPre
=0.4*T -->CCPR1L:CCP1CON<5:4>=200
CCPR1L=0b00110010; CCP1CON<5:4>=00
Lưu đồ
Chương trình
#define SW_DARK RB0
#define SW_BRIGHT RB1
void init()
{
TRISB0=1;
TRISB1=1;
TRISC1=0;
TRISC2=0;
RC1=0;
RC2=0;
RBPU=0;
}
void main(void)
{ init();
while(1) {
if(!SW_DARK)
{
__delay_ms(100);
while(! SW_DARK);
TRISC1=1; TMR2=0; PR2=124;
CCPR2L=0b01011101;//chu ky nhiem vu 75%
//CCPR2L:CCP2CON<5:4> =375
CCP2CON=0b00111100;
TRISC1=0; //chon RC1: output
T2CON=0b00000001; //pre=1:4
TMR2ON=1; //Timer 2 chay
}
if(!SW_BRIGHT)
{ __delay_ms(100);
while(!SW_BRIGHT);
TRISC2=1; TMR2=0; PR2=124;
CCPR1L=0b00110010;// chu ky nhiem vu 85%
//CCPR1L:CCP1CON<5:4>=282
CCP1CON=0b00001100;
TRISC2=0; //chon RC2: output
T2CON=0b00000001; //pre=1:4
TMR2ON=1; //Timer 2 chay
}
}
}
Cho sơ đồ như hình. VCC=5VDC.
Vẽ sơ đồ khối, sơ đồ nguyên lý Kiểm tra 20’
tóm tắt, xây dựng lưu đồ giải
thuật, tính toán xác định các
thông số cần thiết và viết
chương trình điều khiển độ sáng
của hai LED đơn được nối với
chân RC1 và RC2 (LED2 và
LED3) theo sự điều khiển của
nút nhấn S1(RA4) và S3(RE0)
bằng phương pháp PWM (với
fPWM = 10KHz):
Nếu nhấn-nhả nút S1(RA4) thì
xung PWM liên tục được tạo ra tại
chân RC1 với chu kỳ công tác
D1 = 80% (RC2 luôn có mức thấp);
nếu nhấn-nhả nút S3(RE0) thì
xung PWM liên tục được tạo ra tại
chân RC2 với với chu kỳ công tác
D2 = 20% (RC1 luôn có mức thấp).
Ban đầu xung PWM không được
tạo ra và các LED tắt hết.
FOSC =8MHz;
• Lưu ý: Phải sử dụng mô-đun
• Sơ đồ khối hệ thống • Lưu đồ
Giải
+ Sơ đồ khối hệ thống

• Tính toán:(có thể có nhiều cách tính toán khác


nhau)
fpwm=10 KHz -> T_pwm=100 us
-> PR2 = 199; T2_prescale=1
Với D=80% -> CCPR1L=160; CCP1CON<5:4>=00;
Với D=20% -> CCPR2L=40; CCP2CON<5:4>=00;
void main(void)
{ init();
TRISC2=1;
TMR2=0; PR2=99;
#include <htc.h>
TRISC2=0;
#include <math.h>
T2CON=0b00000000;//pre=1:1
__CONFIG(HS & WDTDIS & PWRTEN &
while(1)
UNPROTECT & BORDIS & LVPDIS);
{
#define _XTAL_FREQ 8000000
if(!SW_ BRIGHT)
#define SW_ BRIGHT RA4
{ __delay_ms(100);
#define SW_DARK RE0 while(!SW_ BRIGHT);
TMR2ON=0;
void init() CCPR1L=160;//Thiet lap với D= 80%
{ CCP1CON=0x0C;
// Đối với 16f887 TMR2ON=1; }
ANSEL=0X00; ANSELH=0X00; if(!SW_DARK)
{ __delay_ms(100);
TRISA4=1;
while(!SW_ DARK);
TRISE0=1;
TMR2ON=0;
TRISC2=0; CCPR2L =40;//Thiet lap với D= 20%
TRISC1=0; CCP1CON=0x0C;
} TMR2ON=1; }
} }

You might also like