输入捕获简介
IC(Input Capture)输入捕获 。

4个输入捕获和输出比较通道,共用4个CCR寄存器,另外输入捕获和输出比较通道的CH1到CH4,4个通道的引脚也是共用的。所以对于同一个定时器,输入捕获和输出比较只能同时使用其中的一个。
输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中(锁存的意思就是把当前的CNT的值读出来,写入到CCR),可用于测量PWM波形的频率、占空比、脉冲间隔(频率)、电平持续时间(占空比)等参数。
每个高级定时器和通用定时器都拥有4个输入捕获通道,可配置为PWMI模式,同时测量频率和占空比。
可配合主从触发模式,实现硬件全自动测量。
PWMI模式和主从触发模式,设计的非常巧妙,把这两个功能结合起来,测量频率占空比就是硬件全自动执行,软件不需要进行任何干预,也不需要进中断,需要测量的时候,直接读取CCR寄存器就行了,使用非常方便,而且极大地减轻了软件的压力。
频率测量

这是一个频率逐渐降低的方波波形,越往左频率越高,越往右,频率越低。这里信号都是只有高低电平的数字信号,对于STM32测频率而言,他也是只能测量数字信号。如果你需要测量一个正弦波,那还需要搭建一个信号预处理电路,最简单的就是用运放搭建一个比较器,把正弦波转换为数字信号,再输入给STM32就行了。如果你测量的信号电压非常高,那还要考虑一下隔离的问题,比如用一些隔离放大器、电压互感器等元件来隔离高压端和低压端,保证电路的安全。总之,经过处理最终输入给STM32的信号,必须是这样的高低电平信号(高电平3.3V,低电平0V)。
怎样测量这样的高低电平信号呢?
首先,为了测量频率,我们有两种方法可以选择:
测频法

在闸门时间T内,对上升沿(下降沿)计次,计次得到N,则频率Fx=N/T 。
比如,我们设置一个闸门时间T=1s,在1s的时间内,对上升沿计次,每一个上升沿就相当于一个周期。计了10个上升沿,就相当于频率是10Hz。
测周法

两个上升沿内,以标准频率fc计次,得到N,则频率Fx=fc/N。
测周法的基本原理就是,周期的倒数就是频率,在一个周期之内,计了N个数,标准频率的fc的周期是1/fc,所以测量的频率的周期是N/fc,那么测量的频率是周期的倒数,所以Fx=fc/N。
测量方法对比
两种方法的基本特征对比:
测频法适合测量高频信号,测周法适合测量低频信号。
这个从图中也可以看出来,测频法在闸门时间内,最好多出现一些上升沿,计次数量多一些,这样有助于减小误差。
而对于测周法,恰恰相反,需要信号频率低一些,低频信号周期较长,计次数量多一些,这样有助于减小误差。
测频法测量结果更新的慢一些,数值相对稳定。
测周法测量结果更新的快一些,数据跳变也快。
测频法测量的是在闸门时间内的多个周期,所以他自带一个均值滤波,如果在闸门时间内波形频率有变化,那得到的其实是这一段时间的平均频率。如果闸门时间选为1s,那么每隔1s才能得到一次结果,所以测频法结果更新慢,测量结果是一段时间的平均值,值比较平滑。
测周法它只测量一个周期,就能出一次结果,所以出结果的速度取决于待测信号的频率,一般而言待测信号都是几百几千Hz,所以一般情况下测周法结果更新更快一些,但是由于他只测量一个周期,所以结果值会受噪声的影响,波动比较大。
刚才我们说了,高频适合使用测频法,低频适合使用测周法,那么,多高算高?多低算低呢?
这就涉及到中界频率的概念了,中界频率是测频法与测周法误差相等的频率点。我们之前说过,不论测频法还是测周法,都是想要让计次N的数值越大越好,因为这样误差小。为什么会有误差?因为在这些方法中,计次可能会出现正负1的误差,比如测频法,在闸门时间内,并不是每个周期信号都是完整的,比如在最后的时间里,可能有一个周期刚出现一半,闸门时间就到了,那这只有半个周期,只能舍弃掉或者当做一整个周期来看,那在这个过程就会出现多记一个或者少记一个的情况。所以当计次N比较大时,正负1对N的影响就会很小。
那当有一个频率测频法和测周法的计次N相同,就说明误差相同,这就是中界频率了。
我们把测频法和测周法的N都提出来, 让这两个N相等,把fx解出来,就得到中界频率fm了。fm=√fc / T 。
当待测信号小于中界频率时,就选择测周法,反之选择测频法。
输入捕获信号线路

