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

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 开关编码器输出信号:

旋转编码开关 EC11 的工作原理_第1张图片

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;
    }
}

 

你可能感兴趣的:(单片机学习)