重温STM32基础:定时器(9)- 输入捕获电路和测频方法 文章目录输入捕获简介通用定时器电路概览输入捕获电路在哪儿定义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内有多少个周期T1这样的话频率就是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可能一个数都计不到。根据公式N0fc/O频率无穷大显然是不对的只测一个周期就可以出一次结果所以测量周期取决于待测频率。每个待测信号周期就会更新结果波动会比较大容易受噪声的影响。中介频率上面说了两种方法的区别高频用测频法低频用测周法。那多高算高多低算低看起来有个“门槛”在这个门槛两边两种方法的精度优势会反转决定用哪个方法的频率门槛怎么算前面提到了N在两个方法中对最终结果误差的影响。可以认为N就是“误差”的一个衡量。我们可以让两个方法的“误差相等”看看这个时候的结果频率是多少那么这个结果频率点就可以认为是这个门槛。把上面公式中的N提取测频法N T × f x N T \times f_xNT×fx​测周法N f c f x N \frac{f_c}{f_x}Nfx​fc​​相等T × f x f c f x T \times f_x \frac{f_c}{f_x}T×fx​fx​fc​​设此时的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应该用的是一套滤波器但是在边沿捕获/极性选择中可以设置不同的极性。先解释一下名字TIxFPyTI: timer inputFP: filtered and polarity-selectedx输入通道y准备送向的通道所以名字的解释是由通道x捕获到并经过滤波和极性选择的、送向通道y的信号观察上图的输入的通道可以发现一个通道的信号通过滤波和边沿检测模块应该可以得到极性不同的两个信号这两个信号可以分别进入不同通道的prescalarCCR如红色箭头比如TI1FP1和TI1FP2。这主要目的是一个prescalarCCR通道算周期另一个算占空比。一个通道的prescalarCCR可以接收来自两个通道的信号如紫色箭头比如TI1FP1和TI2FP1。但是这里并不是同时送到被一个prescalarCCR同时使用只是多给一个选择通道1的prescalrCCR可以选择接收CH1的输入也可以另外选择CH2的输入。这样可以带来一些灵活性。当一个输入通道的上升沿被捕获之后会进入prescalar。分频之后的触发信号就可以触发捕获电路工作了每来一个信号CNT的值就会向CCR转运一次。转运的同时会发生一个捕获事件这个事件会在状态寄存器置标志位同时也可以产生中断。如果我们需要在捕获的时候做一些什么事情可以开启这个中断在相应中断回调函数里面做。下图是RM中“捕获比较通道”的示意图里面也注明了哪些寄存器控制哪些模块。测周法的做法输入信号的两个上升沿都会触发CNT向CCR转运一次两次之间的差值就是N。而CNT的频率是我们设置的频率已知就可以根据公式估计输入信号的频率。刚才说到“用两次CNT的差值来算N”但其实还有更简单的做法每次捕获之后清零CNT。做法就是用主从触发模式。预告具体什么是主从触发模式且听下回分解吧。本来想一篇记录完的发现其中有些其他问题。搞一篇有点长。。。