在信号输入之后,CH1、2、3会有一根线路进入一个异或门,当这三个输入引脚的任何一个有电平翻转时,输出引脚就产生一次电平翻转,之后输出通过数据选择器到达TI1(输入捕获通道1)。
数据选择器如果选择上面的,那输入捕获通道1的输入就是3个引脚的异或值;
如果选择下面的这个,异或门就没有使用,4各通道各用各的引脚。
这里的异或门有什么用呢?
设计这个异或门,其实还是为了三相无刷电机服务的,无刷电机有3个霍尔传感器检测转子的位置,可以根据转子的位置进行换相,有了这个异或门,就可以在前三个通道接上无刷电机的霍尔传感器,然后这个定时器就作为无刷电机的接口定时器,去驱动换相电路工作。这个了解一下即可,我们本节暂时不涉及。
输入信号来到了“输入滤波器和边沿检测器”这里之后,输入滤波器可以对信号进行滤波,避免一些高频的毛丝信号误触发。然后边沿检测器,这就和外部中断那里是一样的了,可以选择高电平触发,或者低电平触发,当出现指定的电平时,边沿检测电路就会触发后续电路来执行动作。另外这里,他其实是设计了两套滤波和边沿检测电路,
第一套电路,经过滤波和极性选择,得到TI1FP1(TI1 Filter Polarity 1),输入给通道1的后续电路。
第二套电路,经过另一个滤波和极性选择得到TI1FP2(TI1 Filter Polarity 2),输入给下面通道2的后续电路。同理,下面的TI2信号进来,也经过两套滤波和极性选择,得到TI2FP1和TI2FB2。在这里我们可以发现,两个信号进来,可以选择各走各的,也可以选择一个交叉,让CH2引脚输入给通道1,或者CH1引脚输入通道2。
那这里为什么要进行交叉连接呢?
这样做的目的,个人认为主要有两个,第一个目的,可以灵活切换后续捕获电路的输入,比如你一会想以CH1作为输入,一会想以CH2作为输入,这样就可以通过这个数据选择器,灵活地进行选择。第二个目的,也是它交叉的主要目的,就是可以把一个引脚的引入,同时映射到两个捕获单元,这也是PWMI模式的经典结构。等会讲PWMI模式的时候,你就知道这样设计的好处了。第一个捕获通道使用上升沿触发,用来捕获周期,第二个通道使用下降沿触发,用来捕获占空比。两个引脚同时对一个引脚进行捕获,就可以同时测量频率和占空比。
另外,这里还有一个TRC信号
,也可以选择作为捕获部分的输入,这个TRC信号是来源于
这里,这样设计,也是为了无刷电机的驱动,这个知道一下就行了,我们暂时不用。
继续往后看,输入信号进行滤波和极性选择后,就来到了预分频器,预分频器每个通道各有一个,可以选择对前面的信号进行分频,分频之后的触发信号就可以出发捕获电路进行工作了。每来一个触发信号,CNT的值就会向CCR转运一次,转运的同时,会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断,如果需要在捕获的瞬间处理一些事情的话,就可以开启这个捕获中断,这就是整个电路的工作流程。
测周法测量频率具体怎么实现?
比如我们可以配置上升沿触发捕获,每来一个上升沿,CNT转运到CCR一次,又因为这个CNT计数器是由内部的标准时钟驱动的(CNT在两个上升沿之间不断自增),所以CNT的数值,其实就可以用来记录两个上升沿之间的时间间隔,这个时间间隔就是周期,再取个倒数,就是测周法测量的频率了。这里还有一个细节问题,就是每次捕获之后,我们都需要把CNT清0一下。这样下次上升沿再捕获的时候取出的CNT才是两个上升沿的时间间隔。这个在一次捕获后自动将CNT清零的步骤,我们可以用主从触发模式自动来完成,等会我们详细介绍。
输入捕获通道

滤波器的工作原理
引脚进来,先进入一个滤波器,滤波器的输入是TI1,就是CH1的引脚,输出的TI1F就是滤波后的信号。
fDTS是滤波器的采样时钟来源,下面的CCMR1寄存器里的ICF位可以控制滤波器的参数。
那这个滤波器具体是怎么工作的呢?
可以看一下手册,在CCMR1寄存器这里,有IC1F位,描述是,这几位定义了TI1输入的采样频率及数字滤波长度,数字滤波器是由一个事件计数器组成。他记录到N个事件后会产生一个输出的跳变。简单理解,这个滤波器的工作原理就是,以采样频率对输入信号进行采样,当连续N个值都为高电平,输出才为高电平;连续N个值都为低电平,输出才为低电平。如果你信号出现高频抖动,导致连续采样N个值不全都一样,那输出就不会变化,这样就可以达到滤波的效果。采样频率越低,采样个数N越大,滤波效果就越好。在实际应用中,如果波形的噪声比较大,就可以把这个参数设置大一些,这样就可以过滤噪声了。

