Timer với STM32

0
188

I. Giới thiệu về Timer:

Có thể hiểu 1 cách đơn giản: timer là 1 mạch digital logic có vai trò đếm mỗi chu kỳ clock (đếm lên hoặc đếm xuống).

Dưới đây là 1 bộ timer 16 bit cơ bản, nó có thể đếm từ 0 -> 65535 (216-1). Mỗi chu kỳ clock, giá trị của bộ đếm được tăng thêm 1. Và như các bạn có thể thấy, tần số của timer ftimer = tần số APB của timer / (Prescaler+1) (fAPBx / (PSC+1)).

Vì khi PSC = 0 nghĩa là hệ số chia 1:1.

Timer còn có thể hoạt động ở chế độ counter, nó sẽ nhận xung clock từ các tín hiệu ngoài. Có thể là từ 1 nút nhấn, bộ đếm sẽ được tăng sau mỗi lần bấm nút (sườn lên hoặc sườn xuống tùy vào cấu hình). Như các bạn có thể thấy, ở chế độ này tín hiệu của xung clock sẽ được điều khiển bằng nút nhấn và đồng thời PSC = 1 (bấm bao nhiêu thì đếm bấy nhiêu).

Ngoài ra còn các chế độ khác (ở đây mình chỉ liệt kê, sau này sẽ có bài viết riêng về các chế độ này):

·        PWM Mode

·        Advanced PWM Mode

·        Output Compare Mode

·        One-Pulse Mode

·        Input Capture Mode

·        Encoder Mode

·        Timer Gate Mode

·        Timer DMA Burst Mode

·        IRTIM Infrared Mode

Dưới đây là sơ đồ khối timer của STM32f103C8T6.

Bao gồm 1 bộ đếm auto-reaload 16 bit. Có thể hoạt động ở các mode: timer, counter, PWM, input capture, output compare…

II. Giải thích các hàm mới dùng trong chương trình:

   HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)

·        Start timer ở chế độ mặc định

Tham số:

·        htim: trỏ đến timer được start (htim1 -> htim4).

   void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

·       Khi timer tràn, chương trình sẽ chạy các câu lệnh trong hàm này

Tham số:

·       htim: trỏ đến timer sinh ra ngắt (htim1 -> htim4).

   HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)

·        Start timer ở chế độ ngắt

Tham số:

·        htim: trỏ đến timer được start (htim1 -> htim4).



 III. Lập trình timer trên STM32:

Ở phần này ta sẽ lấy 2 ví dụ về mode counter và timer để nháy led.

1.     Ngắt Timer:

Bước 1: Khởi tạo project với cubeMx: Cấu hình clock, debug mode,.. như những phần trước.

Bước 2: Cấu hình timer (sử dụng timer 2)

·       Clock suorce: chọn Internal clock.

·       Prescaler: 35999

·       Counter Period: 1999

*Giải thích: Vì tần số của bộ APBx là 72Mhz, Prescaler là hệ số chia, từ đó ta có được tần số của timer là 72Mhz/(3599+1) = 20Khz. Counter Period là giá trị đếm max, khi đếm hơn giá trị này thì sẽ bị tràn -> kích hoạt ngắt. Counter Period = 19999: đếm từ 0 -> 19999, khi đếm lên 20000 thì tràn, vậy chu kỳ tràn là 20000*(1/20Khz) = 1s.

·       Vào NVIC để kích hoạt ngắt và set mức ưu tiên ngắt = 2.

Bước 3: Cấu hình các chân GPIO để nháy led. (sử dụng 1 led và 1 trở 330ohm đấu nối theo sơ đồ sau)

·       Chân katot của led nối vào chân PB0

·       Cấu hình chân theo như ảnh dưới.

Bước 4: Đặt tên project và GEN code.

Lập trình trên Keil C:

Cách 1: Dùng ngắt timer sau mỗi 1 giây.

Bước 1: Sử dụng HAL_TIM_Base_IT() để Khởi tạo ngắt Timer2.

int main(void)
{
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_TIM2_Init();
 MX_TIM1_Init();
 HAL_TIM_Base_Start_IT(&htim2);
 while (1)
 {
 }

}

Bước 2: Cho nháy led trong hàm HAL_TIM_PeriodElapsedCallback().

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 if(htim->Instance == htim2.Instance)
 {
   HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
 }
}

Bước 3: nạp chương trình và chạy.

Cách 2: tạo hàm delay sử dụng timer.

Bước 1: tạo hàm delay 1ms.

void delay_1ms(void)
{
 __HAL_TIM_SetCounter(&htim2, 0);
 while (__HAL_TIM_GetCounter(&htim2)<20);
}

Bước 2: tạo hàm delay x ms.

void delay_ms(int time)
{
 int i = 0;
 for(i = 0; i < time; i++)
 {
   delay_1ms();
 }
}

Bước 3: Khởi động timer và cho nháy led.

int main(void)
{
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_TIM2_Init();
 MX_TIM1_Init();
 HAL_TIM_Base_Start(&htim2);
 while (1)
 {
   HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
   delay_ms(1000);
 }
}

Bước 4: nạp Code và theo dõi kết quả



LEAVE A REPLY

Please enter your comment!
Please enter your name here