stm32学习笔记---TIM编码器接口(理论部分)

目录

编码器接口的简介

正交编码器

使用正交信号相比较单独定义一个方向引角有什么好处?

定时器的编码器接口框图

编码器接口基本结构

实例(均不反相)

实例(TI1反相)


声明:本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,我之所以记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以配套本专栏食用,如有问题可以QQ交流群:963138186

本节我们来学习定时器的最后一部分内容:定时器的编码器接口

这里编码器测速一般应用在电机控制的项目上,使用PWM驱动电机,再使用编码器测量电机的速度。然后再用PID算法进行闭环控制,这是一个比较常见的使用场景。一般电机旋转速度比较高,会使用无接触式的霍尔传感器或者光栅进行测速。我们这里为了方便,就使用这个触点式的旋钮编码器来演示。电机旋转就用人工旋转来模拟。当然实际使用的话,这个旋钮编码器和电机的霍尔光栅编码器都是一样的效果。

编码器接口的简介

Encoder Interface 编码器接口

编码器接口可接收增量(正交)编码器的信号(输出的两个方波信号,相位相差九十度,超前九十度或者滞后九十度,分别代表正转和反转),根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度。

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

比如初始化之后,CTN初始值为零,然后编码器右转,CTN就加加,如果右转产生十个脉冲后停下来,这个过程CTN就由零自增到十停下来。编码器左转CTN就减减。如果编码器左转产生五个脉冲,CTN就在原来十的基础上自减五停下来。这个编码器接口其实就是相当于一个带有方向控制的外部时钟。它同时控制着CTN的计数时钟和计数方向,这样CTN的值就表示了编码器的位置。

如果我们每隔一段时间取是CTN的值,再把CTN清零。每次取出来的值就表示了编码器的速度。

借用一下上节测频法和测周法的知识点,这个编码器测速实际上就是测频法测正交脉冲的频率。CNT计次,然后每隔一段时间取值几次,这就是测频法的思路,只不过这个编码器接口计时更高级,它能根据旋转方向不仅能自增几次,还能自减几次,是一个带方向的测速。

每个高级定时器和通用定时器都拥有1个编码器接口

如果一个定时器配置成了编码器接口模式,它基本上就干不了其他活了。我们这个C8T6芯片只有TIM1,2,3,4,四个定时器,所以最多只能接四个编码器,而且接完四个编码器,就没有定时器可以用了。如果你编码器比较多的话,需要考虑一下这个资源够不够用。不过实在不行的话,还是可以用外部中断来接编码器的,这样就是用软件资源来弥补硬件资源了。

硬件资源和软件资源是互补的。硬件资源越多,软件就会越轻松,硬件不够,就软件来凑,比如PWM可以直接来个定时中断,然后在中断里手动计数,手动翻转电平。再比如输入捕获,可以来个外部中断,然后在中断里手动把CTN取出来,放在变量里。再再比如编码器接口,也可以来外部中断,然后在中断里手动自增或自减计数,这都可以实现功能。但是这样就是消耗软件资源了。所以一般有硬件资源的情况下,我们可以优先使用硬件资源,这样节约下来的软件资源可以去干更重要的事情。

两个输入引脚借用了输入捕获的通道1和通道2

即编码器的两个输入引脚就是每个定时器的CH1和CH2引脚,CH3和CH4不能接编码器。

正交编码器

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

它一般有两个信号输出引脚,一个是A相,一个是B相。

编码器的样子和结构,之前外部中断也介绍过,忘记了可以去回顾一下。

stm32学习笔记---EXTI外部中断(理论部分)-CSDN博客

当编码器的旋转轴转起来时,A相和B相就会输出这样的方波信号:

转的越快,这个方波的频率就越高,所以方波的频率就代表了速度。我们取出任意一相的信号来测频率,就能知道旋转速度了。

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

比如可以不要这个B相,再定义一个方向输出脚,正转至高电平,反转至低电平。这是一种解决方案。但是这样的信号并不是正交信号。

另一种解决方案就是我们本节所说的正交信号。当正转时,A相提前B相九十度反转时。A相滞后B相九十度,当然这个正转是A相提前还是A相滞后并不是绝对的,只是一个极限问题,毕竟正转和反转的定义也是相对的。总之就是朝一个方向转是A相提前,另一个方向是A相滞后。

使用正交信号相比较单独定义一个方向引角有什么好处

首先就是正交信号精度更高,因为AB相都可以计次,相当于计次频率提高了一倍。

其次就是正交信号可以抗噪声。因为正交信号,两个信号必须是交替跳变的,所以可以设计一个抗噪声电路。如果一个信号不变,另一个信号连续跳变,也就是产生了噪声,这时计次值是不会变化的,这个等会儿会再介绍。

