找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

EC11编码器基于运算解码的算法(原创)

查看数: 6490 | 评论数: 30 | 收藏 48
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-12-13 22:46

正文摘要:

EC11编码器基于运算解码的算法(原创) EC11旋转编码器是一种基于脉冲发生的装置,它的编码逻辑如下图 单片机解码方式主要有几种: 1、MCU定时器自带编码器模式,如GD32、STM32等; 2、使用外部IO中断,在 ...

回复

ID:1143041 发表于 2025-5-17 13:34
感谢楼主分享
ID:46750 发表于 2025-5-17 10:53
代码非常稳定可靠!谢谢分享!!!
ID:21740 发表于 2025-2-21 16:54
zhang32568 发表于 2025-2-20 10:54
我经常使用的程序。非常灵敏!定时器3毫秒以内都毫不拖泥带水。
sbit EC11_A = P3^5;           //EC11 A ...

刚试了代码非常稳定可靠!谢谢分享!!!
ID:30165 发表于 2025-2-20 10:54
我经常使用的程序。非常灵敏!定时器3毫秒以内都毫不拖泥带水。
sbit EC11_A = P3^5;           //EC11 A端
sbit EC11_B = P3^3;           //EC11 B端
void EC11_Display()
{
   static bit EC11_Flag=0,Left_Flag=0,Right_Flag=0;

   if((EC11_A)&&(EC11_B))//两个都是1,表示开始第一个脉冲
     {
       EC11_Flag =1 ;//标记为第一个信号收到,可以进行下一个信号
      }

    if(EC11_A!=EC11_B)//第二个信号
     {
       Left_Flag = EC11_A ; //记录AB的信号状态
       Right_Flag = EC11_B ;
      }

    if(EC11_Flag)
     {
       if((EC11_A==0)&&(EC11_B==0))// 第三个信号,处理第二个信号的值
         {
           if(Right_Flag)//右转
          {
                //自己程序      
          }
     else if(Left_Flag) //左转
         {                             
             //自己程序
          }
         EC11_Flag = 0; //把标志位清零,等待下一个周期
       }
    }       
}
ID:471574 发表于 2025-2-19 15:59
邰夏留 发表于 2025-2-18 09:57
请教一下楼主,这个怎么消抖的呢?

我用的是模块,应该是加了电容消抖。软件消抖这个不好处理,你可以测试下,不消抖有什么问题
ID:79034 发表于 2025-2-18 09:57
zyhlove813 发表于 2023-12-13 23:11
同时贴上lkc8210发表的算法:
//算法四: 编译大小不错,只适合单倍频
uint8_t KeyA_Last;

请教一下楼主,这个怎么消抖的呢?
ID:471574 发表于 2024-11-14 11:34
kkfy888 发表于 2024-11-10 21:39
看了up的视频,特意搜了关键字找到了^_^

有心了
ID:98767 发表于 2024-11-10 21:39
看了up的视频,特意搜了关键字找到了^_^
ID:479134 发表于 2024-11-6 12:25
讲解的思路真的很清晰啊
ID:433219 发表于 2024-10-7 16:32
编码器,判断谁先跳变,就当起始
ID:228467 发表于 2024-7-19 18:49
zyhlove813 发表于 2024-7-10 13:28
这么特异的算法都沉底了

没有沉,都在学习中。感谢大佬分享的算法
ID:63692 发表于 2024-7-19 14:35

楼主钻研精神可嘉,向你学习。
ID:471574 发表于 2024-7-10 13:28
这么特异的算法都沉底了
ID:471574 发表于 2024-1-16 18:04
youlinys 发表于 2023-12-31 21:35
讲解得很详细。UP厉害人。

通过不同的方法去实现目标,可能锻炼自己的思维能力
ID:983641 发表于 2023-12-31 21:35
讲解得很详细。UP厉害人。
ID:604453 发表于 2023-12-26 09:43
zyhlove813 发表于 2023-12-25 21:04
正常应该是要的,我是网购的模块,带电阻和电容滤波,不硬件滤波,你自己可以试下。

好的,我去试一下,谢谢!
ID:471574 发表于 2023-12-25 21:04
lzuoxin 发表于 2023-12-25 18:09
楼主的算法还需要硬件消抖电路吗

正常应该是要的,我是网购的模块,带电阻和电容滤波,不硬件滤波,你自己可以试下。
ID:604453 发表于 2023-12-25 19:14
代码精简高效,向楼主学习了
ID:604453 发表于 2023-12-25 18:09
楼主的算法还需要硬件消抖电路吗
ID:471574 发表于 2023-12-25 13:07
发表于 2023-12-24 19:28
楼主钻研精神可嘉,学习了。

