前言
定时器捕获高电平持续时间,相信大家都比较熟悉,在我们的例程里边就有,很多客户会问有没有检查脉冲频率的呀,还真没有,但是现在有啦
本文使用STM32F407,外设TIM5通道一(PA0),实现对外部输入脉冲的频率检测。
那我们知道捕获一个完整脉冲频率,就是需要捕获两次上升沿所用时间,或者两次下降沿所用的时间。本文使用的检测方法为检测两次上升沿的时间。注意TIM5是32位的计数器。
原理讲解
当捕获到第一个上升沿时,清空计数值,使其从0开始计数,之后分成两种情况:
情况①:比较特殊就是两个上升沿之间的间隔时间太长了,需要计数溢出好几次才捕获到第二次的上升沿,此时需要加上溢出次数的用时才是整个脉冲的周期。
情况②:比较常规,两个上升沿在一个计数周期内完成采集,此时第二次上升沿所得到的计数值就为整个脉冲周期所计数次数
CubeMX配置
那我们知道这个情况了就可以设计我们的代码了,首先cubemx配置选择TIM5通道一(PA0)为输入捕获模式,设置ARR,PSC等参数,以及上升沿捕获等,如图:
并开启全局中断
设置好即可生成代码,来到代码设计部分
代码设计
首先定义两个变量,一个代表捕获状态,一个捕获值
捕获状态
/*[7]:0,没有成功的捕获;1,成功捕获到一次,也就是捕获到第二次上升沿*/
/*[6]:0,还没捕获到第一次上升沿;1,已经捕获到第一次上升沿了*/
/*[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)*/
当捕获到第一次上升沿时,把位6置一
捕获到第一次上升沿后,继续捕获到第二次上升沿,代表已经捕获到一个完整脉冲,把最高位置一
这就是捕获状态最高两位的作用,我们只需要判断高2位就知道当前是否捕获完成,后面六位是用来记录溢出次数的,也就是我们前面所说的情况①。
接着就是中断处理:捕获中断
更新中断,用来记录溢出次数
完成了前面几部分我们的核心部分就解决了,接着就是来到主函数main.c,首先初始化各外设,这里用到串口打印所以串口部分也需初始化,并开启定时器各中断等
最后就是到我们的计算频率:
首先定义一个变量temp,记录总的计数次数,然后TIM5挂载在APB1上所以定时器时钟乘2,就是84M,预分频设置84分频,也就是:1M计数频率,所以除以计数总次数,就为脉冲的频率。
实验现象
使用波形发生器输出方波波形接入板子PA0引脚(注意共地),打开串口助手看现象,如图:
(图1:设置脉冲输出10HZ) (图2:串口打印) (图3:设置脉冲输出100HZ)
|