Thứ Hai, 3 tháng 12, 2018

CHƯƠNG 7 : MODULE PWM / CAPTURE / COMPARE


I/ _TỔNG QUÁT PHẦN CỨNG:
_Module này có mặt ở hầu hết các dòng PIC 16 và PIC 18 , và thường chỉ có 2 chân cho module này, ký hiệu là CCP1 / CCP2 . Cần phân biệt với module PWM chuyên dụng trên PIC 18 và dsPIC vốn có 6 tới 8 chân PWMx , cũng phục vụ cho điều chế độ rộng xung nhưng chuyên dụng cho điều khiển
động cơ AC . Một số PIC 14 và PIC 18 có module ECCP cũng dùng module CCP này nhưng lại chuyên dụng cho điều khiển bộ biến đổi áp DC->DC , dùng cho điều khiển động cơ DC . Ở đây chưa đề cập đến ECCP . Chỉ đề cập CCP , và thường chỉ có 2 chân là CCP1 và CCP2 .
_Module có 3 chức năng và khi hoạt động ta chỉ dùng được 1 chức năng ứng với 1 chân . Ngoài ra
nếu không dùng thì có thể set nó thành chân I /O .
_Mỗi module chứa 1 thanh ghi 16 bit , là kết hợp của 2 thanh ghi 8 bit : CCPR1L(byte thấp ) và
CCPR1H ( byte cao ) của CCP1 , CCPR2L và CCPR2H của CCP2 .
_Mỗi chức năng của CCPx đều đòi hỏi 1 bộ đếm để hoạt động : Capture / Compare đòi hỏi Timer1 ,
còn PWM đòi hỏi Timer2 .                        → Bảng trên ( trong datasheet PIC16F877 ) cho thấy : nếu cả 2 module dùng cùng chức năng Capture
thì sẽ dùng chung bộ đếm timer1 , nghĩa là mọi họat động và điều chỉnh Timer1 đều ảnh hưởng tới
cả 2 module . Tương tự nếu dùng cùng chức năng PWM sẽ dùng chung Timer2 . Còn nếu 1 module
là Capture , module kia là Compare thì phải lưu ý là chức năng compare có thể clear Timer1 , và do
đó cũng ảnh hưởng chức năng còn lại . Còn 2 TH cuối thì không có vấn đề gì .
_Ở chế độ Capture : mỗi khi có cạnh lên của xung vào chân CCPx thì giá trị Timer1 (16 bit )sẽ được
copy vào thanh ghi CCP ( 16 bit ) .
_Ở chế độ Compare : khi giá trị nạp CCP bằng giá trị đếm Timer1 thì các sư kiện được chỉ định
trước xảy ra :chân CCPx được láira mức thấp / cao / không có gì nhưng có ngắt hay biến đổi AD .
_Chế độ PWM ( pulse width modulation – điều chế độ rộng xung ) : xuất xung vuông bằng phần
cứng .
_Bạn sử dụng hàm setup_ccpX() để xác định chức năng muốn dùng trên module CCP . tham số cụ
thể có thể tra trong HELP , hoặcxem từng TH cụ thể dưới đây .
II / _CHẾ ĐỘ CAPTURE :
_Dùng để xác định tốc độ quay của motor . Giả sử ta có 1 thiết bị đo tốc độ quay ( cảm biến Hall )
mà mỗi khi motor quay 1 vòng thì thiết bị phát 1 xung vuông ( cạnh lên rồi cạnh xuống hay xung
mức 1 , hay cạnh xuống rồi cạnh lên tức là xung mức 0 ) . Ở đây ta giả thiết xung mức 1 . Xung này
dẫn vào module capture ( có thể qua cách ly an toàn ) và giả thiết ta chọn chế độ bắt cạnh lên .
Nghĩa là cứ mỗi 1 cạnh lên của xung vào , giá trị của timer1 copy vào CCP . Vì motor không phải
quay đều nên ta thường chọn số lần capture là vài chục lần .
_Việc Capture thường đi kèm 1 cái hàm ngắt . Cách thức chương trình hoạt động như sau : xung vào
Capture sẽ kích ngắt , trong hàm ngắt ,ta lấy giá trị CCPx tính ra được thời gian cho 1 vòng quay
,cộng dồn nó vào 1 biến để tính thời gian tổng , set Timer1 về 0 , tăng giá trị biến đếm vòng lên 1 ,
rồi thoát ngắt . Với 1 động cơ đang chạy khoảng 1200vòng / phút , tuỳ thuộc vào tần suất cập nhật
giá trị số vòng quay ( để hiển thị raLED 7 đoạn hay LCD ) bạn cần đo 1 số lượng vòng nhất định
để đảm bảo chính xác , VD đo 1500 vòng , tức là biến đếm phải đếm tới 1500 , tính tổng thới gian
đó , VD là 80 s , thì tốc độ động cơ = ( 1500 / 80 ) * 60 = 1125 vòng / phút .
_Hãy quên module này đi nếu bạn dùng 1 encoder để đo tốc , vốn phát ra tới 500-2000 xung / vòng
.Nghĩa là cần chừng đó lần ngắt để chỉ đo 1 vòng → VDK sẽ phải dùng toàn bộ thời gian hoạt động
để đếm , có khi không kịp . Việc chương trình chính không thể chạy vì ngắt cứ xảy ra liên tục gọi là
tràn , nó sẽ chẳng làm được gì cả . Để giải quyết , người tadùng module QEI hay IC3 vốn chỉ có
trên PIC 18 như 18F4431 .
_Capture còn dùng để đo độ rộng xung . Sử dụng CCP1 lấy cạnh lên , CCP2 lấy cạnh xuống của
cùng 1 xung ,tức là 2 CCP nối nhau . 1 xung vuông đi vào kích CCP1 trước ( cạnh lên ), thu được giá
trị timer lúc , cạnh xuống của xungkích CCP2 thu được giá trị timer lúc xuống cạnh . Lấy 2 giá trị
trừ nhau được độ rộng xung . chỉ cần 1 ngắt CCP2 là đủ .
III / _CHẾ ĐỘ COMPARE :
_Hoạt động : khi timer1 đếm lên tới khi bằng giá trị mà ta trữ trong CCPx, thì chân CCPx sẽ xuất ra
mức cao / thấp / hay không có nhưng có ngắt .
IV / _CHẾ ĐỘ PWM :
_Xuất chuỗi xung vuông , độ rộng hiệu chỉnh được dễ dàng . Thường dùng để điều chỉnh điện áp
DC . Xung ra sẽ đóng cắt 1 linh kiện như là SCR,với độ rộng xung xác định sẽ tạo ra 1 điện áp
trung bình xác định . Thay đổi độ rộng xung sẽ thayđổi điện áp này , do đó có thể dùng điều khiển
động cơ DCnhỏ 
V / _DANH SÁCH HÀM:
_ CCS luôn tạo sẵn các tên danh định C như là các biến trỏ tới CCP1 và CCP2 là : CCP_1( 16 bit )
CCP_2(16 bit ) , CCP_1_HIGH( byte cao của CCP1 ) , CCP_1_LOW , CCP_2_HIGH ,
CCP_2_LOW , bạn không cần khai báo . Dùng luôn các tên đó để lấy trị khi dùng module Cap , hay
gán trị khi dùng Compare . Bạn có thể thấy điều này khi mở mục RAM symbol mapquan sát phân
bổ bộ nhớ . 
1 / _ Setup_CCPx ( mode ) : 
_Dùng trước tiên để thiết lập chế độ hoạt động hay vô hiệu tính năng CCP .
X= 1,2, . . .tên chân CCP có trên chip .
 + Mode là 1 trong các hằng số sau : ( các hằng số khác có thể có thêm trong file *. h và tuỳ VDK) 
  • CCP_OFF : tắt chức năng CCP, RC sẽ là chân I /O .
  • CCP_CAPTURE_RE  : capture khi có cạnh lên  
  • CCP_CAPTURE_FE  : capture khi có cạnh xuống  
  • CCP_CAPTURE_DIV_4  : chỉ capture sau khi đếm đủ 4 cạnh lên ( 4 xung ).  
  • CCP_CAPTURE_DIV_16  : chỉ capture sau khi đếm đủ 16 cạnh lên ( 16 xung ). 
