第十三届蓝桥杯嵌入式备赛-STM32G431-进阶模块调试⑨PWM输入捕获

目录

0.前言

1.功能要求

电路原理图

2.STM32Cubemx初始化

TIM3详细设置

 开启TIM3中断

 TIM8详细设置

  开启TIM8中断

3.程序实现

main.c相关初始化

PWM输入捕获中断回调函数

 4.工程文件


0.前言

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

1.功能要求

使用PWM输入捕获获得PWM的频率和占空比,在这块板子上有两个555定时器,我们所要捕获的就是这两个555定时器产生PWM的频率和占空比

电路原理图

2.STM32Cubemx初始化

将PB4设置为TIM3_CH1、将PA14设置为TIM8_CH1。

TIM3详细设置

 开启TIM3中断

 TIM8详细设置

  开启TIM8中断

3.程序实现

main.c相关初始化

函数功能均在注释中

main.c中创建PWM输入捕获相关变量

/*main.c*/

uint32_t R39_Freq=0,R39_Duty=0;//定义R39的频率和周期
uint32_t R40_Freq=0,R40_Duty=0;//定义R40的频率和周期

 使能定时器中断PWM输入捕获,这里需要同时使能TIM3,TIM8的通道1和通道2

/*main.c*/

HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);//使能通道TIM3的PWM输入捕获通道1
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);//使能通道TIM3的PWM输入捕获通道2
HAL_TIM_IC_Start_IT(&htim8, TIM_CHANNEL_1);//使能通道TIM8的PWM输入捕获通道1
HAL_TIM_IC_Start_IT(&htim8, TIM_CHANNEL_2);//使能通道TIM8的PWM输入捕获通道2

PWM输入捕获中断回调函数

在tim.c中编写HAL_TIM_IC_CaptureCallback()回调函数,并在tim.h中声明

/*tim.h*/

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);

在tim.c声明外部变量并定义中间变量

/*tim.c*/

extern uint32_t R39_Freq,R39_Duty;//定义R39的频率和周期
extern uint32_t R40_Freq,R40_Duty;//定义R40的频率和周期
uint32_t R39_Freq_val=0,R39_Duty_val=0;//定义R39的频率和周期中间值
uint32_t R40_Freq_val=0,R40_Duty_val=0;//定义R40的频率和周期中间值

编写PWM输入捕获中断回调函数(详解参考注释)

/*tim.c*/

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3)//选择TIM3
	{
		
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//选择TIM3通道1
		{
			R39_Freq_val=HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);//获取周期时间
			R39_Freq=1000000/R39_Freq_val;//转换为频率
		}
		
		else if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)//选择TIM3通道2
		{
			R39_Duty_val=HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_2);//获取高电平时间
			R39_Duty=100*R39_Duty_val/R39_Freq_val;//计算占空比
		}
	}
	
	
	if(htim->Instance==TIM8)//选择TIM8
	{
		
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//选择TIM8通道1
		{
			R40_Freq_val=HAL_TIM_ReadCapturedValue(&htim8, TIM_CHANNEL_1);//获取周期时间
			R40_Freq=1000000/R40_Freq_val;//转换为频率
		}
		
		else if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)//选择TIM8通道2
		{
			R40_Duty_val=HAL_TIM_ReadCapturedValue(&htim8, TIM_CHANNEL_2);//获取高电平时间
			R40_Duty=100*R40_Duty_val/R40_Freq_val;//计算占空比
		}
	}
}

相关函数定义位置stm43g4xx_hal_tim.c中

/*stm43g4xx_hal_tim.c*/

HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel);

在Task.c中声明外部变量,就可以获取PWM输入捕获所获取的频率和周期啦!

/*Task.c*/

extern uint32_t R39_Freq,R39_Duty;//定义R39的频率和周期
extern uint32_t R40_Freq,R40_Duty;//定义R40的频率和周期

 4.工程文件

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

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

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

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别人家的孩子380

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值