??最近在学习江科大STM32教程的原理部分时,发现该教程中使用定时器输入捕获功能获取信号频率及占空比的实验与之前常用的方式不同,并且该方法非常巧妙,所以水一篇记录一下。
??在以往的一些教程中,定时器输入捕获功能通常由中断完成,设置好定时器的Prescaler(主要控制采样分辨率)和Count Period(主要控制最大计数次数)之后,再使能该定时器的中断,在中断中完成计数次数统计(TIM–>CCR寄存器),然后清空标志位和该寄存器,进行下次采样。如参考文章中所述,该方法也确实能够完成采样信号的频率和占空比统计,但由于一直进入中断,对CPU资源需求较大。
??在江科大的教程中,通过配置TIM定时器的从模式为reset,当定时器触发计数更新时,直接完成CCR寄存器的读取和清空,这样可以由硬件自动完成后续步骤,降低了CPU软件负载。相关的原理部分可以移步该教程进行详细了解。
??首先使用TIM2_CH1产生1KHz的信号,主频72MHz,分频(72-1),计数周期(1000-1),这样即可生成1KHz信号,Pulse值设置500,即占空比为 50%:
??在原先教程中,只需要配置红框中的内容,然后使能定时器中断对频率进行统计即可,在新方式中,配置定时器从模式为Reset mode,即清空技术统计,触发模式选择TI1FP1(需要根据触发源自行修改),这样当触发计数更新时,就可以自动采集统计数据并清空。如果信号毛刺较大,则需要配置Input Filter进行滤波。
在主函数中,先启动TIM2的PWM输出待测信号,在主循环中对TIM3的输入捕获寄存器进行读取,即可完成对信号频率的采样。
如果想要计算占空比,则还需要设置TIM3_CH2的相关属性。将CH2设置为下降沿采集,采集模式与CH1为互补模式,即可进行采空比的计数采集:
在主函数中分别启动TIM3的channel_1和channel_2采集功能,即可分别获取信号上升沿和下降沿时的计数统计,然后就可以计算出频率和占空比。
通过设置TIM2的Pulse值或预分频值,可以修改信号的占空比等参数,以验证采样结果是否正确。
??从使用效果来看,由硬件自动进行信号采样和计算,确实在一定程度上减轻了CPU的计算压力,不用频繁的进入中断,感觉在此类功能上,可以完全不用由中断进行信号采样和计算了。由于freertos暂时还无法查看线程的系统占用,所以暂时还无法查看所消耗的资源,后续有机会可以考虑在RTT中对线程资源进行统计,查看实际效果。目前来看还是比较推荐的。