十二、TIM编码器接口

定时器的编码器接口

程序现象分析:

本小节程序:

编码器接口测速。在面包板接一个旋转编码器模块,这个代码之前写的旋转编码器计次的代码实现的功能基本一样。这个代码本质上也是旋转编码器计次,但是通过定时器的编码器接口来自动计次的。(之前的代码是通过触发外部中断,在中断函数里手动计次)使用编码器接口的好处是节约软件资源,如果使用外部中断来计次,当电机高速旋转时,编码器每秒产生成千上万个脉冲,程序需要频繁进中断,中断完成的任务又只是简单的+1-1,软件资源被这种简单又低级的工作占用。所以,对于这种需要频繁执行操作比较简单的任务,设计一个硬件电路模块来自动完成。本小节的编码器接口是自动给编码器进行计数的电路,每隔一段时间取一下计次值,就能得到编码器旋转的速度了。

程序现象:

OLED显示Speed速度,向右慢速旋转数值为正,计次较小;向右快速旋转计次会增大。向左慢速旋转数值为负,计次较小,向左快速旋转计次也是负向增大,停下来速度就是零,这就是编码器测速的实验现象。
使用定时器的编码器接口,再配合编码器就可以测量旋转速度和旋转方向了。编码器测速一般应用在电机控制的项目上。使用pwm驱动电机,再使用编码器测量电机速度,然后使用PID算法进行闭环控制。一般电机旋转速度比较高,会使用无接触式的霍尔传感器或者光栅进行测速。这里为了方便用这个触点式的旋钮编码器来演示,电机旋转用人工旋转来模拟。实际使用时,旋钮编码器和电机的霍尔光栅编码器都是一样的效果。

编码器接口(Encoder Interface)

编码器接口的工作流程概述:编码器接口可以接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度。(正交编码器:输出的两个方波信号相位相差90度,A相相对于B相超前90度或滞后90度,分别代表正转和反转。)
在这里插入图片描述
(1)编码器有两个输出,A相和B相,接入到STM32定时器的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器进行自增或自减。如初始化之后,CNT初始值为0,编码器右转,CNT++,右转产生一个脉冲,CNT就加一次。若右转产生10个脉冲后停下来,则CNT就由0自增到10停下来;编码器左转,CNT–,左转产生一个脉冲,CNT减一次。若编码器左转产生5个脉冲,CNT就在原来10的基础上自减5停下来。编码器接口相当于一个带有方向控制的外部时钟,同时控制着CNT的计数时钟和计数方向,使得CNT的值表示编码器的位置和速度(每隔一段时间取CNT的值,再把CNT清零,每次取出来的值就表示编码器的速度,编码器测速实际上就是测频法测正交脉冲的频率,测频法的思路:CNT计次, 每隔一段时间取一次计次。但编码器接口计次更高级,能根据旋转方向自增计次和自减计次,是一个带方向的测速)。
(2)每个高级定制器和通用定时器都拥有一个编码器接口,如果一个定时器配置成编码器接口模式,那它基本上就干不了其他活了(虽然还有CH3和CH4引脚,但CNT只有一个且被编码器占用了)。
补充:STM32F103C8T6 芯片只有TIM1、2、3、4四个定时器。所以最多只能接四个编码器,而且接完四个编码器就没有定时器可以用了。若编码器比较多,则需要考虑一下资源是否够用。但也可以用外部中断来接编码器,用软件资源来弥补硬件资源。硬件资源和软件资源是互补的:硬件资源越多,软件会越轻松。硬件不够软件来凑。如,PWM可以直接用定时中断,在中断里手动计数、手动翻转电平;如,输入捕获也可以用外部中断,在中断里手动把CNT取出来放在变量里;如,编码器接口也可以用外部中断,在中断里手动自增或自减计数。这都可以实现功能,输出比较、输入捕获、编码器接口都不需要了,但同时消耗软件资源了。所以一般有硬件资源的情况下,可以优先使用硬件资源,节约下来的软件资源可以去干更重要的事情。
(3)编码器接口的两个输入引脚借用了输入捕获的通道1和通道2。编码器的两个输入引脚就是每个定时器的CH1和CH2引脚,CH3和CH4不能接编码器。

正交编码器

一般可以测量位置或带有方向的速度值,一般有两个信号输出引脚,一个是A相,一个是B相。

在这里插入图片描述
这个正交编码器里面靠两个金属触点交替导通,可以输出A相和B相两个正交信号。这里有四个引脚,上面两个是供电的正极和负极,下面两个是A相和B相的输出。

在这里插入图片描述
这是电机后面自带一个编码器。电机旋转带动中间的磁铁旋转,两个霍尔传感器90度放置,最终输出A相和B相两个正交信号(旋钮是直接接触金属片得到电信号,霍尔是磁传感器,就是磁信号转成电信号),这也是正交编码器。下面一般有六根线,最左和最右直接接到电机,然后是再往里的两根线是编码器电源,最中间的两根是A相和B相的输出。

在这里插入图片描述
这个是一个单独的编码器元件(一般是正交编码器,也有的不是,要看清商品的说明)。接线的引脚一般有6个:2个是编码器电源,2个是AB相,一般还有一个编码器0位置的输出(也就是Z相,0位置就是编码器每转到一个固定位置时,输出一个脉冲,一般应用于位置测量、校准0位置),最后一个引脚一般是空脚,没有用到。

如何测旋转编码器的速度和旋转方向

