蓝桥杯嵌入式(G4系列):定时器捕获

前言:

        定时器的三大功能还剩下最后一个捕获,而这在蓝桥杯嵌入式开发板上也有555定时器可以作为信号发生器供定时器来测量。

原理图部分:

        

 

         开发板上集成了两个555定时器,一个通过跳线帽跟PA15相连,最终接到了旋钮R40上,另一个接到了旋钮R39上。了解了这些,我们下一步到STM32Cubemx上配置就有数了。

STM32Cubemx配置:

        我个人是将PA15设定为了TIM2_CH1

         PB4设定为了TIM16_CH1

         接下来,我们进入TIM2和TIM16的配置界面,配置对应的通道

        然后我们再配置一下响应的参数,分频系数我们设置为79,重装载值,我们就不需要改了

         然后我们再打开中断

         接下来,我们对PB4进行配置,点击TIM16

         设置分频系数和使能中断

 

 代码部分:

        在原有的interrupt.c文件里面,我们新增加一个回调函数HAL_TIM_IC_CaptureCallback,这个回调函数在stm32g4xx_hal_tim.h的2550行的位置,如果大家记不住的话,可以去看一下

         然后,我们可以重新书写回调函数的代码了

unsigned int ccr1_val1 = 0,ccr1_val2 = 0;
unsigned int frq1 = 0,frq2 = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)		//中断回调函数
{
	if(htim->Instance == TIM2)	//PA15
	{
		ccr1_val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
		__HAL_TIM_SetCounter(htim,0);			//读完之后,将计时值清零
		frq1 = (80000000/80)/ccr1_val1;			//计算频率
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
	}
	if(htim->Instance == TIM16)	//PB4
	{
		ccr1_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
		__HAL_TIM_SetCounter(htim,0);			//读完之后,将计时值清零
		frq2 = (80000000/80)/ccr1_val2;			//计算频率
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
	}
	
}

         而在回调函数中有HAL_TIM_ReadCapturedValue函数,这个大家如果记不住的话,在stm32g4xx_hal_tim.h的2537行的位置。

        以及HAL_TIM_IC_Start函数,在stm32g4xx_hal_tim.h的2444行的位置。

        然后在main.c里面开启定时器中断

HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);	//开启定时器,R39 -> PB4
HAL_TIM_IC_Start_IT(&htim16,TIM_CHANNEL_1);	//开启定时器,R40 -> PA15

        这就是最终的一个效果 

 补发:

        采用杜邦线将PA7和PB4相连,将PA6与PA15相连,就可以测量一下上一篇博客定时器输出可调PWM 中提到的PWM频率,如图所示

         这里,我们甚至还可以进一步测量其占空比。通过一个定时器通道去测量整个周期的时间,再用一个定时器的通道去测量高电平持续的时间,其中,高电平持续的时间可以通过检测下变沿来得出。

        接下来,我们进入到STM32Cubemx中去配置一下参数,因为我们的TIM16定时器只有一个通道,所以这里,我们只能用TIM2来做一下占空比测量

        选择一个通道,设定为间接模式

         将间接模式的通道的触发方式设定为下降沿触发

  

        点击生成代码

        我们再进入一下中断回调函数,增加几句代码,在main.c里面只需要声明几个变量即可,不需要额外开启第二通道的函数。

float ccrl_val1a,ccrl_val1b = 0;
unsigned int frq1 = 0,frq2 = 0;
float duty1,duty2 = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)		//中断回调函数
{
	if(htim->Instance == TIM2)	//PA15
	{
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//中断消息来源,选择直接输入通道
		{
			ccrl_val1a = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);	//直接	
			ccrl_val1b = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);	//间接
			__HAL_TIM_SetCounter(htim,0);		    //计数值清零
			frq1 = (80000000/80)/ccrl_val1a;		//计算频率
			duty1 = (ccrl_val1b/ccrl_val1a) * 100;  //计算占空比
			HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);	//重新开启定时器通道一
			HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);	//重新开启定时器通道二
		}
	}
	if(htim->Instance == TIM16)	//PB4
	{
		ccr1_val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
		__HAL_TIM_SetCounter(htim,0);			//读完之后,将计时值清零
		frq2 = (80000000/80)/ccr1_val2;			//计算频率
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
	}
	
}

        最终效果如下:

如果没有读取到占空比是0怎么办:

        我是因为没有把ccrl_val1a,ccrl_val1b 这两个变量设置为float类型,导致读取占空比的时候,我一直都读取不到,这里记录一下,给大家提个醒

  • 21
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 抱歉,我不清楚您的问题上下文是什么,因此无法为您提供有关“hal_tim_readcapturedvalue”的回答。但是,通常情况下,该函数是针对STM32芯片中的定时器模块进行编程的,用于读取定时器捕获寄存器的值。如果您能提供更多信息,我可以更好地帮助您。 ### 回答2: hal_tim_readcapturedvalue是基于HAL库的函数,用于读取定时器的捕捉值。 首先,需要了解什么是定时器捕捉。定时器捕捉是指在定时器计数器计数过程中,通过外部输入捕获一个信号引脚的电平变化,记录此时计数器的值。通过捕捉到的定时器计数器值,可以计算出外部信号的持续时间或周期。 在使用定时器捕捉功能时,通过hal_tim_readcapturedvalue函数可以读取捕捉到的定时器计数器值,从而进行后续的数据计算和处理。该函数需要传入一个TIM_HandleTypeDef类型的结构体指针作为参数,在函数内部会通过结构体指针获取该定时器的相关参数和计数器值,并将其返回给调用者。 使用该函数需要注意的是,定时器捕捉功能必须在定时器初始化的时候进行配置,包括捕捉模式、触发源和相关参数等。此外,在使用该函数前需要先启动定时器计数器,否则无法捕捉到有效的信号。同时,由于定时器捕捉功能一般用于计算信号持续时间或周期,因此需要借助其他方式对定时器计数器进行溢出的处理,以保证计算结果的准确性。 总之,hal_tim_readcapturedvalue是HAL库中用于读取定时器捕捉值的函数,可以实现对外部信号的捕捉和后续数据处理。在使用该函数时需要注意定时器捕捉功能的相关配置和处理。 ### 回答3: hal_tim_readcapturedvalue是一个函数,它的作用是读取定时器捕获寄存器的值。这个函数通常被用于测量定时器的时间间隔或脉冲信号的频率。 在使用hal_tim_readcapturedvalue函数之前,需要先对定时器进行初始化,并配置好定时器捕获通道。通常可以使用HAL库里面的函数进行初始化。 在读取定时器捕获值之前,需要先触发定时器捕获事件。如果要测量时间间隔,可以在事件触发后再次触发定时器来获取第二个捕获值。 读取捕获值之后,可以根据定时器的配置计算出时间间隔或脉冲信号的频率。如果使用的是32位定时器,则可以直接计算差值,否则需要对溢出进行处理。 在使用hal_tim_readcapturedvalue时需要注意的是,定时器捕获值是存储在寄存器中的,因此需要保证读取的时机正确,并且在读取之后需要对寄存器进行清零或重置,以避免下一次读取出现问题。 总之,hal_tim_readcapturedvalue是一个非常重要的函数,它可以帮助我们在嵌入式系统中进行精确的时间测量和脉冲信号的处理,对于很多实时控制系统来说都是必不可少的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值