接着我们来看一下状态表,看一下正交信号如何计次和区分旋转方向。

首先我们观察一下波形的特点,在正转的时候,第一个时刻A相上升沿。对应B相此时是低电平,也就是表里的第一行。

第二个时刻B相上升沿,对应A相高电平是表里的第三行。

第三个时刻A相下降沿,对应B相高电平是表里的第二行。

最后是B相下降沿,对应A相低电平是表里的第四行。

再然后就是A相上升沿,B相低电平了和第一个状态重复。

反转时,第一个时刻,B相上升沿对应A相低电平。

第二个时刻,A相上升沿对应B相高电平。

第三个时刻,B相下降岩对应A相高电平。

第四个时刻,A相下降岩对应B相低电平。

然后把这四种状态也列一个表,

可以发现当AB相出现这些边沿时,对于另一相的状态,正转和反转正好是相反的。

所以编码器接口的设计逻辑就是,首先把A相和B相的所有边沿作为计数器的计数时钟。出现边沿信号时就计数自增或自减。

那到底是增还是减?

这个计数的方向由另一相的状态来确定。

当出现某个边沿时,我们判断另一相的高低电平。如果对应另一相的状态出现在上面这个表里,就是正转,即是自增,反之,另一相的状态出现在下面这个表里,就是反转,即是自减。

这样就能实现编码器接口的功能了,这也是我们STM32定时器编码器接口的执行逻辑。

接下来我们先来看一下这个定时器的框图,看一下这个编码器接口的电路是如何设计的。

定时器的编码器接口框图

这里编码器接口处于定时器的这个位置。

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

编码器接口有两个输入端,分别要接到编码器的A相和B相。然后这里是两个网络标号:

可以看出这个编码器接口的两个引脚,借用了输入捕获单元的前两个通道。

所以最终编码器的输入引脚就是定时器的CH1和CH2这两个引脚。

信号的通路是CH1通过这里通向编码器接口,CH2通过这里通向编码器接口。

CH3和CH4与编码器接口无关,其中CH1和CH2的输入捕获滤波器和边沿检测,编码器接口也有使用。但是后面的是否交叉、预分频器和CCR寄存器与编码器接口无关。

这就是编码器接口的输入部分。

编码器接口的输出部分其实就相当于从模式控制器去控制CTN计数计数方向。

简单来说,这里的输出执行流程是按照我们之前总结的个表。如果出现了边沿信号,并且对应另一相的状态为正转,则控制CTN自增,否则控制CTN自减。

注意,在这里我们之前一直在使用的72MHz内部时钟和在时基单元初始化时设置的计数方向并不会使用。

因为此时,计数时钟和计数方向都处于编码器接口托管的状态,计数器的自增和自减受编码器控制。

编码器接口基本结构

输入捕获的前两个通道,通过GPIO 接入编码器的AB相。然后通过滤波器和边沿检测极性选择产生TI1FP1和TI2FP2,通向编码器接口,编码器接口通过预分频器控制CTN计数器的时钟。同时编码器接口还根据编码器的旋转方向控制CTN的计数方向。编码器正转时,CTN自增。编码器反转时,CTN自减。

另外这里ARR也是有效的,一般我们会设置ARR为65535最大量程。这样的话,利用补码的特性很容易得到负数,比如CTN初始为零,正转CTN自增。反转CTN自检,零下一个数就是65535,接着是35534,65533等等。我们直接把这个十六位的无符号数转换为十六位的有符号数。

根据补码的定义,这个65535就对应-1,,65534就对应-2,,65533就对应-3等等,这样就可以直接得到负数非常方便。这是我们读出数据得到负数的一个小技巧。

最后我们来看一些工作细节和两个小例子。

先看一下这里工作模式的这个表

这个表描述的就是我们刚才说的编码器接口的工作逻辑。

这里TI1FP1和TI2FP2接的就是编码器的AB相,在A相和B相的上升沿或者下降沿触发计数。

到底是向上计数还是向下计数?

取决于边沿信号发生的这个时刻另一相的电平状态。也就是这里的相对信号的电平

TI1FP1对应TI2和TI2FP2对应TI1,就是另一相电平的意思。

然后编码器还分了三种工作模式:

这三个模式是啥意思?

我们目前总结的是这四种状态都是正转,都可以计次自增。下面这四种状态都是反转,都可以计次自减。

这四种状态涉及到两个引脚,分别是A相上升沿,A相下降沿,B相上升沿,B相下降沿,如果这四种状态都执行自增或自减,就是A相和B相的边沿都计数,就对应这里的第三种模式:

