找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: lkc8210
打印 上一主题 下一主题
收起左侧

一定位一脉冲的EC11旋转编码器最简洁的单片机驱动代码

  [复制链接]
41#
ID:433219 发表于 2023-9-22 19:34 | 只看该作者
一般方法:先判断跳变(同时触发抖动计时连续判断),再判断另一个io的高低,
回复

使用道具 举报

42#
ID:965189 发表于 2023-9-22 23:34 | 只看该作者
我用一个外中断,使用正常。
回复

使用道具 举报

43#
ID:427868 发表于 2023-9-25 15:48 | 只看该作者
以下是我之前采用拿来主义得到的,只对判断后执行部分稍作修改,应用还不错。
/************************参数设置***************************/
void        canshu()                                //EC11旋转编码器一定位一脉冲
{
        static bit LastA = 0;                 //EC11旋转编码器的A引脚上一次的状态
        static bit LastB = 0;                //EC11旋转编码器的B引脚上一次的状态
               
  if(KA != LastA)                         //判断EC11旋转编码器A引脚是否等于上一次的状态
  {
    if(KA == 0)                                //EC11旋转编码器旋转后,判断KA是否是低电平状态
         {
                if(KB)                         //判断KB引脚当前状态,高电平则为正转
                        {num++;}                                                
                else
                        {num--;}                                                       
         }       
     LastA = KA;                         //更新编码器上一个状态暂存变量
     LastB = KB;                         //更新编码器上一个状态暂存变量
   }
}

现在看来LsaB变量似乎没有用,有空了去掉它试试。对于正反向不同的EC11,我是通过调换num变量的加减方向来解决的。
回复

使用道具 举报

44#
ID:378108 发表于 2023-9-28 09:49 | 只看该作者
haokey 发表于 2021-7-7 12:20
探讨一下,假如我改成这样会怎样:
if(!PinA&&PinB)
{PinA_O= 1;}

你这样是不行的,会重复的加或减
回复

使用道具 举报

45#
ID:378108 发表于 2023-9-28 09:57 | 只看该作者
  unsigned char key=0;
  static bit nextA;
  if (KA()!=nextA)
    {nextA=KA();
      if (nextA==1)
        {if (KB()==1) key=6;else key=5;}
      else
        {if (KB()==0) key=6;else key=5;}
    }
return key;
回复

使用道具 举报

46#
ID:1053178 发表于 2023-11-25 19:55 | 只看该作者
刘佑红 发表于 2023-9-25 15:48
以下是我之前采用拿来主义得到的,只对判断后执行部分稍作修改,应用还不错。
/************************ ...

我跟你用的一样,但是发现转快了丢码,慢很好
回复

使用道具 举报

47#
ID:103411 发表于 2023-11-29 14:12 | 只看该作者
下载学习一下,正准备用这个一定位一脉冲编码器。
回复

使用道具 举报

48#
ID:427868 发表于 2023-11-29 15:01 | 只看该作者
diyage 发表于 2023-11-25 19:55
我跟你用的一样,但是发现转快了丢码,慢很好

你说的这种情况,确实存在,也不能旋转过快,且在部分EC11上表现明显,即存在挑EC11现象,,后来我尝试将KB对地接的104电容换成105的就改善了,也不挑EC11了,你可试试。
回复

使用道具 举报

49#
ID:688905 发表于 2023-11-29 16:40 | 只看该作者
很好的优化方法,学习了!
回复

使用道具 举报

50#
ID:471574 发表于 2023-12-14 17:37 | 只看该作者
楼主的代码很不错,我这边有另一种算法,也很精简EC11编码器基于运算解码的算法(原创),汇编后大小也基本一样,有一个算法甚至更小
回复

使用道具 举报

51#
ID:774081 发表于 2024-1-19 14:17 | 只看该作者
完美的代码效果应该是转动一下只计数一下,不能多增也不能不增,最重要的是!不论转得多快还是多慢,都如此,那才是好代码!从这个标准来说,我试验了上10款作者自诩为非常不错的代码,均不合格!当然我自己也编不出合格的代码来,一度怀疑是我买的EC11编码器在硬件方面不合格,因为只有上拉电阻。没有消抖电容。但符合这样标准的编码器效果是普遍存在的,比如十几、二十年前的进口功放机,就采用了旋转编码器调整音量,那编码器的使用效果才是我追求的,现在我的一个项目卡在编码器上,怎么都不好用,肯定采用中断来实现,还没找到合适的代码,下一步寄加消抖电容看看谁的代码最理想,再来汇报。
回复

使用道具 举报

52#
ID:1101997 发表于 2024-1-19 14:51 | 只看该作者
这东西还是需要用状态机来写,只要描述好正常状态迁移的关系,异常状态处理,硬件上消抖不消抖都是可以处理好的。
回复

使用道具 举报

53#
ID:430492 发表于 2024-1-19 14:56 | 只看该作者
要想多快都不丢步(相对哈,快到中断处理都来不及不算哈),必须在中断里来处理。这种中断+轮询判断的方式,依然会丢步的。
回复

使用道具 举报

54#
ID:774081 发表于 2024-1-26 16:36 | 只看该作者
之前测试很多代码,效果均不理想,表现为正转、反转有误判,从而导致计数不对。我想到的办法是得到方向数据后(比如正转定义为1,反转定义为0),先修正方向,再结合中断和方向二者,决定是否累加或累减计数值。方案是建立一个数组,包括10个元素,用来存储获得的方向,任何时刻记录的是最近十次获得的方向数据,对数组的10个元素进行累加,和超过5时,强制为正方向,反之为负方向。实测效果有所改善,计数值绝不会忽大忽小、重复出现等情况了。遗憾的是如果你反复正转、反转1下,那计数还是会有问题,即不会保持不变。但这种使用场景很少见吧?真要微调,你多转几下,再反过来多转几下就行。有人会说,实际卡顿感与计数反映会不同步吧?理论上讲是这样,但单片机速度很快,实际感觉不到不同步。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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