Học MSP430 với Kit MSP430 LaunchPad
Bài 4: Timer/Counter
Timer/Counter : có chức năng đếm xung nhịp (Clock) , mỗi khi có một xung nhịp tại đầu vào thì giá trị của bộ đếm tăng lên 1 hay giảm đi 1 (tùy vào chế độ đếm lên hay đếm xuống).
Xung nhịp của bộ đếm có thể lấy từ bên trong hoặc lấy từ bên ngoài MCU.
- Xung nhịp lấy từ bên trong MCU có đặc điểm đều đặn do đó ta có thể dùng đếm thời gian tương đối chính xác
- Xung nhịp lấy từ bên ngoài : sự thay đổi mức logic tạo ra các xung nhịp , không nhất thiết phải đều đặn , ví dụ xung đếm sản phẩm , đếm xe . thường hay sử dụng đếm các sự kiện bên ngoài.
- Chúng ta quy ước bộ Timer/Counter gọi chung Timer
Sự kiện tràn (Over flow): sự kiện bộ đếm đếm đến ngưỡng tối đa và quay trở lại giá trị 0. Ví dụ với Timer 8 bits thì giá trị đếm tối đa của nó là 255 = 2^8 – 1 hoặc với Timer 16 bits thì giá trị đếm tối đa là 65535 = 2^16 - 1
Timer của MSP430G2553 :
- Timer 16bits.
- 4 chế độ hoạt động : Stop mode , Up mode , Up/Down mode , Continous Mode.
- Có chế độ đầu ra PWM (Pulse width Modulation )
Các chế độ hoạt động của Timer
Các chế độ hoạt động của Timer
- MC_0 : Stop Mode , Timer không hoạt động
- MC_1 : Up Mode, Timer đếm lặp đi lặp lại từ 0 > CCR0
- MC_2 : Continuous, Timer đếm lặp đi lặp lại từ 0 > 0xFFFF (65535) giá trị Max Timer
- MC_3 : Up/Down , Timer đếm lặp đi lặp lại từ 0 > CCR0 rồi CCR0 à0
Chú ý:
- Timer là ngoại vi , hoạt động độc lập với CPU với tần số khác nhau
- Vậy làm thế nào biết Timer đếm tràn ? Chúng ta dựa vào ngắt Timer
- Tín hiệu ngắt của Timer xảy ra khi: Timer chạy và bộ đếm của Timer về 0
Bài thực hành số 1: sử dụng timer ở các chế độ
- Continuous Mode : Bộ đếm Timer đếm từ 0 à 0xFFFF . Đảo trạng thái của Led sau mỗi lần Timer đếm tràn
TA0CTL : thanh ghi điều khiển TimerA0
Chọn Clock của Timer là DCO 1Mhz à Clock Timer là 1Mhz à chu kỳ đếm của Timer là 1us (hay sau 1us thì bộ đếm Timer tăng lên 1)
Khi Timer đến tràn về ‘0’ thì thanh ghi TAIV = 10 , vì thế trong trình phục vụ ngắt của Timer có lệnh Switch(TAIV){} để xem chính xác có phải do ngắt tràn Timer gây ra ngắt hay không .
Do chúng ta chọn Timer hoạt động ở chế độ Continuous Mode : đếm 0 à 65535 , vậy Timer sẽ tràn sau ( 65535 * 1us ) ~ 65ms , cũng chính là thời gian Led đảo trạng thái. Các bạn có thể dùng máy đo tần số để kiểm tra
Chú ý :
Trong chế độ này không thay đổi được chu kỳ đếm (ngắt) của Timer
Cờ ngắt Timer sẽ tự động xóa
- Up Mode và Up/Down Mode :
Các bạn thay đổi trong hàm Configure_Timer();
Thêm dòng lệnh
TA0CCR0 = 50000; // Đặt giá trị cho bộ đếm Timer , có thể thay đổi
// Do là thanh ghi 16bits , nên giá trị đặt <= 65535
Thay đổi dòng lệnh
TA0CTL |= TASSEL_2 + MC_2 + TAIE;
Thành
TA0CTL |= TASSEL_2 + MC_1 + TAIE; // nếu chế độ Up Mode
Hoặc
TA0CTL |= TASSEL_2 + MC_3 + TAIE; // nếu muốn dùng Up/Down Mode
Bài thực hành số 2: Điều chế độ rộng xung (PWM)
Phương pháp điều chế độ rộng xung PWM
Điều chế độ rộng xung : dựa vào thay đổi độ rộng xung vuông dẫn đến sự thay đổi điện áp ra
Trong dòng MSP430 không có bộ PWM cứng , để tạo ra xung PWM phương pháp đưa ra là dùng bộ Timer ở chế độ đầu ra của nó ở hai chế độ Up Mode hoặc Up/Down Mode
Trong phần này : Tạo xung PWM dùng Timer ở chế độ Up Mode (Còn chế độ Up/Down các bạn tự tìm hiểu nhé)
Trước tiên chúng ta đi tìm hiểu hoạt động các chế độ đầu ra của Timer (Up Mode)
Trong chế độ Up Mode : Bộ đếm Timer đếm từ ‘0’ đến CCR0 (liên tục)
Khi cấu hình đầu ra cho Timer (xuất tín hiệu ra chân Output ) , thì cần thêm thanh ghi CCR1 để so sánh giá trị và đưa tín hiệu ra ngoài
Có 7 chế độ đầu ra : ở đây mình trình bày cụ thể chế độ đầu ra : Output Mode 7 : Reset/Set:
- Timer đếm liên tục từ 0 à CCR0 ,nếu giá trị trong bộ đếm Timer bằng giá trị trong thanh ghi CCR1 thì đầu ra sẽ bị Reset (đưa về mức logic ‘0’)
- Khi Timer bắt đầu đếm thì đầu ra sẽ được Set (đưa về mức logic ‘1’)
>> Trong khoảng thời gian Timer đếm từ 0 đến CCR1 : thì đầu ra sẽ ở mức cao , khoảng thời gian còn lại ở mức thấp
>> Nếu ta giữ CCR0 không đổi , và thay đổi CCR1 thì tín hiệu xung đầu rat hay đổi tương ứng CCR1 – đây chính là bản chất PWM
Bây giờ chúng ta đi thực hành thay đổi độ sáng của Led dùng PWM
Bài tập thực hành phần Timer :
Nhấp nháy Led đỏ với chu kỳ 2s (sáng 1s , tắt 1s) ,
Gợi ý dùng Timer tạo trễ 1s , dùng 1 trong 2 chế độ Up Mode hoặc Up/Down Mode
Bài tập thực hành phần PWM:
Điều khiển Led P1.6 sáng dần
Gợi ý : chỉ cần thay đổi CCR1
Dưới đây là chuỗi các bài học MSP430:
Chúc các bạn thành công! Hẹn gặp lại các bạn trong các bài học tiếp theo.
http://mlab.vn/ (Phạm Xuân Lập - MLab)