数码之家

 找回密码
 立即注册
搜索
查看: 6895|回复: 17

[C51] 初学C语言---分享EC11编码器的程序

[复制链接]
发表于 2021-8-13 23:37:21 | 显示全部楼层 |阅读模式
本帖最后由 广东梁百万 于 2021-8-14 08:47 编辑

初学C语言,分享一个我自己写的成功案例:EC11编码器的程序,   欢迎高手点评指教。
经测试,快或慢转动时都能正常计数,但如果很暴力那种快就识别不了。
电路见图1,电容实际用的是103(10n),
原理:正转时,A端先低电平,再到B端低电平,过一段时间后两者都是高电平,这里就是读取从其中一个是低电平到同时高电平这过渡状态从而判断正反转,看图2

编程算法:用定时器中断,每1ms就把EC11的A端和B端移入变量EC11_AB里面,跟着判断正反转,过渡前过渡后各读两次,如果是01011111(0x5f)那就是正转,10101111(0xaf)是反转。

单片机使用的是STC8G1K08



图1




图2




  1. sbit EC11_A = P1^6;           //EC11 A端
  2.         sbit EC11_B = P1^7;           //EC11 B端
  3.         sbit EC11_D = P5^4;           //EC11 压按开关


  4.           //------EC11编码器相关的数组和变量

  5.                 unsigned char xdata EC11_AB=0x00;    //ec11的AB端定时扫描输入
  6.                 unsigned char xdata EC11_AOUT=0;    //ec11的A端状态
  7.                 unsigned char xdata EC11_BOUT=0;    //ec11的B端状态
  8.          //--------------------
  9.              void EC11SM();//EC11输入扫描函数声明
  10.                  void EC11CL();//EC11处理函数声明

  11.            //------------------------

  12.          void main()
  13.         {

  14.     P0M0=0x00;             //初始化
  15.     P0M1=0x00;
  16.     P1M0=0x00;
  17.     P1M1=0x00;
  18.     P2M0=0x00;
  19.     P2M1=0x00;
  20.     P3M0=0x00;
  21.     P3M1=0x00;
  22.     P5M0=0x00;
  23.     P5M1=0x00;

  24.          AUXR |= 0x04;                //定时器时钟1T模式
  25.         T2L = 0x9A;                //设置定时初值
  26.         T2H = 0xA9;                //设置定时初值
  27.         AUXR |= 0x10;                //定时器2开始计时
  28.         IE2 = 0x04;         
  29.         EA = 1; //中断使能        
  30.          

  31.          //主函数//********************
  32.         while (1)       //下面重复循环
  33.         {


  34.           EC11CL();//EC11处理函数


  35.           }   
  36.           }





  37.                 //* 定时器2中断服务函数 */
  38.                 void InterruptTimer2() interrupt 12
  39.                 {
  40.                
  41.         
  42.                 EC11SM();//EC11输入扫描函数


  43.                     }




  44.                         //EC11输入扫描函数
  45.                         void EC11SM()
  46.                         {
  47.                          EC11_AB=(EC11_AB<<1)|EC11_A;    //把EC11的A端值移入
  48.                          EC11_AB=(EC11_AB<<1)|EC11_B;    //把EC11的B端值移入
  49.                          if(EC11_AB==0x5f)
  50.                          {
  51.                           EC11_AOUT=1;                  //正转时就置A端状态为1
  52.                           }
  53.                          if(EC11_AB==0xaf)
  54.                          {
  55.                          EC11_BOUT=1;                  //正转时就置B端状态为1
  56.                          }
  57.                          else;
  58.                          }

  59.                         //EC11处理函数
  60.                         void EC11CL()
  61.                         {
  62.                          if(EC11_AOUT==1)
  63.                          {
  64.                                                 //************这里是正转时需要执行的内容*******
  65.                         
  66.                           EC11_AOUT=0;
  67.                           }

  68.                          if(EC11_BOUT==1)
  69.                          {
  70.                                                 //***********这里是反转时需要执行的内容*********
  71.                           
  72.                           EC11_BOUT=0;
  73.                           }
  74.                          else;
  75.                          }





复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +10 收起 理由
家睦 + 10

查看全部打赏

发表于 2021-8-14 03:51:51 | 显示全部楼层
傻孩子,都这年头了,你家没通网吗?不是应该先看看网上的优秀方法吗?
单片机能采样上升下降沿中断,然后在中断中进行判断是正转还是反转,还能去除抖动。
你这方法自己都发现旋快了无效了,所以不能作为最后的选择,继续优化吧。
回复 支持 3 反对 0

使用道具 举报

