1. Trang chủ
  2. » Tất cả

hướng dẫn thực hành bài 03

25 60 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 25
Dung lượng 3 MB
File đính kèm 01 Huong dan thuc hanh bai 03.rar (2 MB)

Nội dung

BÀI 3. LẬP TRÌNH CÁC ỨNG DỤNG SỬ DỤNG TIMER, PWM  Mục đích. Trang bị cho sinh viên các kiến thức hoạt động định thời, điều chế độ rộng xung trong vi điều khiển ARM STM32. Cách lập trình ứng dụng sử dụng Timer, PWM để thiết kế ứng dụng.  Yêu cầu. Sinh viên nắm được: Các nguyên tắc hoạt động của Timer, PWM Cách lập trình một chương trình có sử Timer chế độ tạo xung, chế độ đếm xung và tạo xung PWM.

BÀI LẬP TRÌNH CÁC ỨNG DỤNG SỬ DỤNG TIMER, PWM  Mục đích Trang bị cho sinh viên kiến thức hoạt động định thời, điều chế độ rộng xung vi điều khiển ARM STM32 Cách lập trình ứng dụng sử dụng Timer, PWM để thiết kế ứng dụng  Yêu cầu Sinh viên nắm được: - Các nguyên tắc hoạt động Timer, PWM - Cách lập trình chương trình có sử Timer chế độ tạo xung, chế độ đếm xung tạo xung PWM Nguyên tắc hoạt động Timer - Sơ đồ hoạt động chế độ định thời Hình 1.1: Sơ đồ khối Timer1 Hình 1.2: Sơ đồ khối Timer 2, 3, 1.1 Hoạt động định thời Hình 1.2: Timer1,2,3,4 chế độ định thời Hình 1.2 mơ tả hoạt động timer 1, 2, 3, chế độ định thời: Nguồn xung clock đưa tới timer từ: - Nguồn xung từ bên : ETR TI1FP1, TI2FP2 - Nguồn xung từ tạo dao động hệ thống RCC - CK_INT Nguồn xung clock nói điều khiển để đưa tới khối chia tần PSC, sau tới khối ghi đếm CNT Với chế độ định thời , giá trị lớn mà timer chứa 65535(tương ứng FFFF(H)), đếm giá trị xảy tràn đếm , xảy kiện ngắt Timer Sau xảy tràn, muốn timer tiếp tục đếm, chương trình phải có câu lệnh nạp lại giá trị khởi tạo sau dừng timer Để tạo xung định khoảng thời gian, cần nạp giá trị cho PSC CNT cách nạp giá trị cho ghi Counter register (TIMx_CNT), Prescaler register (TIMx_PSC), sử dụng công thức sau: Fclk 𝐹𝑜𝑢𝑡 = (Prescaler + 1)(Period + 1) Fout: tần số đầu (Hz) Fclk: tần số đầu vào Timer (Hz) Prescaler: giá trị nạp chia tần PSC Timer (0 ÷ 65535) Period: giá trị nạp đếm CNT Timer (0 ÷ 65535) Ví dụ : Sử dụng Timer tạo xung có tần số Fout = 1KHz Bộ tạo dao động chế độ HSI với Fclk = 8MHz + Fout = 1000(Hz) ; Fclk = 8000000(Hz) + Xác định giá trị ghi PSC = Prescaler =0; + Xác định giá trị ghi CNT=Period= Fclk (Prescaler + 1) - = 7999 - Ứng dụng hoạt động định thời: + Dùng để tạo thời gian trễ + Dùng để tạo tần số + Kết hợp với chế độ đếm kiện để đo tần số vv… 1.2 Hoạt động đếm kiện ( Counter ) - Sơ đồ hoạt động (Hình 1.1; 1.2) - Nguồn xung từ bên : ETR1 TI1FP1, TI2FP2 Hình 1.3: Các khối chức chế độ lấy nguồn xung bên - Nguyên tắc hoạt động  Xung clock lấy từ tạo xung bên qua chân ETR TI1FP1, TI2FP2  Giá trị đếm lưu ghi CNT Chú ý: Trong chế độ đếm cần thiết lập giá trị ghi PSC =0 - Ứng dụng hoạt động đếm kiện: + Dùng để đếm sản phẩm + Để đếm người qua lại + Kết hợp với chế độ định thời để đo tần số vv… 1.3 Điều chế độ rộng xung PWM Hình 1.4: Timer1chế độ tạo xung PWM Hình 1.5: Timer 2,3,4 chế độ tạo xung PWM Hình 1.4; 1.5 mơ tả hoạt động timer 1, 2, 3, chế độ định thời: Nguồn xung clock đưa tới timer từ: - Nguồn xung từ bên : ETR TI1FP1, TI2FP2 - Nguồn xung từ tạo dao động hệ thống RCC - CK_INT Nguồn xung clock nói điều khiển để đưa tới khối chia tần PSC, sau tới khối Capture/Compare, đưa xung kênh TIMx_CH1 ÷ TIMx_CH4 Với chế độ tạo xung PWM Timer tạo kênh PWM - Để tạo chu kỳ xung PWM cần nạp giá trị cho PSC CNT cách nạp giá trị cho ghi Counter register (TIMx_CNT), Prescaler register (TIMx_PSC), sử dụng công thức sau: Fclk 𝐹𝑜𝑢𝑡 = (Prescaler + 1)(Period + 1) Fout: tần số đầu (Hz) Fclk: tần số đầu vào Timer (Hz) Prescaler: giá trị nạp chia tần PSC Timer (0 ÷ 65535) Period: giá trị nạp đếm CNT Timer (0 ÷ 65535) - Tạo độ rộng xung PWM cần nạp giá trị cho ghi TIMx_CCRx, cần sử dụng công thức sau: D= - Ton 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) Ví dụ : Sử dụng Timer tạo xung PWM có tần số Fpwm = 1KHz, với Ton= 20%Tpwm Bộ tạo dao động chế độ HSI với Fosc = Fclk=8MHz + Có 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 - Ứng dụng hoạt động định thời: + Dùng điều khiển tốc độ động + Dùng điều khiển sợi đốt + Dùng điều khiển động không chổi than vv… THIẾT KẾ ỨNG DỤNG SỬ DỤNG TIMER 2.1 Ứng dụng định thời 2.1.1 Các hàm sử dụng API HAL HAL_TIM_Base_Start - Khởi động Timer HAL_TIM_Base_Start_IT - Khởi động ngắt Timer HAL_TIM_Base_Start_DMA - Khởi động DMA Timer HAL_TIM_Base_Stop - Dừng Timer HAL_TIM_Base_Stop_IT - Dừng ngắt Timer HAL_TIM_Base_Stop_DMA - Dừng DMA Timer HAL_TIM_GetCounter - Đọc giá trị ghi đếm 2.1.2 Các bước lập trình với Timer STM32CubeMX 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ố cho Timer - Lựa chọn tần số cho Timer - Lựa chọn hệ số chia tần: Prescaler - Nạp giá trị cho ghi đếm: Period - Khởi tạo Timer : HAL_TIM_Base_Start_IT(&htim1); Bước Viết chương trình phục vụ ngắt Timer Trong file "stm32f1xx_it.c“ “main.c” void TIM2_IRQHandler (void) // Ví dụ ngắt Timer { B1 Đảo chân xung cần tạo : ví dụ: PA10 HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_10); B2 Xử lý yêu cầu có ngắt: HAL_TIM_IRQHandler(&htim1); } Thiết lập STMCubeMx B1 Cấu hình nguồn xung Timer - Timer – APB2; Timer 2,3,4 – APB1 Ví dụ 1: Sử dụng Timer1 chế độ tạo tần số 1KHz chân PA.0 Sơ đồ mạch mô - 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 - Lựa chọn nguồn xung từ tạo dao động; thiết lập Prescaler, Counter Mode, Period - Lựa chọn nguồn xung từ tạo dao động : Clock Source –> Internal Clock - Thiết lập Prescaler, Counter Mode, Period B3 Thiết lập ngắt Timer - Thiết lập TIM1 update interrupts ( với Timer 1) Thiết lập TIMx global interrupt( với Timer 2,3,4)  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 - Khung chương trình với Timer #include "main.h" TIM_HandleTypeDef htim2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); HAL_TIM_Base_Start_IT(&htim2); while (1){} } void TIM2_IRQHandler(void) { HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11); HAL_TIM_IRQHandler(&htim2); } Ví dụ : Sử dụng Timer tạo xung có tần số Fout = 1KHz chân PA15 Bộ tạo dao động chế độ HSI với Fosc = 8MHz Chương trình: #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_Base_Start_IT(&htim1); while (1){} } void TIM1_UP_IRQHandler(void) { HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15); HAL_TIM_IRQHandler(&htim1); } static void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 7999; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK){Error_Handler();} sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK){ Error_Handler();} sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){ Error_Handler();} } 2.2 Ứng dụng đếm kiện 2.2.1 Các hàm sử dụng API HAL HAL_TIM_Base_Start - Khởi động Timer HAL_TIM_Base_Start_IT - Khởi động ngắt Timer HAL_TIM_Base_Start_DMA - Khởi động DMA Timer HAL_TIM_Base_Stop - Dừng Timer HAL_TIM_Base_Stop_IT - Dừng ngắt Timer HAL_TIM_Base_Stop_DMA - Dừng DMA Timer HAL_TIM_GetCounter - Hàm đọc giá trị ghi đếm HAL_TIM_SetCounter - Hàm set giá trị đếm counter 2.2.2 Các bước lập trình với Timer STM32CubeMX 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ố cho Timer - Lựa chọn tần số cho Timer - Lựa chọn chế độ hoạt động : External clock source mode - Lựa nguồn xung đầu vào : ETR1; TI1FP1; TI2FP2 - Lựa chọn sườn xung: Rising; Falling - Lựa chọn lọc – lấy mẫu: ÷ 15 - Lựa chọn hệ số chia tần: Prescaler = 0; - Lựa chọn chế độ đếm: Counter Mode = Up; - Nạp giá trị đếm tràn ghi đếm: Period - Khởi tạo Timer : HAL_TIM_Base_Start(&htim1); - Đọc giá trị đếm Timer : dem= HAL_TIM_GetCounter(&htim1); Thiết lập STMCubeMx B1 Cấu hình nguồn xung Timer - Timer – APB2; Timer 2,3,4 – APB1 Ví dụ 1: Sử dụng Timer1 chế độ tạo tần số 1KHz chân PA.0 Sơ đồ mạch mô - 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 Lựa chọn chế độ Slave Mode - External clock source mode Lựa chọn nguồn xung đầu vào: ETR1 TI1FP1; TI2FP2 B3 Cấu hình Timer - Cấu hình thơng số : Prescaler, Counter mode, Counter Period, Trigger Polarity, Trigger Filter  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 - Khung chương trình với Timer #include "main.h" TIM_HandleTypeDef htim1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int dem; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_Base_Start(&htim1); while (1) { dem= HAL_TIM_GetCounter(&htim1); } } static void MX_TIM1_Init(void) { TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 10; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) {Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING; sSlaveConfig.TriggerFilter = 15; if (HAL_TIM_SlaveConfigSynchro(&htim1, &sSlaveConfig)!=HAL_OK) {Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){ Error_Handler();} } Ví dụ : Sử dụng Timer chế độ đếm – TI1FP1 – PA8, đọc số lần nhấn nút PB1 hiển thị 01 Led kết nối hình bên Chương trình: #include "main.h" TIM_HandleTypeDef htim1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM1_Init(void); int dem; char ma_led[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; void hienthi_7seg(unsigned char data){ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8, data&0x01); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9, (data>>1)&0x01); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,(data>>2)&0x01); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11,(data>>3)&0x01); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,(data>>4)&0x01); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,(data>>5)&0x01); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,(data>>6)&0x01); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,(data>>7)&0x01); } int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); HAL_TIM_Base_Start(&htim1); while (1){ dem = HAL_TIM_GetCounter(&htim1); hienthi_7seg(ma_led[dem]); } } 2.3 Ứng dụng điều chế độ rộng xung PWM 2.3.1 Các hàm sử dụng API HAL HAL_TIM_PWM_Start - Khởi động PWM HAL_TIM_PWM_Start_IT - Khởi động ngắt PWM HAL_TIM_PWM_Start_DMA - Khởi động DMA PWM HAL_TIM_PWM_Stop - Dừng PWM HAL_TIM_PWM_Stop_IT - Dừng ngắt PWM HAL_TIM_PWM_Stop_DMA - Dừng DMA PWM HAL_TIM_PWM_ConfigChannel - Hàm cấu hình kênh PWM HAL_TIM_SetCompare - Hàm thiết lập độ rộng xung Ton 2.3.2 Các bước lập trình với Timer STM32CubeMX 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); Thiết lập STMCubeMx B1 Cấu hình nguồn xung Timer - Timer – APB2; Timer 2,3,4 – APB1 Ví dụ 1: Sử dụng Timer1 chế độ tạo tần số 1KHz chân PA.0 Sơ đồ mạch mơ - 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 - 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 - Lựa chọn kênh PWM: Channel –> PWM Generation CH1 - Thiết lập Prescaler, Counter Mode, Counter Period, Pulse  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 - Khung chương trình tạo xung PWM với Timer – Kênh #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; Ví dụ : 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 Áp dụng công thức: 𝐹𝑝𝑤𝑚 = D= Fclk (Prescaler + 1)(Period + 1) Ton Period+1 *100% Với 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 Chương trình: #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) { } } static void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; 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; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 200; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();} sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){Error_Handler();} HAL_TIM_MspPostInit(&htim1); } BÀI TẬP Bài tập Sử dụng ngắt Timer1, lập trình điều khiển LED sáng nhấp nháy với tần số 5Hz; sau giây led nhấp nháy với tần số 1Hz Với Fosc=8MHz Bài tập Sử dụng ngắt Timer3, lập trình điều khiển LED sáng nhấp nháy với tần số 1Hz (0,5s sáng; 0,5s tắt) nhấn DOWN led sáng nhấp nháy 5Hz; nhấn UP led sáng nhấp nháy 1Hz Với Fosc=8MHz Bài tập Sử dụng ngắt Timer1 Timer 3, lập trình tạo đồng thời xung: Timer tạo xung có tần số 2KHz chân PB0; Timer tạo xung có tần số 4KHz chân PB1 Với Fosc=8MHz Bài tập Sử dụng Timer chế độ đếm – ETR1 – PA12, đọc số lần nhấn nút PB1(PA12) hiển thị giá trị 01 Led Khi bắt đầu bật nguồn Led hiển thị số Bài tập Sử dụng Timer chế độ đếm – TI1FP1 – PA6, đọc số lần nhấn nút PB1(PA6) hiển thị giá trị 02 Led Khi bắt đầu bật nguồn Led hiển thị số 12 Bài tập Sử dụng Timer chế độ đếm – TI2FP2 – PA7, đọc số lần nhấn nút PB1(PA7) hiển thị giá trị LCD 16x2 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 Với Fosc=8MHz Bài tâp Sử dụng nút UP, DOWN để tăng giảm 10 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ố 5KHz, với độ rộng Ton1 10% kênh CH1; Ton2 30% kênh CH2; Ton3 70% kênh CH3; Ton4 90% kênh CH4 Với Fosc=8MHz Bài tập 10 Sử dụng Timer chế độ đếm xung, Timer chế độ tạo xung (định thời gian 1s), thiết kế đo tần số hiển thị giá trị LCD 16x2 DCLOCK RS RW E D0 D1 D2 D3 D4 D5 D6 D7 10 11 12 13 14 VSS VDD VEE LM016L CLK CE RST LCD1 U1 10 11 12 13 14 15 16 17 29 30 31 32 33 34 37 38 18 19 20 39 40 41 42 43 45 46 21 22 25 26 27 28 PA0-WKUP PA1 PA2 PA3 PA4 PA5 PA6 PA7 PA8 PA9 PA10 PA11 PA12 PA13 PA14 PA15 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PB8 PB9 PB10 PB11 PB12 PB13 PB14 PB15 NRST PC13_RTC PC14-OSC32_IN PC15-OSC32_OUT STM32F103C6 OSCIN_PD0 OSCOUT_PD1 VBAT BOOT0 44 ... HAL_TIM_MspPostInit(&htim1); } BÀI TẬP Bài tập Sử dụng ngắt Timer1, lập trình điều khiển LED sáng nhấp nháy với tần số 5Hz; sau giây led nhấp nháy với tần số 1Hz Với Fosc=8MHz Bài tập Sử dụng ngắt Timer3,... 16x2 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 Với Fosc=8MHz Bài tâp Sử dụng nút UP, DOWN để tăng giảm 10 mức sáng cho led LED2 – PA9 Bài. .. Counter Period, Pulse  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 - Khung chương trình tạo xung

Ngày đăng: 03/01/2023, 17:53

TỪ KHÓA LIÊN QUAN

w