→ sử dụng để làm dãn thời gian VDK để dành cho công việc khác thay vì cứ update từng xung .
 + Chế độ compare :
  • CCP_COMPARE_SET_ON_MATCH  : xuất xung mức cao khi TMR1=CCPx
  • CCP_COMPARE_CLR_ON_MATCH  : xuất xung mức thấp khi TMR1=CCPx
  • CCP_COMPARE_INT : ngắt khi TMR1=CCPx
  • CCP_COMPARE_RESET_TIMER   : reset TMR1 =0 khi TMR1=CCPx 
  + Chế độ PWM :
  • CCP_PWM : bật chế độ PWM
  • CCP_PWM_PLUS_1    : không rõ chức năng
  • CCP_PWM_PLUS_2   : không rõ chức năng
  • CCP_PWM_PLUS_3   : không rõ chức năng
2 / _ Set_CCPx_duty ( value ) : 
Value : biến hay hằng , giá trị 8 hay 16 bit .
x= 0 ,1 ,2 . . . :tên chân CCPx
_Dùng set duty của xung trong chế độ PWM . Nó ghi 10 bit giá trị vào thanh ghi CCPx . Nếu value
chỉ là 8 bit, nó dịch thêm 2 để đủ 10 bit nạp vào CCPx .
_Tuỳ độ phân giải mà giá trị của value không phải lúc nào cũng đạt tới 1023 . Do đó , value = 512
không có nghĩa là duty = 50 % . 

Không có nhận xét nào:

Đăng nhận xét

Bài đăng mới nhất

Valdes Fernando - Microcontrollers Applications With Pic

Bài đăng phổ biến