目录
声明:本专栏是本人跟着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
本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