STM32 TIM编码器接口

单片机学习!


前言

        本文介绍通过定时器的编码器接口来自动计次。之前博文介绍过通过触发外部中断,在中断函数里手动进行计次。编码器接口自动计次与触发外部中断手动计次相比较而言,使用编码器接口的好处就是节约软件资源。如果使用外部中断计次,当电机高速旋转时,编码器每秒产生上千上万个脉冲,程序就得频繁进中断。进中断之后,完成的任务又只是简单的加一减一,软件资源就被这种简单而又低级的工作给占用了。所以对于这种需要频繁执行且操作又简单的任务,一般都会设计一个硬件电路模块来自动完成。编码器接口就是用来自动给编码器进行计次的电路,每隔一段时间取一下计次值,就能得到编码器旋转的速度了。


一、编码器接口简介

  • Encoder Interface 编码器接口
  • 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
  • 每个高级定时器和通用定时器都拥有1个编码器接口
  • 两个输入引脚借用了输入捕获的通道1和通道2

1.1 编码器接口作用

        使用定时器的编码接口,再配合编码器,就可以测量旋转速度和旋转方向。这里编码器测速一般应用在电机控制的项目上,使用PWM驱动电机,再使用编码器测量电机的速度,再用PID算法进行闭环控制。一般电机旋转速度比较高,会使用无接触式的霍尔传感器或者光栅进行测速。

        编码器接口可以自动给编码器进行计次的电路,每隔一段时间计次值,就能得到编码器旋转的速度了。

1.2 编码器接口工作流程

        编码器接口的工作流程就是接收正交信号,自动执行CNT自增或自减。

        正交编码器可输出两个方波信号也就是正交信号,相位相差90°,超前90°或者滞后90°,分别代表正转和反转。

        一个编码器,有两个输出,一个是A相,一个是B相。然后接入到STM32的定时器的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器,进行自增或自减。

        工作逻辑:如初始化之后,CNT初始值为0,然后编码器右转,CNT就++,右转产生一个脉冲,CNT就加一次。比如右转产生10个脉冲后停下来,那么这个过程CNT就由0自增到10,停下来。编码器左转,CNT就--,左转产生一个脉冲,CNT减一次。比如编码器再左转产生5个脉冲,那CNT就在原来10的基础上自减5,停下来。

        这个编码器接口其实就相当于是一个带有方向控制的外部时钟。它同时控制着CNT的计数时钟和计数方向。这样CNT的值就表示了编码器的位置。

        方向测速:如果每隔一次取一次CNT的值,再把CNT清零。每次取出来的值就表示了编码器的速度。用测周法和测频法的方法来看,这个编码器测速实际上就是测频法测正交脉冲的频率。CNT计次,然后每隔一段时间取一次计次,就是测频法的方法。但是这个编码器接口计次更高级,它可以根据旋转方向,不仅能自增计次,还能自减计次,是一个带方向的测速。

1.3 编码器接口资源分布

        编码器接口资源比较紧张,如果一个定时器配置成了编码器接口模式,那它基本上就干不了其他活了,如CT86芯片只有TIM1、2、3、4,一共四个定时器,所以最多只能接4个编码器,而且接完4个编码器就没有定时器可以用了。如果编码器需求比较多的话,要考虑一下这个资源够不够用。当然,还是可以用外部中断代码来接编码器,这样就是用软件资源来弥补硬件资源。硬件资源和软件资源是互补的。一般在有硬件资源的情况下优先使用硬件资源。

1.4 编码器接口输入引脚

        编码器接口的两个输入引脚借用了输入捕获的通道1和通道2,这个可以从下文通用定时器结构框图来看。编码器的两个输入引脚就是每个定时器的CH1和CH2引脚。另外两个CH3和CH4不能接编码器。

二、正交编码器

2.1 正交编码器功能

        正交编码器一般可以测量位置,或者带有方向的速度值。

