1. 增量式编码器倍频技术

来看一下增量式编码器的输出信号和它的信号倍频技术。增量式编码器输出的脉冲波形信号形式常见的有两种:

  1. 一种是占空比50%的方波,通道A和B相位差为90°;
  2. 另一种则是正弦波这类模拟信号,通道A和B相位差同样为90°。

对于第1种形式的方波信号,如果把两个通道组合起来看的话,可以发现A和B各自的上升沿和下降沿都能计数,至少在1/2个原始方波周期内就可以计数一次, 最多1/4个原始方波周期。这样计数频率就是原始方波信号的2倍或4倍,换句话说就是,将编码器的分辨率提高了2到4倍,具体如下图所示。
image.png
图中的方波信号如果只看其中一个通道的上升沿,那计数频率就等于这个通道信号的频率。如果在通道A的上升沿和下降沿都进行计数,计数频率就是通道A的两倍,即2倍频。 如果同时对两个通道的上升沿和下降沿都计数,那计数频率就变成了原始信号的4倍,即4倍频。
假设有个增量式编码器它的分辨率是600PPR,能分辨的最小角度是0.6°,对它进行4倍频之后就相当于把分辨率提高到了600*4=2400PPR,此时编码器能够分辨的最小角度为0.15°。 编码器倍频技术还可用来扩展一些测速方法的速度适用范围。例如电机测速通常使用M法进行测量(M法在下节介绍),编码器4倍频后可以扩展M法的速度下限。

2. 常用测速方法简介

上一节提到了增量式编码器倍频技术可以扩展M法的测量范围,那么现在我们就来讲解下这个M法究竟是怎样测速的,以及简单介绍一些常用的编码器测速方法。 对于电机转速的测量,可以把增量式编码器安装到电机上,用控制器对编码器脉冲进行计数,然后通过特定的方法求出电机转速,常用的编码器测速方法一般有三种:M法、T法和M/T法。

  • M法:又叫做频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。设编码器单圈总脉冲数为C, 在时间T内,统计到的编码器脉冲数为M,则转速n的计算公式为:

