文章目录
- 输入捕获简介
- 通用定时器电路概览:输入捕获电路在哪儿?
- 定义
- STM32F103输入捕获资源分布
- 可配置模式
- 频率测量
- 频率测量方法
- 测频法
- 测周法
- 两种方法比较
- 中介频率
- 代码实现preview
- 输入捕获具体电路分析
- 预告
摘要:本文围绕 STM32 定时器的输入捕获功能展开,先说明输入捕获电路在定时器中的位置、基本定义与 STM32F103 的资源分布,再系统梳理频率测量的两种方法——测频法与测周法,比较二者在精度、更新速度与抗噪性上的差异,并推导出用于选择方法的中介频率 fm。最后结合数据选择器、TIxFPy 信号命名与捕获比较通道电路,分析输入捕获的具体工作过程,并引出主从触发模式这一后续话题。
输入捕获简介
通用定时器电路概览:输入捕获电路在哪儿?
下面是STM32F103C8T6的通用定时器TIM2~TIM5定时器的电路图。4个输入捕获和输出比较通道共用了4个CCR 寄存器(下图中红框和绿框中间重叠),而且它们的通道都是共用的。
对于“通道共用”,开始我还有点疑惑:从图上看,输入捕获应该用的是左边的 TIMx_CH1 ~ 4,而输出比较用的是右边的TIMx_CH1~4啊,为什么说是“共用”?
上图中左右两边的 CH1指的是同一个物理引脚,CH2~4也是如此。这个引脚既可以当输出比较的输出,也可以当输入捕获的输入引脚。
课程中老师说“对于同一个定时器,输入捕获和输出比较中只能有一个功能工作”。这句话似乎不太准确。一个定时器的不同通道应该是可以配置成不一样的功能的,只要时基单元兼顾两者(因为所有通道的时间基准和ARR是一样的)。当然对于一同一个定时器的一个通道,同一时刻当然只能用作一个功能。
定义
(来自PPT)输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率(脉冲间隔)、占空比(电平持续时间)等参数输入捕获检测的是跳变,有点类似“中断检测”。
- 但是中断检测到之后是通知NVIC(向CPU申请中断)
- 这里是控制后面的电路:把当前CNT的值锁存到CCR寄存器中
STM32F103输入捕获资源分布
基本定时器没有输入捕获功能
通用和高级定时器的通道都具备捕获功能
可配置模式
(来自PPT)可配置为PWMI模式,同时测量频率和占空比;可配合主从触发模式,实现硬件全自动测量
这两个模式配合,软件不需要任何干预,硬件全自动执行;也不需要进中断,极大减轻软件压力
频率测量
这里测量的都是数字信号。如果要测量模拟信号,则需要先处理一下,把它变成数字信号,才能给STM32来比较。处理的方法就是用一个电压比较器:我们给电压比较器设置一个参考电压refV,
- 当输入电压大于这个refV时,比较器输出1
- 当输入电压低于这个refV时,比较器输出0
这样模拟信号就“数字化”了。
当然还要考虑输入电压的大小,要在STM32可接受的安全电压范围内。
频率测量方法
测频法
在闸门时间T内,对上升沿/下降沿进行计次,得到N,则频率为 N/T
闸门时间一般设置为1s(符合“频率”的定义:1s内有多少个周期),T=1,这样的话频率就是N;但也可以设置为2s或者0.5s等
测周法
也就是“测量周期的方法得到频率”:两个上升沿/下降沿(一个周期)内,以标准频率fc(一个频率为fc的定时器)计次,也就是每1/fc秒为1次,得到N次。则两个上升沿的时间为N/fc,也就是一个周期是N/fc,则频率就是fc/N。
两种方法比较
(下面描述都以上升沿为例;也可以是下降沿)
什么时候用哪个方法?取决于这两种方法在什么条件下能够更加可靠。上面的两个方法中,N都可能出现正负1的误差。
- 测频法中,T内并不是每个周期信号都是完整的。T的结束可能是在两个上升沿之间(如上图红线)
- 测周法中,待测信号的结束上升沿在计次器的两个计次之间(如上图右侧绿线)
正负1的误差是这两种方法固有的误差。所以,我们希望它们的公式里的N比较大,减小这种这种误差的影响。
测频法
- 测频法适合测高频信号:希望在闸门时间T内能够捕获多个上升沿,数量越多,频率估计越准确(“极端例子”:如果在闸门时间内一个上升沿都没有,难道我们认为频率是0么?大部分情况不是,所以希望被测信号频率尽可能的高,让T时间内有更多的上升沿捕获)
- 每个闸门时间T才会更新一次频率,更新速度比较慢,结果值变化比较平滑。
- 而且这个方法自带一个“均值滤波”,得到的频率是一个T内的平均频率。
测周法
- 测周法适合测低频信号:我们希望fc定时器(计数器)能够有更多的计次,那就最好是两个上升沿之间时间长一些(也就是周期长一些),所以希望被测信号是一个低频信号(“极端例子:fc为1000Hz,待测信号为500Hz,那么两个上升沿之间只能计1~2个数;如果待测信号为1000Hz,可能一个数都计不到。根据公式N=0,fc/O,频率无穷大显然是不对的)
- 只测一个周期就可以出一次结果,所以测量周期取决于待测频率。
- 每个待测信号周期就会更新,结果波动会比较大,容易受噪声的影响。
中介频率
上面说了两种方法的区别:高频用测频法,低频用测周法。那多高算高,多低算低?看起来有个“门槛”,在这个门槛两边,两种方法的精度优势会反转,决定用哪个方法的频率门槛怎么算?
前面提到了N在两个方法中对最终结果误差的影响。可以认为N就是“误差”的一个衡量。我们可以让两个方法的“误差相等”,看看这个时候的结果频率是多少,那么这个结果频率点就可以认为是这个门槛。
把上面公式中的N提取
测频法
N = T × f x N = T \times f_xN=T×fx
测周法
N = f c f x N = \frac{f_c}{f_x}N=fxfc
相等
T × f x = f c f x T \times f_x = \frac{f_c}{f_x}T×fx=fxfc
设此时的fx为fm,这就是两个方法误差相等的点
f m = f c T f_m = \sqrt{\frac{f_c}{T}}fm=Tfc
- 当待测频率> fm,选择测频法
- 当待测频率< fm,选择测周法
代码实现preview
对于两种方法的代码实现:
- 测频法:可以用外部中断+定时器,计算外部中断在一段时间内的次数来实现。之前写过类似的代码。
- 测周法:会用到输入捕获。后面会具体写这个方法的代码
输入捕获具体电路分析
数据选择器(上图左边橙色):如果选择上面的XOR输出,则CH1~3任何一个由电平翻转,XOR输出就是电平翻转(用于三相电机)。如果选择器选择下面的,则XOR就类似没有用,CH1 ~ 3各种输出到各自的输入滤波和边沿检测
TRC也是为了三相电机的应用
老师在课程中提到:一个“input filter & edge detector”是有两套输入滤波和边沿检测,分别产生TI1FP1和TI1FP2。问了一下AI,以及根据后面设置的理解,TI1FP1和TI2FP2应该用的是一套滤波器,但是在边沿捕获/极性选择中可以设置不同的极性。
先解释一下名字:TIxFPy
- TI: timer input
- FP: filtered and polarity-selected
- x:输入通道
- y:准备送向的通道
所以名字的解释是:由通道x捕获到并经过滤波和极性选择的、送向通道y的信号
观察上图的输入的通道可以发现
- 一个通道的信号通过滤波和边沿检测模块,应该可以得到极性不同的两个信号,这两个信号可以分别进入不同通道的prescalar+CCR(如红色箭头)比如TI1FP1和TI1FP2。这主要目的是一个prescalar+CCR通道算周期,另一个算占空比。
- 一个通道的prescalar+CCR可以接收来自两个通道的信号(如紫色箭头),比如TI1FP1和TI2FP1。但是这里并不是同时送到被一个prescalar+CCR同时使用,只是多给一个选择:通道1的prescalr+CCR可以选择接收CH1的输入,也可以另外选择CH2的输入。这样可以带来一些灵活性。
当一个输入通道的上升沿被捕获之后会进入prescalar。分频之后的触发信号就可以触发捕获电路工作了:每来一个信号,CNT的值就会向CCR转运一次。转运的同时会发生一个捕获事件,这个事件会在状态寄存器置标志位,同时也可以产生中断。如果我们需要在捕获的时候做一些什么事情,可以开启这个中断,在相应中断回调函数里面做。
下图是RM中“捕获比较通道”的示意图,里面也注明了哪些寄存器控制哪些模块。
测周法的做法:输入信号的两个上升沿都会触发CNT向CCR转运一次,两次之间的差值就是N。而CNT的频率是我们设置的,频率已知,就可以根据公式估计输入信号的频率。
刚才说到“用两次CNT的差值来算N”,但其实还有更简单的做法:每次捕获之后清零CNT。做法就是用主从触发模式。
预告
具体什么是主从触发模式,且听下回分解吧。本来想一篇记录完的,发现其中有些其他问题。搞一篇有点长。。。