目录
输入捕获简介
频率测量
测频法
测周法
测频法和测周法的区别
中界频率
如何实现测周法
输入捕获的各部分电路
电路执行的细节
主从触发模式
输入捕获基本结构
PWMI基本结构
声明:本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,我之所以记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以配套本专栏食用,如有问题可以QQ交流群:963138186
本节来学习定时器的第三部分,就是定时器的输入捕获功能。
输入捕获简介
IC(INput Capture)输入捕获
输入捕获模式下,当通道输入引脚出现指定电平跳变(就是上升沿或者下降沿,可以通过程序配置)时,当前CNT的值将被锁存到CCR中(把当前CNT的值读出来写入到CCR中去,这里对应定时器的结构图),可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。(脉冲间隔实际和频率是差不多的意思,电平持续时间和占空比差不多)
下图左边这四个就是边沿信号输入引脚,一旦有边沿,比如说上升沿,这一块输入滤波和边沿检测电路就会检测到这个上升沿,让输入捕获电路产生动作。所以这一块的作用和外部中断差不多,都是检测电平跳变,然后执行动作。
只不过外部中断执行的动作是向CPU申请中断,而这里电路执行的动作就是控制后续电路,让当前CNT的值锁存到CCR计算器中。
对比一下输出比较,输出比较时的引脚是输出端口,输入捕获引脚是输入端口。
输出比较是根据CNT和CCR的大小关系来执行输出动作,
输入捕获是接收到输入信号执行CNT锁存到CCR的动作,
这就是输入捕获的执行流程和与输出比较的区别。
如何配置输入捕获电路来测量这些参数,这就是本小节接下来的任务。
每个高级定时器和通用定时器都拥有4个输入捕获通道
对于输入捕获电路,通用定时器和高级定时器没有区别,都是一样的。基本定时器没有输入捕获的功能。
可配置为PWMI模式,同时测量频率和占空比
这个PWMI模式就是PWM的输入模式,是专门为测量PWM频率和占空比设计的。
可配合主从触发模式,实现硬件全自动测量
主从触发模式,我们也等会儿再详细介绍。
这两个功能结合起来,测量频率占空比,就是硬件全自动执行,软件不需要进行任何干预,也不需要进中断,需要测量的时候,直接读取CCR寄存器就行了,使用非常方便,而且极大的减轻了软件的压力。
接下来有必要先了解一下频率测量的相关知识。
频率测量
图中的波形图越往左频率越高,越往右频率越低。这里信号都是只有高低电平的数字信号。对于STM32测频率而言,它也是只能测量数字信号的。
如果需要测量一个正弦波,还需要搭建一个信号预处理电路,最简单的就是用运放搭一个比较器,把正弦波转换为数字信号,再输入给STM32就行了。
如果测量的信号电压非常高,还要考虑一下隔离的问题,比如用一些隔离放大器、电压互感等软件隔离高压端和低压端,保证电路的安全。
总之,要经过处理,最终输入给STM32的信号得是高低电平信号,高电平3.3V,低电平0伏。
我们来研究一下测量图中波形所示的信号的方法。
首先,为了测量频率,我们有两种方法可以选择。
测频法
第一种是测频法,执行流程是在闸门时间T内对上升沿计次,这里计次下降沿也可以,只是极性不同而已。之后为了方便我们统一以上升沿为一个周期的开始进行描述。
比如我们要测量这一块信号的频率,就可以制定一个闸门时间T,通常设置为一秒。
在一秒时间内对信号上升沿计次,从零开始计,每来一个上升沿计次加一,每来一个上升沿,其实就是来了一个周期的信号。所以在一秒时间内来了多少个周期,它的频率就是多少Hz,这符合频率的基本定义。频率的定义就是一秒内出现了多少个重复的周期。频率就是多少Hz。这种直接按频率定义来进行测量的方法,就叫测频法。
另外这个闸门时间也不是必须为一秒,也可以两秒的闸门时间,计次值除二就是频率,也可以0.5秒的闸门时间,计次乘二也是频率。
测周法
第二种方法是测周法
测周法的基本原理就是周期的倒数就是频率。我们如果能测出一个周期的时间,再取个倒数,不就是频率了吗?我们只要捕获信号的两个上升沿,然后测量一下这之间持续的时间就行了。但实际上我们并没有一个精度无穷大的秒表来测量时间。测量时间的方法,实际上也是定时器计次,我们使用一个已知的标准频率fc的计次时钟来驱动计数器,从一个上升沿开始,从零开始一直计到下一个上升沿停止,计一个数的时间是1/fc,计N个数时间就是N/fc,N/fc就是周期,频率就是再取个倒数就得到了公式fx等于fc除以N。
测频法和测周法的区别
测频法和测周法都是测量频率的重要方法,这两种方法都有什么区别?实际情况使用哪种方法更好?
测频法适合测量高频信号,测周法适合测量低频信号。
这个从以上图里也可以看出来,测频法在闸门时间内最好要多出现一些上升沿计次数量多一些。这样有助于减小误差。假如定了一秒的闸门时间,结果信号频率非常低,一秒的时间才只有寥寥无几的几个上升沿,甚至一个上升沿都没有,在计次N很少时,误差会非常大。所以测频法要求信号频率要稍微高一些。
测周法就要求信号频率低一些。低频信号周期比较长,计次就会比较多,有助于减小误差。否则,比如标准频率fc为1MHz,待测信号频率太高,比如待测信号是500KHz,在一个周期内只能计一两个数,如果待测信号再高一些,甚至一个数也计不到。所以测周法需要待测信号频率低一些。
然后是测频法测量结果更新的慢一些,数值相对稳定。测周法更新的快,数据跳变也非常快。
测频法测量的是在闸门时间内的多个周期,所以它自带一个均值滤波,如果在闸门时间内波形频率有变化,得到的其实是这一段时间的平均频率。如果闸门时间选为一秒,么每隔一秒才能得到一次结果,所以测频法结果更新慢,测量结果是一段时间的平均值,值比较平滑。
测周法只测量一个周期就能出一次结果,所以出结果的速度取决于待测信号的频率。一般而言,待测信号都是几百几千Hz,所以一般情况下,测周法结果更新更快。但是由于它只测量一个周期,所以结果值会受噪声的影响波动比较大。
这就是这两种方法的基本特征对比。
刚才我们说了高频适合使用测频法,低频适合使用测周法,多高算高,多低算低?
这就涉及到中界频率
中界频率
测频法计次和测周法计次,这个计次数量N尽量要大一些,N越大相对误差越小。因为在这些方法中,计次可能会存在正负1误差。
比如测频法,在闸门时间内并不是每个周期信号都是完整的。比如在最后时间里,可能有一个周期,刚出现一半,闸门时间就到了。这只有半个周期,只能舍弃掉,或者当做一整个周期来看。因为计次只有整数,不可能计次零点五个数。在这个过程就会出现多计一个或者少计一个的情况,这就叫做正负1误差。
在测周法也一样,标准频率fc计次,在最后时刻,有可能一个数刚数到一半计时就结束了。这半个数也只能舍弃,或者按一整个数来算了,这里也会出现正负1误差。
所以说正负一误差是这两种方法都固有的误差。要想减小正负一误差的影响,就只能尽量多计一些数。当计次N比较大时,正负1对N的影响就会很小。
所以总结就是N越大正负1误差的影响越小。
当有一个频率,测频法和测周法计次的N相同,就说明误差相同,这就是中界频率。
我们把测频法的N提出来,测周法N也提出来,令这两个方法N相等,把fx解出来,就得到中界频率的公式了。
当待测信号频率小于中界频率时,测周法误差更小,选用测周法更合适。
当待测信号频率大于中界频率时,测频法误差更小,选用测频法更合适。
测频法这个我们用之前学过的外设就可以实现,我们之前写过对射式红外传感器计次、定时器外部时钟这些代码稍加改进,就是测频法。比如对设置红外传感器计次,每来一个上升沿计次加一。我们再用一个定时器定一个一秒的定时中断,在中断里,每隔一秒取下计次值,同时清零计次为下一次做准备。这样每次读取的计次值就直接是频率。用定时器外部时钟的代码也是如此,每隔一秒取下计次,就能实现测频法测量频率的功能。
我们本节输入捕获测频率使用的方法是测周法,就是测量两个上升沿之间的时间来进行频率测量的。
如何实现测周法
接下来我们来研究一下电路如何实现测周法。
我们先回到这个定时器框图,先详细了解一下输入捕获的各部分电路。
输入捕获的各部分电路
从左到右来看,最左边是四个通道的引脚,参考引脚定义表就能知道这个引脚是复用在了哪个位置。
然后引脚进来,有一个三输入的异或门,这个异或门的执行逻辑是当三个输入引脚的任何一个有电平翻转时,输出引脚就产生一次电平翻转,之后输出通过数据选择器到达输入捕获通道1。
数据选择器如果选择上面一个,输入捕获通道1的输入就是三个引脚的异或值。
如果选择下面一个,异或门就没有用,四个通道各用各的引脚。
设计这个异或门其实还是为三相无刷电机服务的。无刷电机有三个霍尔传感器检测转子的位置,可以根据转子的位置进行换相。有了这个异或门,就可以在前三个通道接上无刷电机的霍尔传感器。然后这个定时器就作为无刷电机的接口定时器,去驱动换相电路工作。
这时,输入信号来到了输入滤波器和边沿检测器。输入滤波器可以对信号进滤波,避免一些高频的毛刺信号误触发。然后边沿检测器就和外部中断一样,可以选择高电平触发或者低电平触发。当出现指定的电平时,边沿检测电路就会触发后续电路执行动作。
另外,这里它其实是设计了两套滤波和边沿检测电路。第一套电路经过滤波和极性选择得到TI1FP1(TI1 Filter Polarity 1),输入给通道1的后续电路。
第二条电路经过另一个滤波和极性选择得到TI1FP2(TI1 Filter Polarity 2),输给下面通道2的后续电路。
同理,下面TI2信号进来也经过两套滤波和极性选择。得到TI2FP1和TI2FP2,其中TI2FP1输给上面,TI2FP2输入给下面。在这里,两个信号进来,可以选择各走各的。也可以选择进行一个交叉,让CH2引脚输入给通道1或者CH1引脚输入给通道2。
这里为什么要进行一个交叉连接?这样做的目的主要有两个:
第一个目的可以灵活切换后续捕获电路的输入。比如一会儿想以CH1作为输入,一会儿想以CH2作为输入。这样就可以通过这个数据选择器灵活的进行选择。
第二个目的也是它交叉的主要目的,就是可以把一个引脚的输入同时映射到两个捕获单元,这也是PWMI模式的经典结构。
第一个捕获通道使用上升沿触发,用来捕获周期。第二个通道使用下降沿触发,用来捕获占空比。两个通道同时对一个引脚进行捕获,就可以同时测量频率和占空比,这就是PWMI模式,后面会详细分析。
一个通道灵活切换两个引脚和两个通道同时捕获一个引脚,这就是这里交叉一下的作用和目的。
同样下面通道三和通道四也是一样的结构,可以选择各自独立连接,也可以选择进行交叉。
另外这里还有个TRC信号也可以选择作为捕获部分的输入。
这个TRC信号是来源于这里的:
这样设计,也是为了无刷电机的驱动,这个知道一下就行了,我们暂时不用。
输入信号进行滤波和极性选择后就来到了预分频器。每个通道各有一个预分频器,可以选择对前面的信号进行分频,分频之后的触发信号就可以触发捕获电路进行工作了。
每来一个触发信号,CNT的值就会向CCR转运一次。转运的同时会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断。如果需要在捕获的瞬间处理一些事情的话,就可以开启这个捕获中断,这就是整个电路的工作流程。
比如我们可以配置上升沿触发捕获,每来一个上升沿,CNT转运到CCR一次。又因为这个CNT计数器是由内部的标准时钟驱动的。所以CNT的数值其实就可以用来记录两个上升沿之间的时间间隔,这个时间间隔就是周期,再取个倒数,就是测周法测量的频率了。
上升沿用于触发输入捕获,CNT用于计数计时,每来一个上升沿取下CNT的值自动存在CCR里,CCR捕获到的值就是计数值N。CNT的驱动时钟就是fc,fc/N就得到了待测信号的频率。
另外这里还有一个细节问题,就每次捕获之后,我们都要把CNT清零一下,这样下次上升沿再捕获的时候,取出的CNT才是两个上升沿的时间间隔。
在一次捕获后,自动将CNT清零的步骤,我们可以用主从触发模式自动来完成,等会儿再详细说。
测频法:定时器中断,并记录捕获次数;
测周法:捕获中断,并记录定时器次数。
到这里输入捕获电路的执行流程和测频率的原理,我们应该已经大概的了解了。
接下来就是执行细节的问题,把电路执行的细节都了解清楚。
电路执行的细节
这是输入捕获通道1的一个更详细的框图
这个框图就是我们刚才个框图的一个细化结构,基本功能都是一样的。
引脚进来先经过一个滤波器。滤波器的输入是TI1,就是CH1的引脚,输出的TI1F就是滤波后的信号。
fDTS是滤波器的采样时钟来源。
下面CCMR1寄存器里的ICF位可以控制滤波器的参数
这个滤波器具体是怎么工作的?
可以看一下手册,
描述是:这几位定义了TI1输入的采样频率及数字滤波长度。数字滤波器是由一个事件计数器组成,它记录到N个事件后,会产生一个输出的跳变。简单理解这个滤波器工作原理就是以采样频率对输入信号进行采样。当连续N个值都为高电平输出才为高电平,连续N个值都为低电平,输出才为低电平。
如果信号出现高频抖动,导致连续采样N个值不全都一样,输出就不会变化,这样就可以达到滤波的效果。采样频率越低,采样个数N越大,滤波效果就越好。、
这些就是每个参数对应的采样频率和采样个数:
在实际应用中,如果波形噪声比较大,就可以把这个参数设置大一些,这样就可以过滤噪声了。
滤波之后的信号通过边沿检测器捕获上升沿或者下降沿,用这个CCER寄存器里的CC1P位,就可以选择极性了,最终得到TIFP1触发信号,通过数据选择器进入通道1后续的捕获电路。
当然这里实际应该还有一套一样的电路,得到TI1FP2触发信号,连通到通道2的后续电路,这里并没有画出来。
同样,通道2有TI2FP1,连通到通道1的后续,
通道2也还有TI2FP2连通到通道2的后续。
总共是四种连接方式。
然后经过数据选择器,进入后续捕获部分电路。CC1S位可以对数据选择器进行选择,之后ICPS位可以配置分频器,可以选择不分频,二分频,四分频,八分频。最后CC1E位控制输出使能或失能。
如果使能了输出,输入端产生指定边沿信号,经过层层电路到达这里,就可以让这里CNT的值转运到CCR里面来。
每捕获一次CNT的值,都要把CNT清零一下,以便于下一次的捕获。在这里硬件电路就可以在捕获之后自动完成CNT的清零工作。
如何自动清零CNT?
这个TI1FP1信号和TI1的边沿信号都可以通向从模式控制器。
比如TI1FP1信号的上升沿触发捕获,通过这里,TI1FP1还可以同时触发从模式。这个从模式里面就有电路,可以自动完成CNT的清零。
所以可以看出,这个从模式就是完成自动化操作的利器。
主从触发模式
接下来我们就来研究一下这个主从触发模式。
主从触发模式有什么用?如何来完成硬件自动化的操作?
主从触发模式手册里并没有这个描述(是B站江科大的up主自己取的名字)。
主从触发模式就是主模式,从模式和触发源选择这三个功能的简称。
其中主模式可以将定时器内部的信号映射到TRGO引脚,用于触发别的外设,所以这部分叫做主模式。
从模式就是接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,也就是被别的信号控制,所以这部分叫从模式。
触发源选择就是选择从模式的触发信号源,可以认为它是从模式的一部分。触发源选择,选择指定的一个信号,得到TRGI,去触发从模式。从模式可以在这个列表里选择一项操作来自动执行。
如果想完成我们刚才说的任务,想让TI1FP1信号自动触发CNT清零。那触发源选择就可以选中这里的TI1FP1,从模式执行的操作就可以选择执行Reset的操作。
这样TI1FP1的信号就可以自动触发从模式,从模式自动清零CNT,实现硬件全自动测量,这就是主从触发模式的用途。
有关这些信号的具体解释,可以看看手册。
比如想实现定时器的级联,就可以选择一个定时器主模式,输出更新信号到TRGO,另一个定时器选择上一个定时器触发从模式,从模式选择执行外部时钟模式1的操作,这样就能实现定时器的级联了。
还有其他很多高级的功能,都可以用主从触发模式来实现使用非常灵活。
主模式还可以选择复位、使能、比较脉冲和四个OCREF信号作为TRGO的输出。这都是手册里写的,知道有这个功能就型了,不要求记忆。
这里有从模式触发源的可选信号,可以选择这些信号去触发从模式
触发从模式后可以执行哪些操作?
从模式选择可以执行这么多的操作:
比如我们本节会使用到复位模式,执行的操作就是选中触发输入的上升沿重新初始化计数器(也就是清零CNT的意思),这就是从模式。
主模式、触发源选择、从模式在库函数里非常简单,这三块东西就对应三个函数调用函数给个参数就行了。
接下来我们就来最后理一下思路,把之前的东西组合在一起得到两个图,这两个图也分别对应了我们演示两个代码的逻辑。
输入捕获基本结构
先看第一个输入捕获基本结构。
这个结构我们只使用了一个通道,所以它目前只能测量频率。把时际单元配置好,启动定时器,CNT就会在预分频之后的这个时钟驱动下不断自增。
这个CNT就是我们测周法用来计数计时的东西,经过预分频之后,这个位置的时钟频率就是驱动CNT的标准频率fc。标准频率=72M/预分频系数。
然后下面输入捕获通道1的GPIO口,输入一个这样的方波信号
经过滤波器和边沿检测,选择TI1FP1为上升沿触发,之后输入选择直连的通道,分频器选择不分频。当TI1FP1出现上升沿之后,CNT的当前计数值转运到CCR1里。
同时,触发源选择选中TI1FP1为触发信号,从模式选择复位操作。这样TI1FP1的上升沿也会通过上面这一路去触发CNT清零。
当然这里会有个先后顺序,肯定是得先转运CNT的值到CCR里去,再触发从模式给CNT清零。或者是非阻塞的同时转移,CNT的值转移到CCR,同时零转移到CNT里面去。总之肯定不会是先清零再捕获,要不然捕获值肯定都是零了,这是这两条路的执行逻辑
然后看一下这个波形图
在这里信号出现一个上升沿,CCR1等于CNT,就是把CNT的值转运到CCR1里面去,这是输入捕获自动执行的。然后CNT=0,清零计数器,这是从模式自动执行的。
然后在一个周期之内,CNT在标准时钟的驱动下不断自增。并且由于之前清零过了,所以CNT就是从上升沿开始,从零开始计数一直加加,直到下一次上升沿来临,然后执行相同的操作CCR等于CNT,CNT,等于零。
注意第二次捕获的时候,CNT就是从这里到这里的计数值
这个计数值就自动放在CCR1里面。然后下一个周期继续同样的过程,CNT从零开始自增,直到下一个上升沿。这时CCR1刷新为第二个周期的计数值,然后不断重复这个过程。
所以当这个电路工作时,CCR1的值始终保持为最新一个周期的计数值。这个计数值就是这里的N
然后fc/N就是信号的频率
所以当我们想要读取信号的频率时,只需要读取CCR1得到N,再计算fc除N就行了。
当我们不需要读取的时候,整个电路全自动的测量,不需要占用任何软件资源。
然后还有几个注意事项说明一下,首先是这里CNT的值是有上限的。ARR一般设置为最大65535。CNT最大也只能计65535个数,如果信号频率太低,CNT计数值可能会溢出。
另外还有就是这个从模式的触发源选择,在这里看到,只有TI1FP1和TI2FP2没有TI3和TI4的信号。
所以这里如果想使用从模式自动清理CNT,就只能用通道1和通道。
对于通道三和通道四就只能开启捕获中断,在中断里手动清理了。不过这样程序就会处于频繁中断的状态,比较消耗软件资源。
PWMI基本结构
接下来第二个图就是PWMI基本结构。
这个PWMI模式使用了两个通道同时捕获一个引脚,可以同时测量周期和占空比。
上面这部分结构和刚才演示的一样,下面这里多了一个通道。
首先,TI1FP1配置上升沿触发,触发捕获和清零CNT
这时我们再来一个TI1FP2配置为下降沿触发。
通过交叉通道,去触发通道2的捕获单元,这时会发生什么?
我们看一下左上角的这个图
最开始上升沿,CCR1捕获,同时清零CNT。之后CNT一直加加,然后在下降沿这个时刻触发CCR2捕获。
所以这时CCR2的值就是CNT从这里到这里的计数值,就是高电平期间的计数值。
CCR2捕获并不触发CNT清零,所以CNT继续加,直到下一次上升沿,CCR1捕获周期,CNT清零。
这样执行之后,CCR1就是一整个周期的计数值。CCR2就是高电平期间的计数值。
我们用CCR2除以CCR1是不是就是占空比了吗!
这就是PWMI模式,使用两个通道来捕获频率和占空比的思路。
另外,因为是两个通道同时捕获第一个引脚的输入,所以通道2的前面这一部分就没有用到,
当然也可以配置两个通道同时捕获第二个引脚的输入。这样我们就是使用TI2FP1和TI2FP2这两个引脚了,这两个输入可以灵活切换。
我们本节的内容在手册里主要对应这两节:输入捕获模式和PWM输入模式。可以自己取看看。
本节的内容到这里就结束了,下节来学习输入捕获的代码部分。
QQ交流群:963138186
本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