如一全4000脉冲,一共产生8000脉冲 8000/(4000 x 2)

  1. ![](https://cdn.nlark.com/yuque/0/2021/png/1572386/1618539427767-b345e3f5-d417-46ef-8999-41d3e5881415.png#align=left&display=inline&height=78&margin=%5Bobject%20Object%5D&originHeight=131&originWidth=247&size=0&status=done&style=none&width=148)<br />公式中的编码器单圈总脉冲数C是常数,所以转速n跟M成正比。这就使得在高速测量时M变大,可以获得较好的测量精度和平稳性, 但是如果速度很低,低到每个T内只有少数几个脉冲,此时算出的速度误差就会比较大,并且很不稳定。也有一些方法可以改善M法在低速测量的准确性, 上一节提到的增量式编码器倍频技术就是其中一种,比如原本捕获到的脉冲M只有4个,经过4倍频后,相同电机状态M变成了16个, 也就提升了低速下的测量精度。
  • T法:又叫做周期测量法。这种方法是建立一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间T决定, 计数值为M。设编码器单圈总脉冲数为C,高频脉冲的频率为F,则转速n的计算公式为:
  • 1圈多少S 0.02s/rad

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1572386/1618539669020-34fea218-6ee6-4e62-880d-0ba1c96d022b.png#align=left&display=inline&height=69&margin=%5Bobject%20Object%5D&name=image.png&originHeight=89&originWidth=237&size=6026&status=done&style=none&width=185)<br />公式中的编码器单圈总脉冲数C和高频脉冲频率F是常数,所以转速n跟M成反比。从公式可以看出,在电机高转速的时候, 编码器脉冲间隔时间T很小,使得测量周期内的高频脉冲计数值M也变得很少,导致测量误差变大,而在低转速时,T足够大, 测量周期内的M也足够多,所以T法和M法刚好相反,更适合测量低速。
  • M/T法:这种方法综合了M法和T法各自的优势,既测量编码器脉冲数又测量一定时间内的高频脉冲数。在一个相对固定的时间内,计数编码器脉冲数M, 并计数一个已知频率为F的高频脉冲,计数值为M,计算速度值。设编码器单圈总脉冲数为C,则转速n的计算公式为: image.png

由于M/T法公式中的F和C是常数,所以转速n就只受M和M的影响。电机高速时,M增大,M减小,相当于M法, 低速时,M增大,M减小,相当于T法。

3.STM32的编码器接口简介

STM32芯片内部有专门用来采集增量式编码器方波信号的接口,这些接口实际上是STM32定时器的其中一种功能。 不过编码器接口功能只有高级定时器TIM1、TIM8和通用定时器TIM2到TIM5才有。编码器接口用到了定时器的输入捕获部分, 功能框图如下图所示。
image.png
这个表格将编码器接口所有可能出现的工作情况全都列了出来,包括它是如何实现方向检测和倍频的。虽然信息很全面但是乍看上去却不容易看懂。 首先需要解释一下,表中的TI1和TI2对应编码器的通道A和通道B,而TI1FP1和TI2FP2则对应反相以后的TI1、TI2。STM32的编码器接口在计数的时候, 并不是单纯采集某一通道信号的上升沿或下降沿,而是需要综合另一个通道信号的电平。表中“相反信号的电平”指的就是在计数的时候所参考的另一个通道信号的电平, 这些电平决定了计数器的计数方向。
image.png

4.编程详解

定时器基本初始化结构体

  1. typedef struct
  2. {
  3. uint32_t Prescaler; //预分频器
  4. uint32_t CounterMode; //计数模式
  5. uint32_t Period; //定时器周期
  6. uint32_t ClockDivision; //时钟分频
  7. uint32_t RepetitionCounter; //重复计算器
  8. uint32_t AutoReloadPreload; //自动重载值
  9. }TIM_Base_InitTypeDef;

TIM_Encoder_InitTypeDef

  1. typedef struct
  2. {
  3. uint32_t EncoderMode; //编码器模式
  4. uint32_t IC1Polarity; //输入信号极性
  5. uint32_t IC1Selection; //输入通道
  6. uint32_t IC1Prescaler; //输入捕获预分频器
  7. uint32_t IC1Filter; //输入捕获滤波器
  8. uint32_t IC2Polarity; //输入信号极性
  9. uint32_t IC2Selection; //输入通道
  10. uint32_t IC2Prescaler; //输入捕获预分频器
  11. uint32_t IC2Filter; //输入捕获滤波器
  12. }TIM_Encoder_InitTypeDef;
  1. EncoderMode:编码器模式选择,用来设置计数器采集编码器信号的方式,可选通道A计数、通道B计数和双通道计数。 它设定TIMx_SMCR寄存器的SMS[2:0]位。这个成员实际是用来设置编码器接口的倍频数的,当选择通道A或B计数时为2倍频,双通道计数时为4倍频。
  2. ICxPolarity:输入捕获信号极性选择,用于设置定时器通道在编码器模式下的输入信号是否反相。 它设定TIMx_CCER寄存器的CCxNP位和CCxP位。
  3. ICxSelection:输入通道选择,ICx的信号可来自三个输入通道,分别为 TIM_ICSELECTION_DIRECTTI、 TIM_ICSELECTION_INDIRECTTI 或 IM_ICSELECTION_TRC。它设定TIMx_CCMRx寄存器的CCxS[1:0]位的值。 定时器在编码器接口模式下,此成员只能设置为TIM_ICSELECTION_DIRECTTI。
  4. ICxPrescaler:输入捕获通道预分频器,可设置1、2、4、8分频。它设定TIMx_CCMRx寄存器的ICxPSC[1:0]位的值。
  5. ICxFilter:输入捕获滤波器设置,可选设置0x0至0x0F。它设定TIMx_CCMRx寄存器ICxF[3:0]位的值。