蓝桥杯STM32G431RBT6学习——定时器输入捕获
前言
从省赛的题目来看,对于定时器输入捕获这块几乎不考,但是为了知识的完整性及避免万一,依旧有了解的必要。国信长天开发板上的定时器捕获主要针对于NE555波形发生器的方波进行频率、脉宽等测量计算,其硬件接口如下:
其中PA15可以复用为定时器2的通道一及定时器8的通道一,PB4可以复用为定时器3的通道一及定时器16的通道一,可以看情况选择对应的定时器进行配置。
输入捕获测量原理
所谓输入捕获,其实就是把定时器对应通道配置为捕获模式,会对外部向GPIO输入的脉冲信号进行特定边沿捕获,如:上升沿、下降沿等,当定时器的通道捕获到这些信号时,会产生一个特定的事件,我们可以通过该事件实现不同的处理。
一、频率测量:
所谓频率,其实就是周期的倒数,可以通过测量两个上升沿之间的时间t(即一个周期的时间),再对其取倒数就是频率
因为定时器每一次捕获到上升沿都会对计数值进行清空,因此除去第一次测量,后面的每一次得到的计数值即为时间t,通过定时器配置的预分频数(x)与时钟频率(F)得到其计数频率(f)。
计数频率(f=F/x)* 1/计数值(t)= 频率
二、脉宽测量:
脉宽测量方法与频率测量原理基本一致,以测量高电平脉宽为例:设定定时器初始捕获为上升沿捕获,触发中断后清空计数并将定时器设置为下降沿捕获,当下降沿捕获触发中断时获取其计数值即可计算出脉宽。
脉宽=1/计数频率(f)*计数值(t)
STM32CubeMX配置
将对应引脚设置为定时器相关通道后,对定时器进行配置,主要配置其分频系数及捕获边沿即可。
Keil代码编写
定时器捕获相关API如下:
定时器捕获启动及暂停
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
参数1:定时器编号(句柄),由CubeMX生成文件定义;
参数2:使用的定时器通道编号(例:TIM_CHANNEL_1)
定时器捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
设置计数值函数
__HAL_TIM_SetCounter(TIM_HandleTypeDef *htim,unsigned int num)
参数1:定时器编号(句柄),由CubeMX生成文件定义;
参数2:设置的计数值,常为0,做清空计数使用
频率测量示例:
使用HAL_TIM_IC_Start_IT函数开启定时器捕获以后,找个合适的位置编写其回调函数即可。
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
//判断是否为定时器2产生中断
if(htim->Instance == TIM2)
{
//读取计数值
capValue = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
//清空计数值,为下次计数准备
__HAL_TIM_SetCounter(htim,0);
//计算频率
freq = 80000000 / capValue;
//重启定时器(原理未了解)
HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
}
}