当然这里我们还可以忽略一些边沿,比如我们可以仅在A相的上升沿和下降沿自增或自减。而B相的这两个状态忽略掉不执行计数。

或者仅在B相的上升沿和下降沿计数,A相的边沿不管它。

这样也可以实现功能,只不过是计次的精度低了一些。

如果两个边沿都计数,计数的时刻就是这样。

如果仅在A相边沿计数计数的时刻就是这样。

B相的边沿忽略掉。

如果仅在B相边沿计数也是同理,这两种仅在一个边沿计数的模式,就对应这表里的前两种模式

对比这两个表

这里正转的状态都是向上计数。

也可以把反转的状态拿过来比较一下,就对应另外这四个,向下计数。

所以总结一句话,就是正转的状态都向上计数反转的状态都向下计数,这就是编码器接口执行的逻辑。

上面这两种模式就是只在一相的边沿计数,另一相的边沿忽略,也就是不计数。计数的逻辑和最下面这个模式都是一样的。一般情况下我们都会使用最下面这个模式。

因为这个模式计数精度最高,上面这两个模式。

这就是编码机接口的三种工作模式。

实例(均不反相)

接着我们再来看一下这个实例图,

这个图里使用的就是两个引脚的边沿都计数的模式。

比如第一个状态,TI1上升沿TI2低电平,看上面的表格,上升沿低电平,对应向上计数,所以这里计数器变高了一级,这是正转。

接着后面这个地方展示的就是正交编码器抗噪声的原理。

在这里TI2没有变化,但是TI1却跳变了好几次。这不符合正交编码器的信号规律,正交信号两个输出交替变化,就像人走路一样,先迈左腿,再迈右腿,再左腿再右腿。这里就是右腿没动,左腿连续走了好几步,显然这个左腿的动作是一个毛刺信号。

而通过我们上面这个表的逻辑,就可以把这种一个腿没动,另一个腿连走好几步的噪声滤掉。比如这里TI1上升沿,TI2低电平查表得向上计数,这里自增

然后下一个状态TI1下降沿,TI2还是低电平,查表就是向下计数,所以这里自减

然后继续TI1上升沿,TI2低电平,自增。

接着TI1下降沿,TI2低电平,自减。

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

然后继续往右看,这里是反转的波形,对照上表都查一下,都是向下计数,

这里计数值就下降。

然后TI1不动,TI2多次跳变计数值,也是来回摆动过滤噪声。最后是正转向上计数,这就是编码器接口的一个实例。

实例(TI1反相)

最后我们再来看一下这个实例

这个实例展示的是极性的变化对计数的影响。

TI1反相是什么意思?

我们看一下这个图,这里TI1和TI2进来都会经过这个即极性选择的部分。

在输入捕获模式下,这个极性选择是选择上升沿有效还是下降也有效的。但是根据我们刚才的分析,编码器接口显然始终都是上升沿和下降沿都有效的,上升沿和下降沿都需要计次。

所以在编码器接口模式下结构图中这里就不再是边沿的极性选择了而是高低电平的极性选择。如果我们选择上升沿的参数,就是信号直通过来,高低电平极性不反转。如果选择下降沿的参数就是信号通过一个非门进来,高低电平极性反转。可以认为如果选择了下降沿,这个极性选择的单元就看做一个非门

所以这里就会有两个控制极性的参数,选择要不要在这里加一个非门反转一下极性。

对应这里,如果两个信号都不反转,就是这里的均不反相。

如果把TI1高低电平反转一下,就是这里的TI1反相:

分析的时候,这里图上画的是输入信号,如果你直接对照上面这个表得到的计数方向就是错误的。比如第一个状态,TI1上升沿,TI2低电平,查表应该是向上计数。

但是这里实际却是向下计数,所以TI1反相之后,我们先把TI1高低电平取反。这才是反相后实际给编码器接口的电平,然后再查表。第一个状态应该是TI1下降沿,TI2低电平,查表得到是向下计数。

对照上一个图,显然两个图的计数方向是相反的。

这有什么用?

当你接一个编码器,发现它数据的加减方向反了,你想要正转的方向,结果它自减了,你想要反转的方向,结果它自增。这时就可以调整一下极性,把任意一个引就能反转计数方向了但如果想改变计数方向的话我们还可以直接把AB相两个引脚换一下,这也是可以的,有很多地方都可以调整极性,还是非常方便的。

本节的内容对应手册的编码器接口模式那节。可以自行查看一下。

注:编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。

本节的内容就到这里,我们下节来写编码器接口的代码。

QQ交流群:963138186

本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值