一、编码旋钮介绍

旋转编码器应用于角度定位或测量时,通常有A、B、Z三相输出。A相和B相输出占空比为50%的方波。编码器每转一周,A相和B相输出固定数目的脉冲。当编码器正向旋转时,A相比B相超前四分之一个周期;当编码器反向旋转时,B相比A相超前四分之一个周期。A相和B相输出方波的相位差为90°。编码器每转一周,Z相输出一个脉冲。由于编码器每转一周,A相和B相输出固定数目的脉冲,则A相或B相每输出一个脉冲,表示编码器旋转了一个固定的角度。当Z相输出一个脉冲时,表示编码器旋转了一周。因此旋转编码器可以测量角位移及位移方向。

b03ce0870506fe53452b233e93c19660.png

  我们通常用的是增量型编码器,可将旋转编码器的输出脉冲信号直接输入给单片机,利用单片机的高速计数器对其脉冲信号进行计数,以获得测量结果。不同型号的旋转编码器,其输出脉冲的相数也不同,有的旋转编码器输出A、B、Z三相脉冲,有的只有A、B相两相,最简单的只有A相。下面就由小编以EC11来介绍编码器的使用和编程思路,有哪里讲的不对的地方希望大家给我留言,大家一起交流学习。

f9c540946f1f176b9fdb753733f51b09.png

EC11共有5个引脚,原理图如上图。正旋一圈EC11会AB相会产生A相超前B相的20个脉冲如图一,反知产生B相超前A相的20个脉冲。按下EC11 PUSH BUTTON对地短路。

  原理方面的就讲完了,下面上干货。

一、程序设计

小编的程序是基于自己画的一块STM32C8T6的板子,原理图如下图。

41d22ddc902f03773ab8849f98b10d4f.png

f86d3556b04d1f01a8afd6f8d16ba98f.png

由于下文有很多的宏定义,先给大家把宏定义附上吧。

3685c4e8c722c042ac15a5b914144f0a.png

AB相和PUSH BUTTON都是直接与32相连所以设置管脚模式时都是需要设置为上拉输入,代码如下。

4fd9cc3fd09ebb3ec1064a0bb94282a8.png

小编判断正反转的思路是,首先将A相设置为下降沿触发的中断,当触发中断后通过判断B相的电平来判断正反转。我们先拿出一个脉冲来分析,当正旋时A相产生下降触发中断读取B相的值,由于正旋时A相超前B相,所以单片机读取B相的值为高电平(如下图)。

42709de6ced6146ed50270336debb903.png

由于用到了中断,下面就是中断初始化的程序。对于新手来说配置STM32中断时,需要注意的是中断EXTI_Line5~EXTI_Line15配置IRQ和中断函数是没有一一对应的IRQ和中断服务函数,而是EXTI_Line5~EXTI_Line9和EXTI_Line10~EXTI_Line15分别使用EXTI9_5_IRQn和EXTI15_10_IRQn,中断函数使用EXTI9_5_IRQHandler和EXTI15_10_IRQHandler。

2f9c7b0b861c28b9461d907d3182b8c1.png

575177a6302e58cccde502753ccb044c.png

接下来就是编码旋钮的处理函数了,先介绍一下编码旋钮相关参数的结构体。

6bd19b0b291656746acf191399177471.png

本节会用到的结构体变量只有number和increment,下期介绍快慢旋和单、双、长击时会用到其他的变量,这里先列出来。接下来就是时A相的中断函数。

75b8edaee5129af1deeb055d56fddecf.png

今天我们就先讲到这里,下一期将介绍如何用程序实现快慢旋和单、双、长击,最后附上结果视频。

更多推荐