2.2 引脚作用

        正交编码器一般有两个信号输出引脚,一个是A相,一个是B相。编码器的旋转轴转起来时,A相和B相就会输出上图中的方波信号。转的越快,这个方波的频率就越高,所以方波的频率就代表了速度,可以取出任意一相的信号来测频率,就能知道旋转速度了。

2.3 如何测量方向

        但是只有一相的信号无法测量旋转方向。因为无论正转还是反转,他都是这样的方波。想要测量方向,还必须要有另一根线的辅助。

  • 一种方案是不用B相,再定义一个方向输出引脚,正转置高电平,反转置低电平。这也是一种解决方案,但这样的信号并不是正交信号。
  • 另一种解决方案就是正交信号,当正转时,A相提前B相90°,反转时,A相滞后B相90°,这里的正转反转都是极性问题,是相对的。       

2.4 正交信号优势

        使用正交信号相比较单独定义一个方向引脚,有什么优势?

  • 正交信号精度更高:因为A、B相都可以计次,相当于计次频率提高了一倍。
  • 正交信号可以抗噪声:因为正交信号,两个信号必须是交替跳变的,所以可以设计一个抗噪声电路。如果一个信号不变,另一个信号连续跳变,也就是产生了噪声,那这时计次值是不会变化的。

2.5 执行逻辑

        分析一下正交信号如何计次和区分旋转方向,从上图波形中分析。

正转的时候:

  • 第一个时刻,A上升沿,对应B低电平。是表里的第一行;
  • 第二个时刻,B上升沿,对应A高电平,是表里的第三行;
  • 第三个时刻,A下降沿,对应B高电平,是表里的第二行;
  • 第四的时刻,B下降沿,对应A低电平,是表里的第四行。

可对应上图正转波形和表格。

反转的时候:

  • 第一个时刻,B上升沿,对应A低电平。是表里的第一行;
  • 第二个时刻,A上升沿,对应B高电平,是表里的第三行;
  • 第三个时刻,B下降沿,对应A高电平,是表里的第二行;
  • 第四的时刻,A下降沿,对应B低电平,是表里的第四行。

可对应上图反转波形和表格。

        不难发现,当A相,B相出现两个表中的边沿时,一相对应另一相的状态,正传和反转正好是反相的。如A相上升沿,正转,B相就是低电平;反转,B像就是高电平。对比其他也都是相反的。

        编码器接口的设计逻辑:首先,把A相和B相的所有边沿作为计数器的计数时钟。出现边沿信号时,就计数自增或自减。计数的增减也就是计数的方向,由另一相的状态来确定,当出现某个边沿时,判断另一相的高低电平,如果对应另一相的状态出现在上图表中,那么正转计数自增;反转计数自减,这样就能实现编码器接口的功能,这也是STM32定时器编码器接口的执行逻辑。

        

三、编码器定时器框图

3.1 编码器接口分布情况

        高级定时器和通用定时器的编码器接口都是一样的,这两个定时器都只有一个编码器接口。基本定时器没有编码器接口。

3.2 编码器接口设计

编码器接口输入部分:

        上图中可以看出编码器接口有两个输入端,分别要接到编码器的A相和B相。两个网络标号TI1FP1和TI2FP2,对应输入部分电路的TI1FP1和TI2FP2,这里编码器接口的两个引脚借用了输入捕获单元的前两个通道。所以最终编码器的输入引脚就是定时器的CH1和CH2两个引脚。信号的通路是,CH1通过输入滤波器和边沿检测器从TI1FP1通向编码器接口;CH2通过输入滤波器和边沿检测器从TI2FP2通向编码器接口。CH3和CH4与编码器接口无关。其中CH1和CH2的输入捕获滤波器和边沿检测器编码器接口也有使用,而电路后面部分是否交叉连接(TI1FP2和TI2FP1)、预分频器和CCR寄存器都与编码器接口无关。

