深入理解STM32定时器输入捕获功能

 上一章讲了输出比较的内容,输出比较就是定时器自增,同时和CCR比较,按照自己设置的比较要求,输出REF高低电平,这一章我们讲下面结构图输出比较左边部分,也就是输入捕获

首先,介绍一下输入捕获

IC(input capture)输入捕获,输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值就将被锁存到CCR中,可用于测量PWM波形的频率,占空比,脉冲间隔,电平持续时间参数等

每个高级定时器和通用定时器都拥有4个输入捕获通道,因为和输出比较共用一个通道,所以一个通道只能执行输入捕获或者输出比较

输入捕获可配置为PWMI模式,同时测量频率和占空比

可配合主从触发模式,实现硬件全自动测量

简单来说,输入捕获就是用来测量引脚输入的PWM信号的频率占空比等参数,既然说到了测量的部分,那就简单了解一下频率测量的相关知识,   还有就是对于STM32来说,只能测量数字信号,如果要测量正弦波的话,还需要搭建一个信号处理电路

这里给了一个方波信号,左边频率高,越往右,频率越低

1:测频法:   给一个闸门时间,对上升沿计次(当然下降沿也可以,为了方便,我统一用上升沿),得到的上升沿次数,讲一下它的上升沿计数工作流程,计数器不断自增,每来一个上升沿,计数器就把计数的值锁存在CCR里,并且用主从模式设置计数复位,又从0开始计数,每计一个上升沿就是一个周期,一般闸门时间选一秒,一秒有多少个上升沿,频率就算出来了 

2:测周法,捕获信号的两个上升沿,然后测量一下这两个上升沿中间持续的时间就行了,实际上,我们没有一个精度无穷大的秒表来测量时间,那么我们就用一个已知标准频率Fc的记次时钟来驱动计数器,计数从一个上升沿开始,计数器从0一直到下一个上升沿结束,记一个标准频率的时间是Fc的倒数,就是1/Fc,记N个,就是N/Fc,时间是N/Fc,那么频率fx就是N/Fc的倒数,所以fx=Fc/N

那么这两个方法有什么区别呢,什么时候用测频,什么时候用测周呢

图上能看出来,一般信号频率高的时候,就可以用测频法,频率低的就用测周法

那么多高算高,多低算低呢,就取一个中界频率,高于中界频率,用测周法,低于中界频率,用测频法,中界频率怎么算呢,中界频率就是误差相等的点,误差是由记次N产生的,那么如果有一个地方,也就是测频法和测周法的记次N相同,那就是中界频率了嘛,N相同那就好办了,联立测频和测周的公式,N相同,解出fx,就是根号下T分之Fc了

接下来,我们了解一下输入捕获的结构框图

首先从通有四个通道,对应不同的引脚,那ch1通道来举例,引脚进来的信号,经过滤波器,滤去毛刺信号,选择边沿检测,也就是上升沿或者下降沿,当然这个滤波器和边沿检测器有两块功能相同的模块,主要是因为,通道1和通道2可以交叉输入,通道1可以输出到通道2,通道2也可以输出到通道一,这样同一个信号就能同时测频率和占空比,然后经过分频器,再到捕获电路,每来一个触发信号,CNT就向CCR转运一次,这样就能测频率了,如果要测占空比的话,那么用一个引脚,选择两个通道,一个通道测上升沿,一个通道测下降沿,就能算占空比了

接下来讲讲主从触发模式,如何触发硬件自动化的操作,写代码能用到

 

主从触发模式,就是主模式,从模式,触发源选择这三个功能的简称 ,主模式可以将定时器内部的信号映射到TRGO引脚,用于触发别的外设,这部分叫主模式,从模式就是接收其他外设的一些信号,用于控制自身定时器的运行,简单来说,就是被别的信号控制,所以这部分叫从模式,触发源选择就是,选择从模式的触发源,也可以认为是从模式的一部分

工作流程就是,定时器主模式输出更新信号到TRGO,从模式选择接收信号源选择,执行从模式操作

最后,来过一下输入捕获的流程图

 首先配置时基单元,CNT计数器不断自增,计数器计数标准频率为,如果是内部时钟,那就是Fc=72M/PSC,接着引脚接收信号,滤波器滤掉杂波,经过边沿检测和极性选择,选择TI1FP1为上升沿触发,分频器可以根据自己的要求对接收到方波进行分频,然后每来一个上升沿信号,CNT就锁存到CCR1里,当然如果要复位CNT的话,还可以设置主从触发模式,触发源选择TI1FP1为触发源,从模式为RESET,这样计数器锁存一次,接着还触发了主从触发模式,CNT也复位,从0计数,这样就能根据计数的结果,算出接收到方波信号频率了。

如果还要对一个信号测量频率和占空比等,就可以对一个信号,经过两个通道,每个通道干自己分配的事情就行了,流程图大致是这样

这样,通道1的信号还能输入到通道2,通道1和上一张图的流程一样,计算频率,通道2的TI1FP2就选择下降沿触发,通道1为上升沿触发算频率,通道2为下降沿触发,算占空比

那么占空比具体怎么算的呢

 

 上升沿来的时候,CNT开始清零计数,当下降沿来的时候,CCR2捕获CNT的值,CCR2不设置主从触发模式,单纯就干锁存CNT到CCR2里面这件事,所以,CCR2里面就是高电平的计数值,接着,下一个上升沿来,CCR1才捕获CNT,CCR1设置了主从触发模式,自动清零CNT,这样CCR2就是高电平的计数值,CCR1就是整个周期的计数值,CCR2/CCR1不就是高电平的占空比了嘛。

当然补充一句关于通道的选择,ch1通道和ch2通道可以交叉输入哈,从结构图里可以看出,通道1可以输入到通道2,通道2可以输入到通道一,也可以通道1同时输入到通道1和通道2,通道2也可以同时输入到通道2和通道1,可以方便灵活切换哈

最后来简单过一下输入捕获的代码,接收引脚的选择有要求的哈,不是随便哪个引脚都能当输入捕获使用,具体可以看手册

 比如用的定时器2(TIM2)的CH1通道,就只能用PA0引脚

代码步骤 

1:RCC开启时钟,把GPIO和TIM的时钟打开

2:GPIO初始化,把GPIO配置成输入模式(一般是上拉或者浮空输入模式)

3:配置时基单元,让CNT计数器在内部时钟的驱动下自增运行

4:配置输入捕获单元,用结构体配置流程图里通道的参数

5:选择从模式的触发源

6:触发之后执行的操作

7:调用TIM_Cmd函数,开启定时器

开启时钟

 配置GPIO

选择内部时钟,配置时基单元

配置输入捕获单元 

 

触发源选择和从模式 

使能计数器

读取频率 

 

 

物联沃分享整理
物联沃-IOTWORD物联网 » 深入理解STM32定时器输入捕获功能

发表评论