第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑩频率占空比可调的PWM输出

目录

0.前言

1.功能要求

电路原理图

2.STM32Cubemx初始化

引脚设置

TIM2详细设置

TIM16详细设置

TIM17详细设置

3.程序实现

main.c相关初始化

TIM_Frep_Set() 

4.工程文件


0.前言

这套教程针对于蓝桥杯嵌入式比赛的底层模块调试,针对于比赛进行每个模块的调试,低层模块调试好,对于赛题的实现就会方便很多,虽然有一些应试教育的意味,不过准备这个比赛对于程序整体实现思维还是有着很大帮助,我也从中受益颇多!

1.功能要求

使用STM32G431输出占空比频率可调的PWM波

电路原理图

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑩频率占空比可调的PWM输出_第1张图片

2.STM32Cubemx初始化

引脚设置

将PA1设置为TIM2_CH2、PA2设置为TIM2_CH3、PA6设置为TIM16_CH1、PA7设置为TIM17_CH1

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑩频率占空比可调的PWM输出_第2张图片

TIM2详细设置

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑩频率占空比可调的PWM输出_第3张图片

TIM16详细设置

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑩频率占空比可调的PWM输出_第4张图片

TIM17详细设置

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑩频率占空比可调的PWM输出_第5张图片

3.程序实现

main.c相关初始化

函数功能均在注释中

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_Frep_Set() 

在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__);

到这里低层模块就已经全部调整好啦!!

4.工程文件

该工程文件为全10讲所有内容,可以作为参考,不过还是希望读者能够自己手敲一遍,加深记忆

链接:https://pan.baidu.com/s/1LcNszc7_oHWvXcucCezlxg?pwd=hw07 
提取码:hw07

第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑩频率占空比可调的PWM输出_第6张图片

 自己做的笔记,也希望能对你有帮助! 

你可能感兴趣的:(蓝桥杯,嵌入式硬件,stm32,单片机)