Học MSP430 với Kit MSP430 LaunchPad - Bài 4: Timer/Counter

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:

Bài 1: Project đầu tiên

Bài 2: GPIO và Clock (Phần 1)

Bài 2: GPIO và Clock (Phần 2)

Bài 3: Ngắt ( Interrupt )

Bài 4: Timer/Counter

Bài 5: UART

Bài 6: ADC

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)

Viết đánh giá

Họ và tên:


Đánh giá của bạn: Lưu ý: Không hỗ trợ HTML!

Bình chọn: Dở            Hay

Nhập mã bảo vệ: