13.输入捕获—基于CT117E开发板的STM32库函数编程

1.输入捕获简介 
输入捕获模式可以用来测量脉冲宽度或者测量频率。 STM32的定时器, 除了TIM6和TIM7, 其他定时器都有输入捕获功能。STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的 边沿信号, 在边沿信号发生跳变 (比如上升沿/下降沿) 的时候, 将当前定时器的值 (TIMx_CNT) 存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置 捕获时是否触发中断/DMA 等。
本章我们用到 TIM2_CH1 来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记 录发生上升沿的时候 TIM2_CNT 的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发 生捕获,并记录此时的 TIM2_CNT 值。这样,前后两次 TIM2_CNT 之差,就是高电平的脉宽, 同时 TIM2 的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。
接下来, 我们介绍我们本章需要用到的一些寄存器配置,需要用到的寄存器有: TIMx_ARR、 TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 这些寄存 器在前面两章全部都有提到(这里的 x=2),这里针对性的介绍 这几个寄存器的配置。
首先 TIMx_ARR TIMx_PSC,这两个寄存器用来设自动重装载值和 TIMx 的时钟分频 再来看看捕获/比较模式寄存器 1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有 用,有必要重新介绍,该寄存器的各位描述如图1所示:
图1
当在输入捕获模式下使用的时候,对应图 14.1.1 的第二行描述,从图中可以看出, TIMx_CCMR1 明显是针对 2 个通道的配置,低八位[7:0]用于捕获/比较通道 1 的控制,而高八 位[15:8]则用于捕获/比较通道 2 的控制,因为 TIMx 还有 CCMR2 这个寄存器,所以可以知道 CCMR2 是用来控制通道 3 和通道 4(详见《STM32 参考手册》290 页,14.4.8 节) 。 这里我们用到的是 TIM2 的捕获/比较通道 1,我们重点介绍 TIMx_CMMR1 的[7:0]位(其实高 8 位配置类似) ,TIMx_CMMR1 的[7:0]位详细描述见图2 所示:

其中 CC1S[1:0],这两个位用于 CCR1 的通道方向配置,这里我们设置 IC1S[1:0]=01,也就 是配置为输入,且 IC1 映射在 TI1 上(关于 IC1,TI1 不明白的,可以看《STM32 参考手册》 14.2 节的图 98-通用定时器框图) ,CC1 即对应 TIMx_CH1。 输入捕获 1 预分频器 IC1PSC[1:0],这个比较好理解。我们是 1 次边沿就触发 1 次捕获,所 以选择 00 就是了。 输入捕获1滤波器IC1F[3:0], 这个用来设置输入采样频率和数字滤波器长度。 其中,f CK_INT 是定时器的输入频率(TIMxCLK) ,一般为 72Mhz, fDTS 则是根据 TIMx_CR1 的 CKD[1:0] 的设置来确定的,如果 CKD[1:0]设置为 00,那么  fDTS  f  CK_INT 。N 值就是滤波长度,举个简 单的例子:假设 IC1F[3:0]=0011,并设置 IC1 映射到通道 1 上,且为上升沿触发,那么在捕获 到上升沿的时候,再以 f  CK_INT  的 频率,连续采样到 8 次通道 1 的电平,如果都是高电平,则说 明确实是一个有效的触发,就会触发输入捕获中断(如果开启了的话) 。这样可以滤除那些高电 平脉宽低于 8 个采样周期的脉冲信号,从而达到滤波的效果。这里,我们不做滤波处理,所以 设置IC1F[3:0]=0000,只要采集到上升沿,就触发捕获。
再来看看捕获/比较使能寄存器:TIMx_CCER,该寄存器的各位描述见图 13.1.2(在第 13 章) 。本章我们要用到这个寄存器的最低 2 位,CC1E 和 CC1P 位。这两个位的描述如图3 所示:
所以,要使能输入捕获,必须设置 CC1E=1,而 CC1P 则根据自己的需要来配置。 接下来我们再看看 DMA/中断使能寄存器:TIMx_DIER,该寄存器的各位描述见图 12.1.2 (在第 12 章) ,本章,我们需要用到中断来处理捕获数据,所以必须开启通道 1 的捕获比较中 断,即 CC1IE 设置为 1。 控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的,这里前 面两章都有介绍,请大家参考前面的章节。
最后再来看看捕获/比较寄存器 1: TIMx_CCR1, 该寄存器用来存储捕获发生时, TIMx_CNT 的值, 我们从 TIMx_CCR1 就可以读出通道 1 捕获发生时刻的 TIMx_CNT 值, 通过两次捕获 (一 次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。 至此,我们把本章要用的几个相关寄存器都介绍完了,本章要实现通过输入捕获,来获取 TIM2_CH1(PA0)上面的高电平脉冲宽度,并从串口打印捕获结果。
2.配置步骤
1 )开启 TIM2  时钟,配置 PA0  为下拉输入 。
要使用 TIM2,我们必须先开启 TIM2 的时钟。这里我们还要配置 PA0 为下拉输入,因为 我们要捕获 TIM2_CH1 上面的高电平脉宽,而 TIM2_CH1 是连接在 PA0 上面的。
    
    
    
  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能 TIM2 时钟
  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟
2 ) 初始化TIM2,设置 TIM2的ARR和PSC 
在开启了 TIM2 的时钟之后,我们要设置 ARR PSC 两个寄存器的值来设置输入捕获的 自动重装载值和计数频率。这在库函数中是通过
TIM_TimeBaseInit 函数实现的
    
    
    
  1.         
            
            
    1. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    2. TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
    3. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
    4. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
    5. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
    6. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值