前言
输入捕获的考题十分明确,就是测量输入脉冲波形的占空比和频率,对我们的板子而言,就是检测板载的两个信号发生器产生的信号:
具体来说就是使用PA15和PB4来做输入捕获。
输入捕获原理简介
输入捕获能够对输入信号的上升沿和下降沿进行捕获,并且记录下捕获时定时器的数值以及触发中断。
借用一张图来阐明这个动作:
边沿触发,产生捕获中断
中断中读取当前的计数值CCR,并且将计数值清零
退出中断
因此通过计数值可以计算出高电平持续时间,这里面有一个溢出的问题,对于我们的信号发生器来说,其信号的频率比较高,计数器不会发生溢出,因此不需要考虑。
根据功能分为两类:
普通输入捕获(只能测频率)
PWM输入模式(可以测频率和占空比)
普通输入捕获
一、CubeMX配置
以及
之后要记得打开中断:
二、Keil软件编写
开启捕获
HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
第一个参数是定时器句柄,在tim.c中定义,第二个参数是通道:
编写回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3) //判断是哪个定时器触发{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) //判断是哪个通道触发{Counter=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;//获取计数值+1Freq=1000000/Counter;//计算频率}}
}
进入回调函数后,先判断定时器类型,再判断是哪个通道,完成之后再获取计数值,并且完成频率计算。
PWM输入捕获(双通道模式)
一、CubeMX配置
类似普通单通道输入捕获,这里就是将通道2的输入通道设置为简介模式,并且在下面的配置中,将其捕获的极性设置为下降沿:
双通道的原理借用下图展示:
我们只需要看一个周期,其它周期都一样,这样一来,通道一捕获的值为整个周期的持续时间,通道二捕获的值即为高电平的持续时间,这也为咱们的程序设计提供了依据。
二、Keil软件编写
开启捕获
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);//开启CH1输入捕获中断
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);//开启CH2输入捕获中断
编写中断回调函数
//输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){T_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_1)+1;//得到周期值Freq = 1000000 / T_Count;Duty = (float)D_Count/T_Count * 100;}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){D_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_2)+1;//得到占空比} }
}
由于我们使用双通道模式,因此无论是启动操作还是回调函数,都必须要写两个通道,这样代码思路就十分明确,便于我们记忆。
总结
想要在比赛中正确地完成输入的捕获,我们需要掌握两点内容:
CubeMX配置,只能通过不断练习来记忆
Keil代码编写,主要记忆思路(启动捕获,中断回调函数编写)
对于程序的思路:
首先启动捕获中断(HAL_TIM_IC_Start();)注意双通道要写两个
其次回调函数编写(void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim))注意双通道时,一个通道测周期,一个通道测高电平持续时间。