stm32通用定时器输入捕获功能的使用(HAL库开发上:寄存器的理解)

摘要:将用 TIM2 的通道 1PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间。

先理解一下输入捕获的概念以及原理,概念:可以用来测量脉冲宽度或者测量频率

原理可以用简图来说明,如图下:

        如图所示,输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1~t2 时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x 为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT ,并设置通道 x 为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2 。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图 所示, t1~t2 之间, CNT 计数的次数等于: N*ARR+CCRx2,有了这个计数次数,再乘以 CNT 的计数周期,即可得到 t2-t1 的时间长度,即高电平持续时间。
        简单的说,就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。
        下面我们需要了解,定时器的输入捕获功能需要用到那些寄存器
寄存器:TIMx_ARR :自动重装载寄存器、 TIMx_PSC:预分频寄存器 、 TIMx_CCMR1 : 捕获 / 比较模式寄存器 1、 TIMx_CCER: 捕获 / 比较使能寄存器 、 TIMx_DIER :DMA/中断使能寄存器
、 TIMx_CR1:控制寄存器1 、TIMx_CCR1:捕获/比较寄存器
        1、TIMx_ARR :自动重装载寄存器,各位描述如下。
        2、TIMx_PSC:预分频寄存器,各位描述如下。
该寄存器 用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。
3、TIMx_CCMR1 : 捕获 / 比较模式寄存器 1,寄存器的各位描述如下
从图中可以看出, TIMx_CCMR1明显是针对 2 个通道的配置,低八位 [7 0] 用于捕获 / 比较通道 1 的控制,而高八位[15 8] 则用于捕获 / 比较通道 2 的控制,因为 TIMx 还有 CCMR2 这个寄存器,所以可以知道CCMR2 是用来控制通道 3 和通道 4。重点介绍一下TIMx_CCMR1 [7:0] 位,如下图所示。
        其中CC1S[1:0] ,这两个位用于 CCR1 的通道配置,这里我们设置 IC1S[1:0]=01 ,也就是配
IC1 映射在 TI1 上。
        输入捕获 1 预分频器 IC1PSC[1:0],1 次边沿就触发1 次捕获,所
以选择 00 就是了。
        输入捕获 1 滤波器 IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度。其中,
f CK_INT 是定时器的输入频率( TIMxCLK ),一般为 72Mhz ,而 f DTS 则是根据 TIMx_CR1
CKD[1:0] 的设置来确定的,如果 CKD[1:0] 设置为 00 ,那么 f DTS = f CK_INT。N 值就是滤波长度,举例子:假设 IC1F[3:0]=0011,并设置 IC1 映射到通道 1 上,且为上升沿触发,那么在捕获到上升沿的时候,再以 fCK_INT 的频率,连续采样到 8 次通道 1 的电平,如果都是高电平,则说明却是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。这样可以滤除那些高电平脉宽低于 8 个采样周期的脉冲信号,从而达到滤波的效果。这里,我们不做滤波处理,所以设置 IC1F[3:0]=0000,只要采集到上升沿,就触发捕获。
        4、 捕获 / 比较使能寄存器: TIMx_CCER ,该寄存器的各位描述如下图
要使能输入捕获,这里要用到这个寄存器的最低 2 位, CC1E CC1P 位,必须设置 CC1E=0 ,而 CC1P 则根据自己的需要来配置。
        5、DMA/中断使能寄存器: TIMx_DIER ,该寄存器的各位描述如下图
        现在需要用到中断来处理捕获数据,所以必须开启通道 1 的捕获比较中断,即 CC1IE 设置为 1
        6、控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的
        7、捕获/ 比较寄存器 1 TIMx_CCR1 ,该寄存器用来存储捕获发生时, TIMx_CNT 的值,我们从 TIMx_CCR1 就可以读出通道 1 捕获发生时刻的 TIMx_CNT 值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。
  • 41
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No Bugs ToDay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值