TI1F信号走向

继续看信号,滤波之后的信号TI1F会继续通过边沿检测器,捕获上升沿或者下降沿。
信号通过边沿检测器后需要选择极性,用这个CCER寄存器器里的CC1P位,就可以选择极性了。
最终得到TI1FP1触发信号,通过数据选择器进入通道1后续的捕获电路。
当然这里实际应该还有一套一样的电路,得到TI1FP2触发信号,连接到通道2的后续电路,这里并没有画出来。但图中可以看出来同样有通道2TI2FP1连接到通道1的后续。

这四个连接方式经过这里的数据选择器,进入后续捕获部分电路,CC1S位可以对数据选择器进行选择,之后ICPS位可以配置这里的分频器,最后CC1E位控制输出使能或失能。
主从触发模式(自动清零CNT)

这个TI1FP1信号和TI1边沿信号都可以通向从模式控制器,比如TI1FP1信号的上升沿触发捕获信号的同时也可以触发从模式。这个从模式里面就有电路,可以自动完成CNT的清零。所以可以看出,这个从模式就是完成自动化操作的利器。
如何来完成硬件自动化的操作?

主从触发模式就是主模式、从模式和触发源选择这三个功能的简称。
其中主模式可以将定时器内部的信号,映射到TRGO引脚,用于触发别的外设,所以这部分叫做主模式。
从模式,就是接收其他外设或者自身外设的一些信号,同于控制自身定时器的运行,也就是被别的信号控制。其中触发源选择,就是选择从模式的触发信号源,你可以认为它是从模式的一部分。
触发源选择,你选定一个信号,得到TRGI,TRGI去触发从模式,从模式可以在最右边的列表里选择一项操作来自动执行。

如果想要TI1FP1信号自动触发清零CNT,那触发源选择,就可以选中这里的TI1FP1,从模式执行的操作,就可以选择Reset的操作。这样TI1FP1的信号就可以自动触发从模式,从模式自动清零CNT了,实现硬件全自动测量。这就是主从触发模式的用途。
输入捕获基本结构

这个结构,我们只使用了一个通道,所以他目前只能测量频率,我们把右上角的时基单元配置好启动定时器,那这个CNT,就会在预分频之后的这个时钟驱动下,不断自增,这个CNT就是我们测周法用来计数计时的东西,经过预分频之后这个位置的时钟频率,就是驱动CNT标准频率fc。这里不难看出,标准频率fc=72M/预分频系数。
下面这个输入捕获通道1的GPIO口,输入一个左上角这样的方波信号,经过滤波器和边沿检测,选择TI1FP1上升沿触发,之后输入选择直连的通道,分频器选择不分频,当TI1FP1出现上升沿之后,CNT的当前计数值转运到CCR1里,同时触发源选择,选中TI1FP1为触发信号,从模式选择Reset(复位)操作,这样TI1FP1的上升沿,也会通过上面这一路,去触发CNT清零。当然这里会有先后顺序,肯定是先转运CNT的值到CCR里去,再触发从模式给CNT清零,或者是非阻塞的同时转移,CNT的值转移到CCR,同时0转移到CNT里面去。总之肯定不会是先清零再捕获,要不然捕获的值肯定都是0了。这是这两条路的执行逻辑。
当我们想要读取信号频率时,只需要读取CCR1得到N,再计算fc/N就行了。当我们不需要读取的时候,整个电路全自动的测量,不需要占用任何软件资源。
还有几个注意事项需要说明一下,首先是CNT的值是由上限的,ARR一般设置为最大65535,那CNT最大也只能计65535个数,如果信号频率太低,CNT计数值可能会溢出。另外还需要注意,这个从模式的触发源选择,只有TI1FP1和TI2FP2,没有TI3和TI4的信号,所以想使用从模式自动清零CNT,就只能用通道1和通道2。对于通道3和通道4,就只能开启捕获中断,在中断里手动清零了,不过这样程序就处于频繁中断的状态,比较消耗软件资源,这个注意一下。
PWMI基本结构

这个PWMI模式,使用了两个通道同时捕获一个引脚,可以同时测量周期和占空比,上面的结构和输入捕获基本结构一样,只不过下面多了一个通道。
首先TI1FP1配置上升沿触发,触发捕获和清零CNT,正常的捕获周期。这时我们再来一个TI1FP2,配置为下降沿触发,通过交叉通道,去触发通道2的捕获单元。
CCR2捕获低电平,并不会触发CNT清零,CCR1捕获周期,CNT清零。这样执行之后,CCR1就是一整个周期的计数值,而CCR2就是高电平期间的计数值,我们用CCR2/CCR1,就是占空比了。
这就是PWMI模式使用两个通道来捕获频率和占空比的思路。