[VI ĐIỀU KHIỂN PIC] - BÀI 12: ĐỌC XUNG BẰNG NGẮT CỦA PIC TRONG CCS - Đo tốc độ (số xung Encoder trong 1s) dùng PIC17F877A + CCS - BeeLab

Sunday, June 18, 2017

[VI ĐIỀU KHIỂN PIC] - BÀI 12: ĐỌC XUNG BẰNG NGẮT CỦA PIC TRONG CCS - Đo tốc độ (số xung Encoder trong 1s) dùng PIC17F877A + CCS


Đo số xung của tín hiệu trong thời gian lấy mẫu 1s.
Với phương pháp này, số xung của tín hiệu đếm được trong 1s chính là tần số của tín hiệu. Để thực hiện phương pháp đo này cùng những tài nguyên của PIC 16F877A, mình sẽ giới thiệu với các bạn 2 cách thực hiện:
- Sử dụng 1 bộ Timers và 1 ngắt ngoài: trong đó, bộ Timer dùng để tạo thời gian mẫu 1s, ngắt ngoài để đếm số xung của tín hiệu.
- Sử dụng 2 bộ Timers: trong đó, 1 bộ Timer dùng để tạo thời gian lấy mẫu 1s, 1 bộ Timer được sử dụng như chức năng đếm sự kiện.
Ưu điểm của phương pháp này là đo được tần số tín hiệu lớn, đến đây bài toán đo tốc độ động cơ sử dụng Encoder đã được giải quyết.
Trong bài viết này, tôi sẽ hướng dẫn các bạn sử dụng 1 bộ Timer và 1 ngắt ngoài để đo tần số (cách sử dụng 2 bộ Timer các bạn có thể về tìm hiểu thêm). Cụ thể là bộ Timer 1Ngắt ngoài trên chân RB0.
Khi có một sự thay đổi mức tín hiệu (từ cao à thấp, thấp à cao) trên chân RB0 sẽ làm tăng giá trị của biến đếm so_xung. Khi Timer1 đếm đủ 1s, mình chỉ cần lưu lại giá trị của biến đếm và hiển thị lên LCD1602.

Dưới đây mình sẽ giới thiệu các hàm xử lý cho Timer và ngắt mà trình biên dịch CCS hỗ trợ:
TIMER1:
ØSetup_timer_1(mode): cấu hình tần số hoạt động cho bộ Timer1.
ØSet_timer1(value): cấu hình giá trị cho thanh ghi đếm của bộ Timer1.
ØGet_timer1(): Hàm trả về giá trị của thanh ghi đếm của bộ Timer1.
INTERRUPTS:
Các bạn có thể vào View à Valid Interrupts sau đó chọn PIC 16F877A để biết được các ngắt mà 16F877A có. Trong đó, ngắt ngoài là #INT_EXT, ngắt tràn Timer 1 là #INT_TIMER1. Các hàm xử lý liên quan đến ngắt:

- Chỉ thị 
#INT_EXT
sau chỉ thị này sẽ là chương trình con phục vụ khi xảy ra ngắt ngoài (tương tự với #INT_TIMER1: sau chỉ thị là chương trình phục vụ ngắt tràn TIMER1).
- Cho phép ngắt hoạt động:
Enable_interrupts(tên ngắt)
-Không cho phép ngắt hoạt động
Disable_interrupts(tên ngắt)

- Lựa chọn dạng xung tín hiệu tạo ra ngắt ngoài trên chân RB0/INT
Ext_int_edge(mode)
mode ở đây có thể là: 
H_TO_L (cạnh xuống)L_TO_H (cạnh lên)

Bài tập: Lập trình đo tần số xung/giây cấp vào chân INT dùng ngắt ngoài và Timer0 kết nối như hình.

Link code