STM32通用定时器输入捕获功能的使用及HAL库开发中寄存器的理解

摘要:将用 TIM2 的通道 1(PA0)来做输入捕获,捕获 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
值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32通用定时器输入捕获功能的使用及HAL库开发中寄存器的理解

发表评论