当编码器的旋转轴转起来时,A相和B相就会输出方波信号。转得越快,方波的频率就越高,故方波的频率就代表了速度。取出任意一相的信号来测频率,就能知道旋转速度了。但方波想要测量方向,还需要有另一根线的辅助:当编码器正转时A相提前B相项90度,反转时A相滞后B相90度。正转是A相提前还是滞后并不是绝对的,只是一个极性问题,毕竟正转和反转的定义也是相对的。使用正交信号相比较单独定义一个方向引脚的好处:首先就是正交信号精度更高。因为AB相都可以计时,相当于计次频率提高了一倍;其次就是正交信号可以抗噪声,因为正交信号两个信号必须是交替跳变的,可以设计一个抗噪声电路(一个信号不变,另一个信号连续跳变,也就是产生了噪声,那这时计时值是不会变化的)。
在这里插入图片描述
正交信号如何计次和区分旋转方向呢,如上述图中的表格所示,正转对应上面的表,反转对应下面的表。可以发现,当AB相出现上升沿和下降沿时,对应的另一相的状态,正转和反转时正好是相反的。如A相上升沿时,正转B相是低电平,反转B相是高电平。所以编码器接口的设计逻辑是,把A相和B相的所有边缘作为计数器的计数时钟,出现边沿信号时,就计数自增或自减,增减(计数的方向)由另一相的状态确定:当出现某个边缘时,判断另一相的高低电平,若另一项相状态符合上面的表,就是正转(计数自增);反之,另一相状态符合下面的表,就是反转(计数自减)。这样就实现了编码器接口的功能,这也是我们STM32定时器编码器接口的执行逻辑。

编码器接口的电路是如何设计的

在这里插入图片描述

编码器接口的输入部分:定时器和通用定时器是一样的,每个定时器只有一个编码器接口,基本定时器没有编码器接口。编码器接口有两个输入端,分别要接到编码器的A相和B相,这里的两个网络编号分别写的是TI1FP1和TI2FP2 ,对应的是由CH1接入的TI1FP1和由CH2接入的TI2FP2,编码器接口的两个引脚借用了输入捕获单元的前两个通道。故编码器的输入引脚就是定时器的CH1和CH2这两个引脚,CH3和CH4与编码器接口无关。其中CH1和CH2 的输入捕获滤波器和边缘检测,编码器接口也有使用,但未使用后面的是否交叉、预分频器和CCR寄存器。
编码器接口的输出部分:相当于从模式控制器控制CNT的计数时钟和技术方向。简单来说,这里的输出执行流程就是:若出现了边缘信号,且对应另一相的状态为正转,则控制CNT自增;否则控制CNT自减。注意:这里不使用72MHz内部时钟和在时基单元初始化时设置的计数方向,因为此时的计数时钟和计数方向都处于编码器接口托管的状态,计数器的自增和自减受编码器控制。

编码器接口基本结构

在这里插入图片描述
输入捕获的前两个通道通过GPIO口接入编码器的AB相,再通过滤波器、边缘检测、极性选择产生TI1FP1和TI2FP2通向编码器接口,编码器接口通过预分频器控制CNT计数器的时钟,同时编码器接口还根据编码器的旋转方向控制CNT的计数方向,编码器正转CNT自增,编码器反转CNT自减。这里的ARR也是有效的,一般设置为65535(最大量程),这样利用补码的特性得到负数。(若CNT初始值为0,正转CNT自增0、1、2……没问题,但反转CNT自减,0下一个数是65535、65534、65533等,这里做一个操作,把这个16位的无符号数转换为16位有符号数,根据补码的定义,65535对应-1、65534对应-2、6533对应-3等,这样就可以直接得到负数)。

工作模式

(描述的是编码器接口的工作逻辑)
在这里插入图片描述

TI1FP1和TI2FP2接的是编码器的A、B相,在A相和B相的上升沿或下降沿触发计数,向上计数还是向下计数取决于边沿信号发生的这个时刻另一相的电平状态(也就是相对信号的电平,TI1FP1对应TI2,和TI2FP2对应TI1,就是另一相电平)。编码器分了三种工作模式:1、仅在TI1计数;2、仅在TI2计数;(模式1和模式2是只在A相或B相的上升沿和下降沿计数,计次精度低)3、TI1和TI2都计数(A相和B相的边沿都计数,计次精度高)。

实例(均不反相)

在这里插入图片描述

这个图使用的是两个引脚边沿都计数的模式,上面是这种模式的执行逻辑。
实例图上面是TI1和TI2的时序信号,下面是计数器值的变化情况。第一个状态。TI1上升沿、TI12低电平,查表对应向上计数,下面计数器值变高了一级,接着后面的这几个状态都是向上计数,正转。中间TI2值不变的地方展示的是正交编码器抗噪声的原理,TI2没变化,但TI1跳变了好几次(不符合正交编码器的信号规律,正交信号是两个输出交替变化),这时的TI1信号是毛刺信号,通过上表的逻辑可以将这个噪声滤掉。故,若出现了一个引脚不变,另一个引脚连续跳变多次的毛刺信号,计数器就会±±来回摆动,最终计数值还是原来的数,并不受毛刺噪声的影响,这是正交编码器抗噪声的原理。

实例(TI1反相)

在这里插入图片描述

这个实例展示了极性变化对计数的影响。图中TI1反向、TI2不反向。TI1反向之后,先把TI1高低电平取反,这时是反相后实际给编码器接口的电平。这时查表,第一个状态是TI1下降沿、TI2低电平,查表得到向下计数。TI1反向之后,对照上一个图发现这两个图的计数方向相反。若接了编码器发现数据的加减方向反了(想要正转的方向自减、想要反转的方向自增),这时就可以调整一下极性,把任意一个引脚反向就能反转计数方向了。(想改变计数方向也可以直接把AB相两个引脚换一下)。

库函数

void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
//定时器编码接口配置,参数1:选择定时器;参数2:选择编码器模式;参数3和参数4分别选择通道1和通道2的电平极性
  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值