编码器接口输出部分:

        编码器接口输出部分其实就相当于从模式控制器,控制CNT的计数时钟和计数方向。这里的输出执行流程按照上一部分图中相位和边沿对应的表格,若出现边沿信号,并且对应另一相的状态为正转,则控制CNT自增,否则控制CNT自减。这里72MHz内部时钟和时基单元初始化时设置的计数方向并不会使用,因为此时计数时钟和计数方向都是处于编码器接口托管的状态,计数器自增和自减受编码器控制。

四、编码器接口基本结构

4.1 电路执行逻辑

        输入捕获的前两个通道,通过GPIO口接入编码器的A、B相,然后通过滤波器和边沿检测极性选择,产生TI1FP1和TI2FP2通向编码器接口,编码器接口通过预分频器控制CNT计数器的时钟。同时编码器接口还根据编码器的旋转方向,控制CNT的计数方向。编码器正转时,CNT自增,编码器反转时,CNT自减。这里ARR也是有效的,一般会设置ARR为65535最大量程。这样可以利用补码的特性很容易得到负数。

4.2 反转得负数逻辑

        当CNT初始为0,正转,CNT自增:0、1、2、3、4、6等等。当CNT初始为0,反转,0下一个数就是65535,接着是65534、65533、65532等等。但是这里负数应该是-1、-2、-3。这里会有一个操作直接把16位的无符号数转换为16位的有符号数,根据补码的定义65535就对应-1;65534就对应-2;65533就对应-3.这样就可以直接得到负数。

五、工作模式

5.1 编码器接口工作逻辑

        上方表描述的就是编码器接口的工作逻辑,TI1FP1和TI2FP2接的就是编码器的A、B相,在A相和B相的上升沿或者下降沿触发计数。向上计数和向下计数取决于边沿信号发生的这个时刻,另一相的电平状态,对应表中相对信号的电平。TI1FP1对应TI2,TI2FP2对应TI1,就是另一相电平的意思。

       

5.2 三种工作模式

        表中第一列可以看到,编码器还分了3种工作模式,分别是仅在TI1计数;仅在TI2计数;在TI1和TI2都计数。

        上文中总结的表格:

        左表4种状态,都是正转,都可以计次自增;右表这四种状态,都是反转,都可以计次自减。这些状态都涉及了两个引脚,分别是A相上升沿、A相下降沿、B相上升沿、B相下降沿,如果这几种状态都执行自增或自减,就是A相和B相的边沿都计数。这就对应工作模式的第三种模式:TI1和TI2都计数。

        当然这里还可以忽略一些边沿:

  • 可以仅在A相的上升沿和下降沿自增或自减,而B相的这两个状态忽略掉,不执行计数;
  • 也可以仅在B相的上升沿和下降沿自增或自减,而A相的这两个状态忽略掉,不执行计数。

这样也可以实现功能,只不过是计次的精度低了一些。这两种仅在一个边沿计数的模式就对应了工作模式里的前两种模式:仅在TI1计数和仅在TI2计数。


        工作模式表中的自增自减也对应上文总结的表格,若TI1接A相、TI2接B相,当A、B相为下表这四个状态时,就是正转,计数器需要自增。

        

  1. 上表A相上升沿,B相低电平,对应工作模式表中TI1和TI2都计数,A相上升沿对应另一相低电平,执行向上计数;
  2. 上表A相下降沿,B相高电平,对应工作模式表中TI1和TI2都计数,A相下降沿对应另一相高电平,执行向上计数;
  3. 上表B相上升沿,A相高电平,对应工作模式表中TI1和TI2都计数,B相上升沿对应另一相高电平,执行向上计数;
  4. 上表B相下降沿,A相低电平,对应工作模式表中TI1和TI2都计数,B相下降沿对应另一相低电平,执行向上计数;

