打印
[STM32F1]

使用CubeMX实现定时器捕获脉冲频率

[复制链接]
497|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maqianqu|  楼主 | 2024-2-23 18:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言
定时器捕获高电平持续时间,相信大家都比较熟悉,在我们的例程里边就有,很多客户会问有没有检查脉冲频率的呀,还真没有,但是现在有啦
本文使用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)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

2485

帖子

2

粉丝