共同学习
ID:537530 发表于 2023-12-24 19:28
楼主钻研精神可嘉,学习了。
ID:514317 发表于 2023-12-16 10:42
zyhlove813 发表于 2023-12-14 13:08
编译什么提示?我是keil4 C51 编译正常,会不会少了个括号标点之类的?

刚才看了下   是我定义的变量的问题    我的变量都是BIT 位类型的   编译就出错
楼主使用的是u8类型的   
ID:514317 发表于 2023-12-16 10:27
zyhlove813 发表于 2023-12-14 13:08
编译什么提示?我是keil4 C51 编译正常,会不会少了个括号标点之类的?

APP_EC11.C(59):C193: '-': BAD OPERAND TYPE
后段那个 减号   拆成2段就正常了
ID:417804 发表于 2023-12-15 09:54
小白只能顶楼主
ID:471574 发表于 2023-12-14 13:08
lzzasd 发表于 2023-12-14 11:56
经过测试   楼主的程序运行稳定    算法精简高效    感谢楼主
只是 (int)((KeyA_Last ^ KeyA_Now) - (KeyB ...

编译什么提示?我是keil4 C51 编译正常,会不会少了个括号标点之类的?
ID:514317 发表于 2023-12-14 11:56
经过测试   楼主的程序运行稳定    算法精简高效    感谢楼主
只是 (int)((KeyA_Last ^ KeyA_Now) - (KeyB_Last ^ KeyB_Now)这段编译报错   只好拆成2段
我也贴上我常用的   也是很稳定


if (PinA != PinA_O)        //当A发生跳变时采集B当前的状态,并将B与上一次的状态进行对比。
        {                                   //若A 0->1 时,B 1->0 正转;若A 1->0 时,B 0->1 正转;
                                                                                //若A 0->1 时,B 0->1 反转;若A 1->0 时,B 1->0 反转
                if (PinA == 1)     //EC11_A和上一次状态相比,为上升沿
                {
                if ((PinB_O == 1) && (PinB == 0))   //EC11_B和上一次状态相比,为下降沿
                        encoder_data++;                         //正转
                if ((PinB_O == 0) && (PinB == 1))   //EC11_B和上一次状态相比,为上升沿               
                        encoder_data--;                        //反转
                //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//
                if ((PinB_O == PinB) && (PinB == 0))  //A上升沿时,采集的B不变且为0
                    encoder_data++;                                 //正转
                if ((PinB_O == PinB) && (PinB == 1))  //A上升沿时,采集的B不变且为1
                        encoder_data--;                                //反转
                }

                else                    //EC11_A和上一次状态相比,为下降沿
                {
                if ((PinB_O == 1) && (PinB == 0))   //EC11_B和上一次状态相比,为下降沿
                        encoder_data--;                        //反转
                if ((PinB_O == 0) && (PinB == 1))   //EC11_B和上一次状态相比,为上升沿
                        encoder_data++;                         //正转
                //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理<<<<<<<<<<<<<<<<//
                if ((PinB_O == PinB) && (PinB == 0))  //A上升沿时,采集的B不变且为0
                    encoder_data--;                                //反转
                if ((PinB_O == PinB) && (PinB == 1))  //A上升沿时,采集的B不变且为1   
                        encoder_data++;                                 //正转
                }
                PinA_O = PinA;   //更新编码器上一个状态暂存变量
                PinB_O = PinB;   //更新编码器上一个状态暂存变量
ID:156220 发表于 2023-12-14 10:14
讲解的蛮详细的,谢谢楼主的分享
ID:1064915 发表于 2023-12-14 08:28
好文章,需要认真学习
ID:471574 发表于 2023-12-13 23:11
同时贴上lkc8210发表的算法:
//算法四: 编译大小不错,只适合单倍频
uint8_t KeyA_Last;
uint8_t KeyB_Last;
uint8_t KeyA_Now;
uint8_t KeyB_Now;
int EC_Counter;

void Encoder_Ini()
{
    KeyA_Last = P10;
    KeyB_Last = P11;
}

void Encoder_Run()
{
        KeyA_Now=P10;
        KeyB_Now=P11;
        if(!KeyA_Now && KeyA_Last && KeyB_Now)
        {
                EC_Counter++;
  }
        KeyA_Last=KeyA_Now;
        if(!KeyB_Now && KeyB_Last && KeyA_Now)
        {
                EC_Counter--;
  }
        KeyB_Last=KeyB_Now;
}

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表