单片机学习!
目录
文章目录
前言
一、编码器接口简介
1.1 编码器接口作用
1.2 编码器接口工作流程
1.3 编码器接口资源分布
1.4 编码器接口输入引脚
二、正交编码器
2.1 正交编码器功能
2.2 引脚作用
2.3 如何测量方向
2.4 正交信号优势
2.5 执行逻辑
三、编码器定时器框图
3.1 编码器接口分布情况
3.2 编码器接口设计
四、编码器接口基本结构
4.1 电路执行逻辑
4.2 反转得负数逻辑
五、工作模式
5.1 编码器接口工作逻辑
5.2 三种工作模式
六、实例
6.1 TI1和TI2均不反相
6.2 TI1反相
6.3 实例总结
总结
前言
本文介绍通过定时器的编码器接口来自动计次。之前博文介绍过通过触发外部中断,在中断函数里手动进行计次。编码器接口自动计次与触发外部中断手动计次相比较而言,使用编码器接口的好处就是节约软件资源。如果使用外部中断计次,当电机高速旋转时,编码器每秒产生上千上万个脉冲,程序就得频繁进中断。进中断之后,完成的任务又只是简单的加一减一,软件资源就被这种简单而又低级的工作给占用了。所以对于这种需要频繁执行且操作又简单的任务,一般都会设计一个硬件电路模块来自动完成。编码器接口就是用来自动给编码器进行计次的电路,每隔一段时间取一下计次值,就能得到编码器旋转的速度了。
一、编码器接口简介
- 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相为下表这四个状态时,就是正转,计数器需要自增。
- 上表A相上升沿,B相低电平,对应工作模式表中TI1和TI2都计数,A相上升沿对应另一相低电平,执行向上计数;
- 上表A相下降沿,B相高电平,对应工作模式表中TI1和TI2都计数,A相下降沿对应另一相高电平,执行向上计数;
- 上表B相上升沿,A相高电平,对应工作模式表中TI1和TI2都计数,B相上升沿对应另一相高电平,执行向上计数;
- 上表B相下降沿,A相低电平,对应工作模式表中TI1和TI2都计数,B相下降沿对应另一相低电平,执行向上计数;
观察发现这里正转的状态都是向上计数。
若TI1接A相、TI2接B相,当A、B相为下表这四个状态时,就是反转转,计数器需要自减。
- 上表A相上升沿,B相高电平,对应工作模式表中TI1和TI2都计数,A相上升沿对应另一相高电平,执行向下计数;
- 上表A相下降沿,B相低电平,对应工作模式表中TI1和TI2都计数,A相下降沿对应另一相低电平,执行向下计数;
- 上表B相上升沿,A相低电平,对应工作模式表中TI1和TI2都计数,B相上升沿对应另一相低电平,执行向下计数;
- 上表B相下降沿,A相高电平,对应工作模式表中TI1和TI2都计数,B相下降沿对应另一相高电平,执行向下计数;
观察发现这里反转的状态都是向下计数。
总结:正转的状态都是向上计数,反转的状态都是向下计数。
六、实例
6.1 TI1和TI2均不反相
上图为两个引脚的边沿都计数的模式,执行的逻辑对应图上方的表格。
图中上半部分为TI1和TI2的时序信号,下半部分为计数器值的变化情况。
第一个状态,TI1上升沿,TI2低电平,表格中上升沿、低电平对应向上计数,所以图中计数器变高了一级。后面连着几个状态对应表格都是向上计数为正转。
第二个状态展示的是正交编码器抗噪声的原理,在这个状态中TI2没有变化,但是TI1却跳变了好几次,这不符合正交编码器的信号规律,正交信号,两个输出交替变化,就像人走路一样,先左腿迈一步,后右腿迈一步,左右腿交替向前迈,而这里的状态就相当于右腿没动,左腿连续走了好几步。显然这个相当于左腿的动作信号是一个毛刺信号。通过上表中正交信号的逻辑就可以把这种噪声滤掉。
从噪声的毛刺信号开始看:
- TI1上升沿,TI2低电平,对照表格向上计数,这里自增;
- TI1下降沿,TI2还是低电平,对照表格向下计数,这里自减;
- TI1上升沿,TI2低电平,对照表格向上计数,这里自增;
- 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相两个引脚换一下。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了编码器接口的作用、电路结构、执行逻辑。