目录
0.前言
1.功能要求
电路原理图
2.STM32Cubemx初始化
引脚设置
TIM2详细设置
TIM16详细设置
TIM17详细设置
3.程序实现
main.c相关初始化
TIM_Frep_Set()
4.工程文件
这套教程针对于蓝桥杯嵌入式比赛的底层模块调试,针对于比赛进行每个模块的调试,低层模块调试好,对于赛题的实现就会方便很多,虽然有一些应试教育的意味,不过准备这个比赛对于程序整体实现思维还是有着很大帮助,我也从中受益颇多!
使用STM32G431输出占空比频率可调的PWM波
将PA1设置为TIM2_CH2、PA2设置为TIM2_CH3、PA6设置为TIM16_CH1、PA7设置为TIM17_CH1
函数功能均在注释中
main.c中创建PWM输出相关变量
/*main.c*/
/*按需使用自行修改main.c*/
uint16_t PA1_tt=0 ,PA2_tt=0 ,PA6_tt=0 ,PA7_tt=0 ;//PWM输出计时标志位
uint16_t PA1_Ref=0,PA2_Ref=0,PA6_Ref=0,PA7_Ref=0;//PWM输出标志位
uint32_t PA1_Freq=2000,PA1_Duty=10;//定义PA1输出PWM的频率和周期
uint32_t PA2_Freq=2000,PA2_Duty=30;//定义PA2输出PWM的频率和周期
uint32_t PA6_Freq=4000,PA6_Duty=50;//定义PA6输出PWM的频率和周期
uint32_t PA7_Freq=5000,PA7_Duty=80;//定义PA7输出PWM的频率和周期
PWM初始化(main()函数中)
/*main.c*/
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); //开启TIM2通道2的PWM
__HAL_TIM_CLEAR_IT(&htim2, TIM_CHANNEL_2);//清除TIM2通道2的中断标志位
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); //开启TIM2通道3的PWM
__HAL_TIM_CLEAR_IT(&htim2, TIM_CHANNEL_3);//清除TIM2通道3的中断标志位
HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1); //开启TIM16通道1的PWM
__HAL_TIM_CLEAR_IT(&htim16, TIM_CHANNEL_1);//清除TIM16通道1的中断标志位
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1); //开启TIM17通道1的PWM
__HAL_TIM_CLEAR_IT(&htim17, TIM_CHANNEL_1);//清除TIM17通道1的中断标志位
设置PWM的频率和占空比,因为PA1和PA2是同属于TIM2,所以他们的频率是相同的。TIM_Frep_Set()函数会在后面说到
该部分内容也可以整合到主循环中,设置Task.c时间,实现可控的PWM频率占空比设置,这是大家可以尝试一下自行实现,前方变量已经创建好,请自行实践。
/*main.c*/
TIM2_Frep_Set(1000000/(PA1_Freq-1));//设置TIM3(PA1/PA2)输出频率
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 10000*PA1_Duty/(PA1_Freq));//设置PA1占空比
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 10000*PA2_Duty/(PA1_Freq));//设置PA2占空比
TIM16_Frep_Set(1000000/(PA6_Freq-1));//设置TIM16(PA6)输出频率
__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, 10000*PA6_Duty/(PA6_Freq));//设置PA6占空比
TIM17_Frep_Set(1000000/(PA7_Freq-1)); //设置TIM17(PA7)输出频率
__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, 10000*PA7_Duty/(PA7_Freq));//设置PA7占空比
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3);//停止TIM2通道3的PWM输出
在tim.c中编写各个定时器的TIM_Frep_Set()函数,并在tim.h中声明
/*tim.h*/
void TIM2_Frep_Set(uint32_t Frep);
void TIM16_Frep_Set(uint32_t Frep);
void TIM17_Frep_Set(uint32_t Frep);
编写各个定时器TIM_Frep_Set(),该函数中引用的函数均可在上方的定时器初始化函数中找到
/*tim.c*/
void TIM2_Frep_Set(uint32_t Frep)
{
htim2.Init.Period = Frep;//修改计数值
HAL_TIM_Base_Init(&htim2);//对TIM2重新初始化
}
void TIM16_Frep_Set(uint32_t Frep)
{
htim16.Init.Period = Frep;//修改计数值
HAL_TIM_Base_Init(&htim16);//对TIM16重新初始化
}
void TIM17_Frep_Set(uint32_t Frep)
{
htim17.Init.Period = Frep;//修改计数值
HAL_TIM_Base_Init(&htim17);//对TIM17重新初始化
}
相关函数定义位置stm43g4xx_hal_tim.c、stm43g4xx_hal_tim.h中
/*stm43g4xx_hal_tim.c*/
HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
/*stm43g4xx_hal_tim.h*/
__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__);
__HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__);
到这里低层模块就已经全部调整好啦!!
该工程文件为全10讲所有内容,可以作为参考,不过还是希望读者能够自己手敲一遍,加深记忆
链接:https://pan.baidu.com/s/1LcNszc7_oHWvXcucCezlxg?pwd=hw07
提取码:hw07
自己做的笔记,也希望能对你有帮助!