发表于 2021-8-14 08:54:21 | 显示全部楼层
本帖最后由 chenppo 于 2021-8-14 09:01 编辑


  • EC11_AB=(EC11_AB<<1)|EC11_A;    //把EC11的A端值移入
  • EC11_AB=(EC11_AB<<1)|EC11_B;    //把EC11的B端值移入
在快速旋转时,移入速度跟不上了,会有有识别不了或者正反转跳动的情况。加个判断:只要AB相同时为0时,重新移入。
如果不像楼上那样用外中断来判断的话【毕竟需要浪费外中断资源】,这个1mS检测一次间隔稍微长了点,我现在稳定使用的是200uS检测一次。
至少旋转起来不管快慢的效果都是很好的。


打赏

参与人数 2家元 +18 收起 理由
广东梁百万 + 8
家睦 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-14 12:30:19 | 显示全部楼层

把定时移入时间调小到0.5ms,再暴力的速度都能识别。只是日常使用也没有这么快的旋转,还考虑那个1ms中断还做其他事,所以我就把时间定在1ms
回复 支持 反对

使用道具 举报

发表于 2021-8-15 21:26:56 | 显示全部楼层
sbit FSA   = P3^7; //右旋
sbit FSB   = P3^5; //左旋
uint8_t fsss=0;//按钮状态
//检测
void EC11(void)
{
        if(FSA==1 && FSB==1) {//没有旋转
                fsss=0;
                return;
        } else if(FSA==0 && FSB==1 && fsss==0) {
                fsss='R'; //可能是右旋
        } else if(FSA==1 && FSB==0 && fsss==0) {
                fsss='L'; //可能是左旋
        } else if(FSA==0 && FSB==0 && fsss!=0xFF) {
                if(fsss=='L') {
                        //处理左旋
                        fsss = 0xFF;
                } else if(fsss=='R') {
                        //处理右旋
                        fsss = 0xFF;
                }
        }
}
回复 支持 2 反对 0

使用道具 举报

发表于 2021-8-17 15:12:00 | 显示全部楼层
俺们都是开一个中断下降沿判断另一个的电平高低
回复 支持 反对

使用道具 举报

发表于 2022-4-14 01:06:00 | 显示全部楼层
这个好好学习,近来要用到编码器。
回复 支持 反对

使用道具 举报

发表于 2022-4-22 06:57:16 来自手机浏览器 | 显示全部楼层
用编码器记数,左加右减,闭眼左旋右旋然后回到原来的位置,数值不变,觉得这样算可用
回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-25 16:43:13 | 显示全部楼层
hewayking 发表于 2021-8-17 15:12
俺们都是开一个中断下降沿判断另一个的电平高低

这是正交解码的正确逻辑.
回复 支持 反对

使用道具 举报

发表于 2022-7-13 21:17:15 | 显示全部楼层
这个旋钮开关很有用, 有些电磁炉就用这个来控制,按一下开机,左旋右旋调功率,再按一下调倒计时
回复 支持 反对

使用道具 举报

发表于 2022-12-22 13:03:12 | 显示全部楼层
太麻烦了, 直接找arduino的EC11的库打开看就行了
回复 支持 反对

使用道具 举报

发表于 2022-12-27 16:22:29 | 显示全部楼层
你这个编码器电路不好,正转消抖可以,反转消抖几乎没有。应该用RC消抖电路,多加2个电阻。
回复 支持 反对

使用道具 举报

发表于 2023-1-3 12:59:57 | 显示全部楼层
谢谢分享,把我的编码器开关也翻出来折腾一下
回复 支持 反对

使用道具 举报

发表于 2023-1-3 14:42:27 | 显示全部楼层
要不怎么你是高手呢,我还是觉得很好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-3 17:25:11 | 显示全部楼层
runber3 发表于 2022-12-27 16:22
你这个编码器电路不好,正转消抖可以,反转消抖几乎没有。应该用RC消抖电路,多加2个电阻。 ...

这个电路和程序在后面我自制的3个定时器上使用,效果理想。
回复 支持 反对

使用道具 举报

发表于 2023-1-3 19:15:54 | 显示全部楼层
广东梁百万 发表于 2023-1-3 17:25
这个电路和程序在后面我自制的3个定时器上使用,效果理想。

中速和慢速没问题,快速会错码。
回复 支持 反对

使用道具 举报

发表于 2025-4-2 12:33:48 来自手机浏览器 | 显示全部楼层
广东梁百万 发表于 2023-1-3 17:25
这个电路和程序在后面我自制的3个定时器上使用,效果理想。

厉害啊,一直想做这个
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 04:01 , Processed in 0.156000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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