STM32——定时器TIME模块之输入捕获

时间:2020-12-21 23:25:11

STM32的定时器模块有很强大的功能,除了普通的定时功能之外还可以进行输入捕获和输出比较(PWM),PWM已在别的文章中介绍过,现在介绍一下输入捕获。


在这里先说本人在测试时想到的两个疑问:


疑问1:STM32的同一个定时器是否能同时进行输入捕获和输出比较(PWM)?
疑问2:假设疑问1的答案是可以,那输入捕获的范围是不是受限制?


功能实现:

1、既然是输入捕获,肯定需要相关引脚对信号进行检测,所以需要查找开发手册和数据手册来确定是哪几个引脚,要用哪几个引脚,然后给予合适的配置(图1)。
STM32——定时器TIME模块之输入捕获

2、要进行输入捕获实验,首先需要配置某个定时器的时基功能,这样我们才能根据这个时基计算我们的捕获信息;其次就是要配置输入(通道、边沿设置、映射、分频是几次时间、滤波是单次事件的采样次数);还要配置中断优先级,同时启动相关中断(图2);
STM32——定时器TIME模块之输入捕获

3、为了解答前面的疑问,我们在同一个定时器里添加PWM输出,配置方式可以参考手册(图3);
STM32——定时器TIME模块之输入捕获

4、使能定时器。

5、添加相关中断函数,这里设计到更新中断和捕获中断。需要说明的是,本实验的主要目的是为了测试捕获实验,通过不惑实验可以实现对固定频率的脉冲频率检测,或者脉宽检测等,本实验中刚好输出了PWM波,所以可以尝试的测测频率。思路是这样的:既然是固定频率和占空比的PWM波,那我可以连续测两次上升沿,将两次上身沿之间的计数器相减,然后根据定时器预分频值计算频率。由于在实际测试中存在所测频率很低,可能在两个上升沿之间定时器计数器更新了好几次,所以需要添加更新中断来记录这个更新(图4)。其中"Time2_Ch1_Cap_FreVal = TIM_GetCapture1(TIM2) + (Arr_Val + 1)*(Time2_Ch1_Cap_Sta&0x1F) - Time2_Ch1_Cap_Val;"是计数记录的最终结果值。
STM32——定时器TIME模块之输入捕获

6、主函数中轮询判断是不是已经检测完成一次测试了,如果是,那清除掉相关屏蔽,然后利用"72000000/((Psc_Val+1)*(Time2_Ch1_Cap_FreVal))"
计算出频率。其中有一些小技巧,在对Time2_Ch1_Cap_Sta状态值清除的时候只清除0x80和0x20,是为了实现只有在两个上升沿之间进行更新记录(图5)。
STM32——定时器TIME模块之输入捕获

疑问解答:
1、通过上面的介绍我们知道,可以用一个定时器实现既进行输入捕获,又进行PWM输出;

2、捕获的频率范围是否受限制,答案是不一定。以本实验为例,arr= 899,psc= 3;那么很明显,该实验中定时器的时钟频率是18M,所以当所测信号频率太高,在一个计数值跳变之间发生了两次上升沿,这种是测不出来的,或者测出来也是不准确的,也就是说当所测的信号频率越接近该定时器的时钟频率,误差值就越大,在实测的时候600K的频率就有点问题了(也可能是操作问题,该数据没有太大参考价值)。那么反过来,当所测频率很低,那测试结果怎么样,这个时候大家只要保证记录定时器更新的变量不要溢出,在计算过程中所有相关变量不要因为其他值的影响而不准确就不会有太大误差,在本例程中Time2_Ch1_Cap_Val定义为u8类型,可用的就低5位,最大值也就是31,计算可以知道能测的最低频率645.16多,所以如果要再低,就设置该变量为u16类型,把特殊比特位左移就行了(图6)。

STM32——定时器TIME模块之输入捕获


输入捕获能需要结合自己的算法逻辑,可以实现不同的作用,需要我们结合自身项目开发。