STM32F407通用定时器输入捕获

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通用定时器输入捕获

通用定时器作为输入捕获的使用。我们用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用KEY_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的时间长度,即高电平持续时间。

STM32F4的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等。这里我们用TIM5_CH1来捕获高电平脉宽。

=================================================================================== 捕获/比较通道(例如:通道 1 输入阶段)

=================================================================================== 接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (这里的x=5)。

首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。

--------------------------------------------------------------------------------------------------------------------------------------- 捕获/比较模式寄存器1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有用:

TIMx 捕获/比较模式寄存器1 (TIMx_CCMR1)

TIMx capture/compare mode register 1 偏移地址:0x18 复位值:0x0000

当在输入捕获模式下使用的时候,对应图的第二行描述,从图中可以看出,TIMx_CCMR1是针对2个通道的配置,低八位[7:0]用于捕获/比较通道1的控制,而高八位[15:8]则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4(详见《STM32F4xx中文参考手册》435页,15.4.8节)。这里我们用到的是TIM5的捕获/比较通道1,我们重点介绍TIMx_CCMR1的[7:0]位(其高8位配置类似),TIMx_CCMR1的[7:0]位详细描述见图所示:

位7:4 IC1F:输入捕获1滤波器(Input capture 1 filter)

此位域可定义TI1输入的采样频率和适用于TI1的数字滤波器带宽。数字滤波器由事件计数器组成,每N 个事件才视为一个有效边沿:

0000:无滤波器,按f DTS频率进行采样1000:f SAMPLING=f DTS/8,N=6

0001:f SAMPLING=f CK_INT,N=2 1001:f SAMPLING=f DTS/8,N=8

0010:f SAMPLING=f CK_INT,N=4 1010:f SAMPLING=f DTS/16,N=5

0011:f SAMPLING=f CK_INT,N=8 1011:f SAMPLING=f DTS/16,N=6

0100:f SAMPLING=f DTS/2,N=6 1100:f SAMPLING=f DTS/16,N=8

0101:f SAMPLING=f DTS/2,N=8 1101:f SAMPLING=f DTS/32,N=5

0110:f SAMPLING=f DTS/4,N=6 1110:f SAMPLING=f DTS/32,N=6

0111:f SAMPLING=f DTS/4,N=8 1111:f SAMPLING=f DTS/32,N=8

注意:在当前硅版本中,当ICxF[3:0]= 1、2或3时,将用CK_INT代替公式中的f DTS。

输入捕获1滤波器IC1F[3:0],这个用来设置输入采样频

率和数字滤波器长度。其中,f CK_INT是定时器的输入频

率(TIMxCLK),一般为84Mhz/168Mhz(看该定时器在

哪个总线上),而f DTS则是根据TIMx_CR1的CKD[1:0]的

设置来确定的,如果CKD[1:0]设置为00,那么

f DTS=f CK_INT。N值就是滤波长度,举个简单的例子:假

设IC1F[3:0]=0011,并设置IC1映射到通道1上,且为上

升沿触发,那么在捕获到上升沿的时候,再以f CK_INT的

频率,连续采样到8次通道1的电平,如果都是高电平,

则说明却是一个有效的触发,就会触发输入捕获中断(如

果开启了的话)。这样可以滤除那些高电平脉宽低于8

个采样周期的脉冲信号,从而达到滤波的效果。这里,

我们不做滤波处理,所以设置IC1F[3:0]=0000,只要采集

到上升沿,就触发捕获。

相关文档
最新文档