完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
摘要
本文章基于国信长天M4开发板,讲述了STM32G4 TIM定时器输出PWM,以及设置PWM的频率和占空比,祝各位学生蓝桥杯比赛取得好成绩! M4开发板 可用作PWM输出的引脚 由上图开发板引出的引脚可以看出,很多引脚都可以用作PWM输出。查阅芯片资料,可以得知部分引脚与PWM通道的对应关系如下表: TIM PWM输出的 使用步骤 下面将基于硬件原厂提供的显示屏示例代码:HAL_06_LCD 介绍ADC的使用步骤: ① 添加 stm32g4xx_hal_tim.c,stm32g4xx_hal_tim_ex.c 双击Drivers/STM32G4xx_HAL_Driver,打开添加文件对话框,在向上一级 -> Drivers -> STM32G4xx_HAL_Driver -> Src中,找到stm32g4xx_hal_tim.c 和 stm32g4xx_hal_tim_ex.c 并添加。添加后如下图所示: ② 修改 stm32g4xx_hal_conf.h 文件 在如下位置找到该文件,并打开: 取消注释 #define HAL_TIM_MODULE_ENABLED 这一行,取下注释后如下图所示: ③ main.c 添加#include "stm32g4xx_hal_tim.h" 在 main.c 适当位置添加#include "stm32g4xx_hal_tim.h",添加后如下图所示: ④ 复制如下 TIM 初始化的代码 注意:下列代码包含了TIM2_CH2的PWM输出,同学们可参考自行更改为其他TIM和通道! TIM_HandleTypeDef htim2; TIM_OC_InitTypeDef tim2_ch2_OC_Handle; static void MX_TIM2_PWM2_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 80; //预分频系数80M/80=1M htim2.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数 htim2.Init.Period = 1000; //PWM计数周期 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //时钟源1分频 htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; htim2.Init.RepetitionCounter = 0; HAL_TIM_Base_Init(&htim2); //引脚初始化,PA1用作TIM2 CH2 GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //复用推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; //复用功能 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 定时器输出PWM初始化 tim2_ch2_OC_Handle.OCMode = TIM_OCMODE_PWM1; // 模式选择PWM1 tim2_ch2_OC_Handle.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出比较极性为低 tim2_ch2_OC_Handle.OCNPolarity = TIM_OCPOLARITY_HIGH; tim2_ch2_OC_Handle.OCFastMode = TIM_OCFAST_DISABLE; tim2_ch2_OC_Handle.Pulse = 100; //PWM定占空比 HAL_TIM_PWM_ConfigChannel(&htim2, &tim2_ch2_OC_Handle, TIM_CHANNEL_2); // 配置PWM输出 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 开始PWM输出 } //设置TIM2 CH2 PWM的占空比 static void Set_TIM2_PWM2_Duty(uint32_t duty) { HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_2); tim2_ch2_OC_Handle.Pulse = duty; HAL_TIM_PWM_ConfigChannel(&htim2, &tim2_ch2_OC_Handle, TIM_CHANNEL_2); // 配置PWM输出 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); // 开始PWM输出 } //设置TIM2 CH2 PWM的周期 static void Set_TIM2_PWM2_Period(uint32_t period) { htim2.Init.Period = period; HAL_TIM_Base_Init(&htim2); } //同学们根据上文中的引脚复用表,自行思考如何使用其他定时器的其他引脚输出PWM 同学们根据上文中的引脚复用表,自行思考如何使用其他定时器的其他引脚输出PWM ⑤ 在main() 中调用 MX_TIM2_PWM2_Init(); 如下图所示,在main() 函数的适当位置调用 MX_TIM2_PWM2_Init(); ⑥ 设置PWM周期和占空比 上文中将TIM2的时钟设为了80分频,即TIM2的时钟为1MHz Set_TIM2_PWM2_Period(2000); //将周期设为2000,频率为1MHz/2000 = 500 HzSet_TIM2_PWM2_Duty(500); //将高电平时间设为500,周期为2000时,占空比=500/2000 = 25% ⑦ 运行效果图 暂无 总结 定时器PWM输出使用步骤总结如下:
|
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:08 , Processed in 1.204115 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号