• STM32F103C8T6 có 2 bộ Watchdog Timer, 1 bộ SysTick Timer, 4 bộ Timer (Timer 1,Timer 2, Timer 3, Timer 4 ) mỗi 1 bộ là 1 bộ đếmtimer 16 bit. 1 bộ Timer 1 – Advancedcontrol timer thuộc khối clock APB2. 3 bộ Timer 2,3,4 – Generalpurpose timers thuộc khối clock APB1.
Bài Lập trình ARM 3.3 Lập trình với Timer 3.4 Lập trình với điều chế độ rộng xung PWM #1 3.3 Lập trình với Timer #2 3.3.1 Giới thiệu • STM32F103C8T6 có Watchdog Timer, SysTick Timer, Timer (Timer 1,Timer 2, Timer 3, Timer ) đếm/timer 16 bit Timer – Advanced-control timer thuộc khối clock APB2 Timer 2,3,4 – General-purpose timers thuộc khối clock APB1 3.3 Lập trình với Timer 3.3.1 Giới thiệu • Tính định thời #3 3.3 Lập trình với Timer 3.3.1 Giới thiệu • Timer - Advanced-control timer (TIM1) • Tạo kênh PWM để điều khiển động pha • Tạo dead-times PWM • Có chức giống Timer thơng thường • Có thể thiết lập kênh độc lập thực chức năng: • Input capture • Output compare • Tạo xung, tạo xung PWM • Tạo yêu cầu DMA • Timer 2,3,4 - General-purpose timers (TIMx) • 16-bit auto-reload up/down counter • 16-bit prescaler • kênh độc lập: input capture/output compare • Tạo xung, tạo xung PWM • Tạo u cầu DMA • Đọc ENCODER, đọc tín hiệu từ cảm biến HALL #4 3.3 Lập trình với Timer 3.3.2 Sơ đồ khối Timer - TIM1 - Khối nguồn xung Khối đầu vào Khối PSC Khối đếm Khối Capture/Compare Khối đầu Sơ đồ khối Timer Hình 52 trang 294 Datasheet #5 3.3 Lập trình với Timer 3.3.2 Sơ đồ khối Timer – TIM2, TIM3, TIM4 - Khối nguồn xung Khối đầu vào Khối PSC Khối đếm Khối Capture/Compare Khối đầu Sơ đồ khối Timer 2,3,4 Hình 100 trang 367 Datasheet #6 3.3 Lập trình với Timer 3.3.3 Chế độ tạo xung thơng thường - Khối nguồn xung - Khối PSC - Khối đếm Nguồn xung - Nguồn xung từ bên : ETR TI1FP1, TI2FP2 - Nguồn xung từ tạo dao động hệ thống RCC - CK_INT Sơ đồ khối Timer 1,2,3,4 chế độ tạo xung #7 3.3 Lập trình với Timer 3.3.3 Chế độ tạo xung thơng thường #8 (1) Tạo xung sử dụng nguồn xung từ tạo dao động – CK_INT Cần tác động ghi - Counter register (TIMx_CNT) - Prescaler register (TIMx_PSC) - Auto-reload register (TIMx_ARR) Sơ đồ tạo xung từ tạo dao động RCC 3.3 Lập trình với Timer 3.3.3 Chế độ tạo xung thông thường (1) Tạo xung sử dụng nguồn xung từ tạo dao động – CK_INT Công thức tạo xung : (Prescaler + 1)(Period + 1) - Fout: tần số đầu (Hz) Fclk: tần số đầu vào Timer (Hz) Prescaler: giá trị nạp vào chia tần Timer (0 ÷ 65535) Period: giá trị nạp vào đếm Timer (0 ÷ 65535) #9 3.3 Lập trình với Timer 3.3.3 Chế độ tạo xung thông thường (1) Tạo xung sử dụng nguồn xung từ tạo dao động – CK_INT Ví dụ :Tạo xung Fout có tần số 1KHz, với Fclk=8MHz, Prescaler =0; (Prescaler + 1)(Period + 1) - Fout = 1000(Hz) - Fclk = 8000000(Hz) - Prescaler = - Period = (Prescaler + 1) - = 7999 #10 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (2) Tạo xung PWM sử dụng nguồn xung từ tạo dao động – CK_INT Công thức tạo độ rộng phần dương Ton : D Period+1 *100% - D: tỉ lệ xung dương so với chu kì - Ton: Chu kì xung phần dương xung PWM (Pulse) - Period: giá trị nạp đếm Timer (0 ÷ 65535) #46 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (3) Các hàm sử dụng thư viện HAL • HAL_TIM_PWM_Init • HAL_TIM_PWM_ConfigChannel • HAL_TIM_PWM_DeInit • HAL_TIM_PWM_Init • HAL_TIM_PWM_MspInit • HAL_TIM_SetCompare • HAL_TIM_PWM_MspDeInit • HAL_TIM_PWM_Start • HAL_TIM_PWM_Stop • HAL_TIM_PWM_Start_IT • HAL_TIM_PWM_Stop_IT • HAL_TIM_PWM_Start_DMA • HAL_TIM_PWM_Stop_DMA #47 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM #48 (4) Các bước lập trình tạo xung PWM Bước Thiết lập hệ thống - Thiết lập xung nhịp hệ thống : SystemClock_Config() Bước Thiết lập cho GPIO - Cho phép GPIO – AFIO tương ứng hoạt động hàm: HAL_RCC_GPIOx_CLK_ENABLE(); Bước Thiết lập thông số tạo xung PWM - Lựa chọn tần số cho Timer - Lựa chọn hệ số chia tần: Prescaler ; - Lựa chọn chế độ đếm: Counter Mode = Up; - Nạp giá trị cho ghi đếm: Counter Period - Nạp giá trị thiết lập độ rộng xung Ton: Pulse - Khởi tạo kênh PWM: HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); - Thiết lập lại độ rộng xung Ton: HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,DutyCycle); 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (5) Các bước lập trình tạo xung PWM STM CUBE B1 Cấu hình nguồn xung Timer - Timer – APB2 - Timer 2,3,4 – APB1 #49 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (5) Các bước lập trình tạo xung PWM STM CUBE B2 Cấu hình Timer - Lựa chọn Timer - Thiết lập chế độ hoạt động - Lựa chọn nguồn xung #50 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (5) Các bước lập trình tạo xung PWM STM CUBE B2 Cấu hình Timer - Lựa chọn nguồn xung từ tạo dao động - Lựa chọn kênh đầu PWM - Thiết lập Prescaler, Counter Mode, Period, Pulse #51 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (5) Các bước lập trình tạo xung PWM STM CUBE B2 Cấu hình Timer - Lựa chọn nguồn xung từ tạo dao động : Clock Source –> Internal Clock #52 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (5) Các bước lập trình tạo xung PWM STM CUBE B2 Cấu hình Timer - Lựa chọn kênh PWM: Channel –> PWM Generation CH1 #53 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (5) Các bước lập trình tạo xung PWM STM CUBE B2 Cấu hình Timer - Thiết lập Prescaler, Counter Mode, Counter Period, Pulse #54 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM #55 (5) Các bước lập trình tạo xung PWM STM CUBE Lựa chọn chân chiều vào, chiều ra, mode Thiết lập thông số STM32CubeMX hướng dẫn lập trình với GPIO Sau chọn GENERATE CODE để tạo file Code 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM #56 (5) Các bước lập trình tạo xung PWM STM CUBE – Khung chương trình Timer – PWM CH1 #include "main.h" TIM_HandleTypeDef htim1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); while (1) { HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,20); } } // Thiết lập Prescaler, CounterMode, Period, Pulse htim1.Instance = TIM1; htim1.Init.Prescaler = 799; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 99; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //**************************************// sConfigOC.Pulse = 0; 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (6) Ví dụ Ví dụ 1: Sử dụng Timer tạo xung PWM có tần số Fpwm = 1KHz kênh – PA8 với Ton= 20%Tpwm Bộ tạo dao động chế độ HSI với Fosc = 8MHz #57 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM (6) Ví dụ 𝐹𝑝𝑤𝑚 = Fclk (Prescaler + 1)(Period + 1) Ton D = Period+1 *100% Fpwm = 1KHz Ton= 20% Tpwm Fclk=Fosc = 8MHz (Prescaler+1)(Period + 1) = Fclk/Fpwm = 8000 - Thiết lập Prescaler = 7; Period = 999; D= 20 ; Ton = 200 #58 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM #59 Code ví dụ #include "main.h" TIM_HandleTypeDef htim1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); while (1) { // HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,20); } } // Thiết lập Prescaler, CounterMode, Period, Pulse htim1.Instance = TIM1; htim1.Init.Prescaler = 7; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //**************************************// sConfigOC.Pulse = 200; 3.4 Lập trình với Bộ điều chế độ rộng xung 3.4.3 Tạo xung PWM #60 Bài tập: Bài tâp Lập trình điều khiển đèn LED1 – PA8 sáng luân phiên mức tăng dần (lặp lại) xung PWM - TIM1CH1 Bài tập Sử dụng nút UP, DOWN để tăng giảm mức sáng cho led LED2 – PA9 Bài tập Sử dụng Timer 1, lập trình tạo đồng thời xung PWM có tần số 1KHz, với độ rộng Ton 10%, 30%, 70%, 90% kênh CH1, CH2, CH3, CH4 ...3.3 Lập trình với Timer #2 3.3.1 Giới thiệu • STM32F103C8T6 có Watchdog Timer, SysTick Timer, Timer (Timer 1 ,Timer 2, Timer 3, Timer ) đếm /timer 16 bit Timer – Advanced-control timer thuộc khối... • STM32F103C8T6 có Timer (Timer 1 ,Timer 2, Timer 3, Timer ) Timer tạo kênh PWM 16 bit Timer – Advanced-control timer thuộc khối clock APB2 Timer 2,3,4 – General-purpose timers thuộc khối clock... xung Timer - Timer – APB2 - Timer 2,3,4 – APB1 #30 3.3 Lập trình với Timer 3.3.4 Chế độ đếm (4) Các bước lập trình đếm xung với Timer STM CUBE B2 Thiết lập thông số cho Timer - Lựa chọn Timer