旋转编码开关 EC11 的工作原理

旋转编码开关 EC11 的工作原理

旋转编码开关 EC11 的工作原理

于 2020-07-20 21:18:51 发布3289

分类专栏:

版权

7 篇文章1 订阅

订阅专栏

9 篇文章3 订阅

订阅专栏

EC11旋转编码开关:带有左转、右转、按下三个功能。

我只需要使用左右转功能,这里只需要使用A、B引脚。

1. 引脚设置:

使用的是A B 引脚,设置为上拉输入。因为需要通过检测A、B两个引脚的电平变化,所以设置为上拉输入状态。

2.左转(逆时针)、右转(顺时针)的电平状态变化

电平变化,这里指的是一个周期中的高低电平变化情况。如下输出信号图:从左往右的第一根虚线到第三个虚线中,

A、B间的电平状态。

逆时针时(一个周期):11、01、00、10     、11、01、00、10

顺时针时(一个周期):11、10、00、01     、11、10、00、01

3.EC11 开关输出信号:

4.实现原理:

这里需要实现检测编码器到底是左转还是右转。就通过一个周期内的A、B引脚的变化情况来做判断就行了。

附上C语言代码:

我使用的定时器来检测状态,定时器中断时间  125us 执行一次下列函数。根据需要自行更改。

#define EncoderA  P01

#define EncoderB  P02         //A ,  B 两个引脚

uint8 time_cnt = 0;                //用于记录次数

uint8 input_status = 0;            //输入的状态

uint8 input_status0 = 0;        //用于记录上一次初始状态

uint8 pulse0 = 0;                //记录正旋转的状态次数

uint8 pulse1 = 0;                //记录反旋转的状态次数

uint8 scanf_status = 0;            //获取到的状态

uint8 fun_one = 0;                //判断函数是否第一次执行

//125us

void EC11_Key_Detect(void)

{

if (++time_cnt <= 3)        

{

return;

}

time_cnt = 0;

//每500us 进入一次 判断A、B引脚有无电平变化

if (EncoderA)

{

if (EncoderB)

{

//状态1

input_status = 1;        //A = 1; B = 1

}

else if (!EncoderB)

{

//状态4

input_status = 4;        //A = 1; B = 0

}

}

else if(!EncoderA)

{

if (EncoderB)

{

//状态2

input_status = 2;        //A = 0; B = 1

}

else if (!EncoderB)

{

//状态3

input_status = 3;        //A = 0; B = 0

}

}

//通过判断两个状态是否相等来 判断状态确实有变化(类似于按键消抖过程)

if (input_status == input_status0)

{

//如果第一次执行该函数

if (fun_one == 0)

{

fun_one = 1;

scanf_status = input_status;

}

input_status0 = input_status;

//如果状态为 1 因为开关旋转后 电平会停在 1 状态,在此执行所需要的东西

if (scanf_status == 1)

{

//正旋转了一个周期

if (pulse0 >= 4)

{

pulse0 = 0;

//开关正旋转一次写在这里就行了

//需要执行的语句

}

//反旋转一个周期

if (pulse1 >= 4)

{

pulse1 = 0;

//开关反旋转一次写在这里就行了

//需要执行的语句

}

//在状态1 的 前提下,判断是正旋转还是反旋转

if (input_status == 2)        //正旋转

{

scanf_status = 2;

pulse0++;

}

else if (input_status == 4)        //反旋转

{

scanf_status = 4;

pulse1++;

}

}

//在状态 2 的 前提下,判断是正旋转还是反旋转

if (scanf_status == 2)

{

if (input_status == 3)        //正旋转

{

scanf_status = 3;

pulse0++;

}

if (input_status == 1)        //反旋转

{

scanf_status = 1;

pulse1++;

}

}

//在状态 3 的 前提下,判断是正旋转还是反旋转

if (scanf_status == 3)

{

if (input_status == 4)        //正旋转

{

scanf_status = 4;

pulse0++;

}

if (input_status == 2)        //反旋转

{

scanf_status = 2;

pulse1++;

}

}

//在状态 4 的 前提下,判断是正旋转还是反旋转

if (scanf_status == 4)

{

if (input_status == 1)        //正旋转

{

scanf_status = 1;

pulse0++;

}

if (input_status == 3)        //反旋转

{

scanf_status = 3;

pulse1++;

}

}

}

else

{

input_status0 = input_status;

}

}


————————————————
版权声明:本文为CSDN博主「贾老练」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lovelijiapu/article/details/99584590