观察发现这里正转的状态都是向上计数。


        若TI1接A相、TI2接B相,当A、B相为下表这四个状态时,就是反转转,计数器需要自减。

  1. 上表A相上升沿,B相高电平,对应工作模式表中TI1和TI2都计数,A相上升沿对应另一相高电平,执行向下计数;
  2. 上表A相下降沿,B相低电平,对应工作模式表中TI1和TI2都计数,A相下降沿对应另一相低电平,执行向下计数;
  3. 上表B相上升沿,A相低电平,对应工作模式表中TI1和TI2都计数,B相上升沿对应另一相低电平,执行向下计数;
  4. 上表B相下降沿,A相高电平,对应工作模式表中TI1和TI2都计数,B相下降沿对应另一相高电平,执行向下计数;

观察发现这里反转的状态都是向下计数。

总结:正转的状态都是向上计数,反转的状态都是向下计数。

六、实例

6.1 TI1和TI2均不反相

        上图为两个引脚的边沿都计数的模式,执行的逻辑对应图上方的表格。

图中上半部分为TI1和TI2的时序信号,下半部分为计数器值的变化情况。

第一个状态,TI1上升沿,TI2低电平,表格中上升沿、低电平对应向上计数,所以图中计数器变高了一级。后面连着几个状态对应表格都是向上计数为正转。

第二个状态展示的是正交编码器抗噪声的原理,在这个状态中TI2没有变化,但是TI1却跳变了好几次,这不符合正交编码器的信号规律,正交信号,两个输出交替变化,就像人走路一样,先左腿迈一步,后右腿迈一步,左右腿交替向前迈,而这里的状态就相当于右腿没动,左腿连续走了好几步。显然这个相当于左腿的动作信号是一个毛刺信号。通过上表中正交信号的逻辑就可以把这种噪声滤掉。

从噪声的毛刺信号开始看:

  1. TI1上升沿,TI2低电平,对照表格向上计数,这里自增;
  2. TI1下降沿,TI2还是低电平,对照表格向下计数,这里自减;
  3. TI1上升沿,TI2低电平,对照表格向上计数,这里自增;
  4. TI1下降,TI2还是低电平,对照表格向下计数,这里自减;

所以这里如果出现了一个引脚不变,另一个引脚连续跳变多次的毛刺信号,计数器就会加、减、加、减来回摆动,最终计数值还是原来那个数,并不受毛刺噪声的影响。这就是正交编码器抗噪声的原理。

第三个状态是反转的波形,TI1下降沿,TI2低电平,表格中下降沿、低电平对应向下计数,所以图中计数器变低了一级。后面连着几个状态对应表格都是向下计数为反转。

第四个状态,TI1不动,TI2多次跳变,计数值也是来回摆动,过滤噪声。

第五个状态是正转,向上计数。

6.2 TI1反相

        上图展示的是极性的变化对计数的影响。前一个实例是两个引脚都不反向,这个实例是TI1反相、TI2不反相的图。

        TI1反相:TI1和TI2的信号进来都会经过极性选择的部分,(在输入捕获模式下,极性选择是选择上升沿有效还是下降沿有效),编码器接口是上升沿和下降沿均有效的,上升沿和下降沿都需要计次,所以编码器接口这里不在是边沿的极性选择,而是高低电平的极性选择。如果选择上升沿的参数,就是信号直通过来,高低电平极性不反转;如果选择下降沿的参数,就是信号通过一个非门过来,高低电平极性反转。所以在极性选择这里会有两个控制极性的参数,选择是否加一个非门反转极性。对应实例,如果两个信号TI1、TI2都不反转,就对应第一个实例均不反相;如果把TI1高低电平反转一下,就是这里TI1反相的实例。

        分析的时候,图中上半部分的TI1和TI2的时序信号是输入信号,若直接对照上表分析,得到的计次方向是错误的,这里TI1反向之后,先把图中TI1高低电平取反,取反后才是反相后实际给编码器接口的电平,再对照表格分析。

6.3 实例总结

        TI1和TI2均不反相的实例图和TI1反相后的实例图对照来看,这两个图的计数方向是相反的,这里可以用于需要反转计数方向时,可以把任意一个引脚反相。当然反转计数方向时也可以直接把A、B相两个引脚换一下。


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了编码器接口的作用、电路结构、执行逻辑。

  • 37
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值