STM TIM(三) 输入捕获
输入捕获简介
对比一下输出比较
- 输入捕获,引脚是输入端口,是接受到输入信号,执行CNT锁存到CCR的动作。
- 输出比较,引脚是输出端口,是根据CNT和CCR的大小关系来执行输出动作。
频率测量
对于STM32而言,只能测量数字信号
频率的定义,1S内出现了多少个重复的周期,频率就是多少Hz
- 测频法,比如我们要测量信号的频率,就可以自定一个闸门时间T,通常设置为1S,在1S时间内,对信号上升沿进行计次,从0开始计,每来一个上升沿,计次+1,每来一个上升沿,其实就是来了一个周期的信号,所以在1S时间内,来了多少个周期,频率就是多少Hz。
- 所以我们在1S的闸门时间内,对上升沿计次,计次多少,频率就是多少Hz。这种直接按频率定义来进行测量的方法,就叫测频法。
- 闸门时间也不是必须为1S,也可以2S的闸门时间,那计次值除2,就是频率,也可以0.5S的闸门时间,计次乘2,也是频率。
- 测周法的基本原理就是,周期的倒数就是频率,我们如果能测出一个周期的时间,再取个倒数,就可以得到频率。捕获信号的两个上升沿,然后测量一下者之间持续的时间即可。
- 但实际上,并没有一个精度无穷大的秒表来测量时间,测量时间的方法,实际上也是定时器计次,我们使用一个已知的标准频率fc的计次时钟,来驱动计数器,从一个上升沿开始计,计数器从0开始,一直计到下一个上升沿,停止,计一个数的时间是1/fc,计N个数,时间就是N/fc,N/fc就是周期,再取个倒数,就得到了公式,fx=fc/N,这就是测周法。
- 中界频率,当有一个频率,测频法和测周法计次的N相同,就说明误差相同。
- 测频法计次和测周法计次,计次数量N,尽量要大一些,N越大,相对误差越小,因为在这些方法中,计次可能会存在±1误差。
- 比如测频法,在闸门时间内,并不是每个周期信号都是完整的,比如在最后时间里,可能一个周期刚出现一半,闸门时间就到了,那这只有半个周期,只能舍弃掉或者当作一整个周期来看,因为计次只有整数,不能计0.5个数。在这个过程就会出现多计一个,或者少计一个的情况,这就叫做正负1误差。
- 另外在测周法中,标准时刻fc计次,在最后时刻,有可能,一个数刚数到一半,计时就结束了,那这半个数也只能舍弃或者按一整个数来算,这里也会出现±1误差。正负1误差是这两种方法都固有的误差,要想减小正负1误差的影响,就要尽量多计一些数,当计次N比较大时,正负1对N的影响就会很小。
- 当待测信号频率小于中界频率时,测周法误差更小,选用测周法更合适;当待测信号频率大于中界频率时,测频法误差更小,选用测频法更合适。
测频法和测周法比较
- 测频法和测周法比较
- 测频法适合测量高频信号,测频法,在闸门时间内,最好要多出现一些上升沿,计次数量多一些,这样有助于减小误差。
- 假如定了1S的闸门时间,结果信号频率非常低,1S的闸门时间甚至1个上升沿都没有,频率总不能是0吧。测频法在计次N很小时,误差会非常大。因此,测频法要求,信号频率要稍微高一些。
- 测周法适合测量低频信号
- 低频信号,周期比较长,计次就会比较多,有助于减小误差,否则,比如标准频率fc为1MHz,待测信号频率太高,比如待测信号500KHz,那在一个周期内只能计一两个数,如果待测信号再高一些,甚至一个数也计不到,总不能认定频率无穷大吧。因此,测周法需要待测频率低一些。
- 测频法测量结果更新的慢一些,数值相对稳定
- 测频法测量的是在闸门时间内的多个周期,所以自带一个均值滤波,如果在闸门时间内波形频率有变化,那得到的其实是这一段时间的平均频率。如果闸门时间选为1S,那么每隔1S才能得到一次结果。因此,测频法结果个更新慢,测量结果是一段时间的平均值,值比较平滑。
- 测周法更新的快,数据跳变也非常快
- 测周法,只测量一个周期,就能出一次结果,所以出结果的速度取决于待测信号的频率,一般而言,待测信号都是几百几千Hz,所以一般情况下,测周法结果更新更快,但是只测量一个周期,所以结果值会受噪声的影响,波动比较大。
内部电路
- 四个通道的引脚TIMx_CH1~4,参考引脚定义表,就能直到这个引脚复用在了哪个位置。
- 引脚进来,有一个三输入的异或门,这个异或门的输入接在了通道1,2,3端口,异或门的执行逻辑是,当三个输入引脚的任何一个有电平翻转时,输出引脚就产生一次电平翻转。
- 之后输出通过数据选择器,到达输入捕获通道1,数据选择器如果选择上面一个,那输入捕获通道1的输入,就是3个引脚的异或值,如果选择下面一个,那异或门就没有用,4个通道各用各的引脚。
- 设计这个异或门,其实还是为三相无刷电机服务的,无刷电机有三个霍尔传感器检测转子的位置,可以根据转子的位置进行换相。
- 有了这个异或门就可以在前三个通道接上无刷电机的霍尔传感器,然后这个定时器就作为无刷电机的接口定时器,去驱动换相电路工作。
- 输入信号过来,来到了输入滤波器和边沿检测器
- 输入滤波器可以对信号进行滤波,避免一些高频的毛刺信号误触发
- 边沿检测器,可以选择高电平触发或者低电平触发,当出现指定的电平时,边沿检测电路就会触发后续电路执行动作。
- 这里其实是设计了两套滤波和边沿检测电路,第一套电路经过滤波和极性选择,得到TI1FP1(TI1 Filter Polarity 1),输入给通道1的后续电路,第二套电路经过另一个滤波和极性选择,得到TI1FP2(TI1 Filter Polarity 2),输入给下面通道2的后续电路。同理下面TI2信号进来,也经过两套滤波和极性选择,得到TI2FP1和TI1FP2,其中TI2FP1输入给上面,TI2FP2输入给下面。
- 在这里,两个信号进来,可以选择各走各的,也可以选择进行一个交叉(下面通道3和通道4也是同样的结构),让CH2引脚输入给通道1或者CH1引脚输入给通道2。这里进行交叉连接,目的主要有二
- 可以灵活切换后续捕获电路的输入,比如一会想以CH1作为输入,一会想以CH2作为输入,这样就可以通过这个数据选择器,灵活地进行选择。
- 可以把一个引脚的输入,同时映射到两个捕获单元,这也是PWMI的经典结构。第一个捕获通道,使用上升沿触发,用来捕获周期;第二个通道,使用下降沿触发,用来捕获占空比。两个通道同时对一个引脚进行捕获,就可以同时测量频率和占空比。
- TRC信号,也可以选择作为捕获部分的输入,用于无刷电机的驱动
- 输入信号进行滤波和极性选择后,就来到了预分频器,每个通道各有一个,可以选择对前面的信号进行分频。
- 分频之后的触发信号,就可以触发捕获电路进行工作了,每来一个触发信号,CNT的值就会向CCR转运一次,转运的同时,会发生一个捕获事件,这个事件会在状态寄存器只标志位,同时也可以产生中断,如果需要在捕获的瞬间,处理一些事情的话,就可以开启这个捕获中断。
-
比如我们可以配置上升沿触发捕获,每来一个上升沿,CNT转运到CCR一次,又因为这个CNT计数器是由内部的标准时钟驱动的,所以CNT的数值,其实就可用来记录两个上升沿之间的时间间隔,这个时间间隔就是周期,再取个倒数,就是测周法测量的频率了。
-
上升沿用于触发输入捕获,CNT用于计数计时,每来一个上升沿,取一下CNT的值,自动存在CCR里,CCR捕获到的值,就是计数值N,CNT的驱动时钟就是fc, fc/N,就得到了待测信号的频率。
-
每次捕获之后,都要把CNT清0一下,这样下次上升沿再捕获的时候,取出的CNT才是两个上升沿的时间间隔。这个在一次捕获后自动将CNT清零的步骤,我们可以用主从触发模式,自动来完成。
输入捕获通道
- 滤波器的输入是TI1,就是CH1的引脚,输出的TI1F,就是滤波后的信号,fDTS是滤波器的采样时钟来源,CCR寄存器里的ICF位可以控制滤波器的参数。
- 数字滤波器由一个事件计数器组成,它记录到N个事件后会产生一个输出的跳变。简单理解,滤波器的工作原理就是,以采样频率对输入信号进行采样,当连续N个值都为高电平,输出才为高电平,连续N个值都为低电平,输出才为低电平,如果信号出现高频抖动,导致连续采样N个值不全都一样,那输出就不会变化,就可以达到滤波的效果。采样频率越低,采样个数N越大,滤波效果越好。 在实际应用中,如果波形噪声比较大,就可以把这个参数设置大一些,这样就可以过滤噪声了。
- 滤波之后的信号TI1F通过边沿检测器,捕获上升沿或者下降沿,配置CCER寄存器里的CC1P位,就可以选择极性了,最终得到TI1FP1触发信号,通过数据选择器,进入通道1后续的捕获电路。
- CCMR1寄存器的CC1S位可以对数据选择器进行选择,ICPS位可以配置分频器(不分频、2分频、4分频、8分频)
- CCER寄存器的CC1E位,可以控制输出使能或失能。如果使能了输出,输入端产生指定边沿信号,经过层层电路,就可以将CNT的值,转运到CCR里面来。
- 每捕获一次CNT的值,都要把CNT清零一下,以便于下一次的捕获,这里硬件电路,就可以在捕获之后自动完成CNT的清零工作。
- TI1FP1信号和TI1F_ED(TI1的边沿信号)都可以通向从模式控制器,比如TI1FP1信号的上升沿触发捕获,并且还可以同时触发从模式,这个从模式中就有电路可以自动完成CNT的清零。
主从触发模式
- 主模式可以将定时器内部的信号,映射到TRGO引脚,用于触发别的外设,所以这部分叫做主模式。
- 实现定时器的级联,可以选择一个定时器的主模式输出更新信号到TRGO,另一个定时器选择上一个定时器触发从模式,从模式选择外部时钟模式1的操作,这样就能实现定时器的级联。
- 复位、使能、更新、比较脉冲、比较
- 从模式就是接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,也就是被别的信号控制,所以这部分叫从模式。
- 触发源选择,就是选择从模式的触发信号源,可以认为是从模式的一部分。触发源选择,选择指定的一个信号,得到TRGI,TRGI去触发从模式,从模式可以在下面这个列表里,选择一项操作来自动执行。
- 比如想让TI1FP1信号自动触发CNT清零,那触发源选择,就可以选中这里的TI1FP1,从模式执行的操作,就可以选择执行Reset的操作,这样TI1FP1的信号就可以自动触发从模式,从模式自动清零CNT了。实现硬件全自动测量。
输入捕获基本结构
- 将时基单元配置完成,启动定时器,CNT就会在预分频之后的时钟驱动下,不断自增,这个CNT就是测周法用来计数计时的东西。经过预分频之后的时钟频率,就是驱动CNT的标准频率fc,
- 输入捕获通道1的GPIO口,输入一个如图所示的方波信号,经过滤波器和边沿检测,选择TI1FP1为上升沿触发,之后输入选择直连的通道,分频器选择不分频,当TI1FP1出现上升沿之后,CNT的当前计数值转运到CCR1里,同时触发源选择,TI1FP1为触发信号,从模式选择复位操作,这样TI1FP1的上升沿,也会通过上面这一路,去触发CNT清零。
- 先转运CNT的值到CCR里,再触发从模式给CNT清零,或者是非阻塞的同时转移,CNT的值转移到CCR,同时0转移到CNT里面里,总之肯定不会是先清零再捕获,要不然捕获值肯定都是0了。
- 左上角的图,信号出现一个上升沿,CCR1=CNT,就是把CNT的值转运到CCR1里面去,这是输入捕获自动执行的,然后CNT=0,清零计数器,这是从模式自动执行的,然后在一个周期之内,CNT在标准时钟的驱动下,不断自增,并且由于之前清零过了,所以CNT就是从上升沿开始,从0开始计数,一直++,直到下一次上升沿来临,然后执行相同的操作,CCR1=CNT,CNT=0,第二次捕获的时候,计数值就自动放在CCR1里面,然后下一个周期,继续同样的过程,CNT从0开始自增,直到下一个上升沿,这时CCR1刷新为第二个周期的计数值,然后不断重复这个过程,所以在这个电路工作时,CCR1始终保持为最新一个周期的计数值,这个计数值就是测周法中的计次N,然后fc/N,就是信号的频率。
- 所以当我们想要读取信号的频率时,只需要读取CCR1得到N,再计算fc/N,就可以得到频率。当我们不需要读取的时候,整个电路全自动的测量,不需要占用任何软件资源。
注意事项
- 首先CNT的值是有上限的,ARR一般设置为最大65536,CNT最大也只能计65536个数,如果信号频率太低,CNT计数值可能会溢出。
- 从模式的触发源选择,只有TI1FP1和TI2FP2,没有TI3和TI4的信号,如果这里想使用从模式自动清零CNT,就只能用通道1和通道2,对于通道3和通道4,就只能开启捕获中断,在中断里手动清零了,不过这样,程序就会处于频繁中断的状态,比较消耗软件资源。
PWMI基本结构
- PWMI模式使用了两个通道同时捕获一个引脚,可以同时测量周期和占空比。
- 首先,TI1FP1配置上升沿触发,触发捕获和清零CNT,正常地捕获周期,这时再来一个TI1FP2,配置为下降沿触发,通过交叉通道,去触发通道2的捕获单元。
- 看一下左上角的图,最开始上升沿,CCR1捕获,同时清零CNT,之后CNT一直++,然后在下降沿这个时刻,触发CCR2捕获,所以这时CCR2的值,就是高电平期间的计数值,CCR2捕获,并不触发CNT清零,所以CNT继续++,直到下一次上升沿,CCR1捕获周期,CNT清零,这样执行之后,CCR1就是一整个周期的计数值,CCR2就是高电平期间的计数值,用CCR2/CCR1,就可以得到占空比,这就是PWMI模式,使用两个通道来捕获频率和占空比的思路。
- 另外这里可以两个通道同时捕获第一个引脚的输入,这样通道2的前面这一部分就没有用到,当然也可以配置两个通道同时捕获第二个引脚的输入,这样我们就是使用TI2FP1和TI2FP2两个引脚了。这两个输入可以灵活切换。