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

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

### EC11旋转编码器工作原理详解 EC11旋转编码器是一种增量型光电编码器,主要用于检测机械位移并将其转换成电信号输出。这种类型的编码器通过两个通道A和B来实现位置变化的测量。 #### 编码方式 当轴转动时,内部光栅盘上的透光孔会依次遮挡发光二极管发出的光线,使得接收端能够接收到周期性的脉冲信号。由于采用了双路输出设计(即A相与B相信号),这两个信号之间存在90度相位差[^1]。这一特性允许系统判断旋转方向: - 如果A先于B发生跳变,则表示顺时针方向; - 若B领先于A发生变化,则意味着逆时针运动。 #### 脉冲计数机制 对于每一次完整的旋转动作,在理想情况下将会产生若干组AB组合状态的变化序列。通过对这些状态改变次数进行累加计算就可以得知当前的角度偏转量。具体来说就是每当检测到一次有效的边沿触发事件(上升沿或下降沿)就增加/减少相应的数值单位,从而完成角度信息采集的任务。 #### 中心按钮功能 除了基本的旋转变换外,某些型号还集成了一个中心按键开关用于提供额外的操作选项。不过需要注意的是,在这里讨论的内容并不涉及该部分的功能实现。 ```c // 示例代码展示如何读取GPIO引脚的状态以确定旋转方向 int read_encoder(void){ int a_state = digitalRead(PIN_A); // 获取A通道电平 int b_state = digitalRead(PIN_B); // 获取B通道电平 if (a_state && !b_state) { return 1; // 正向旋转 } else if (!a_state && b_state) { return -1; // 反向旋转 } return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值