打印

请教绝对编码和格雷码的应用

[复制链接]
2495|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我的光电编码盘,上次已经发过帖子了,但问题还是没有解决掉,这次通过对编码盘的从新学习,又有了些了解,这次从新求教:
  上面有三个光开,组成八种状态,我分析了下波形,是用格雷码编码的,这是波形图:
file:///D:/Program%20Files/QQ2009/Users/285904148/Image/Z0S6T$BYNFR3U1Q%7D0RNF0BS.jpg
        编码盘在应用中转的角度只能小于360度,否则格雷码就重复了,这特征又符合绝对编码盘的特征
我用电机带动门,如果编码盘转到一圈,门要走差不多4m,这是极限了,不能超过4m了
我是想用这个编码盘进行行程纠正,也就是说,门在运行中行程会往上或者往下偏移,但门的上下限位距离还是没变,只是行程漂移了,想利用编码盘进行纠正,比如编码盘走到某个位置的时候,就认为那个位置在行程上是第100个脉冲,(我是通过数齿轮脉冲数设置行程长短的),把这个脉冲数赋值给实时脉冲变量,这样行程就会得到纠正
     我利用的是那八种状态改变的边沿来赋值给脉冲变量的,但我实际运行中,并不是每次设置的行程都能得到纠正,可能这次设置的行程,在运行的时候可以修正,但若从新设置个行程的时候就不一定能修正了,不知道是扎回事?我检查边沿的程序现在也贴出来:
其中zt是当前状态,zt_old是上次的状态,gkbz是边沿的编号



     zt=0;
         if(PDR6_P61==1) zt=zt|00000100;
         if(PDR6_P60==1) zt=zt|00000010;
         if(PDR0_P07==1) zt=zt|00000001;

  if(zt_old!=zt)
   {
       if(zt==3)
              {
              if(zt_old==7)      gkbz=7;
              else if(zt_old==2) gkbz=3;
              else               gkbz=9;
              }
       else if(zt==7)
              {
              if(zt_old==5)      gkbz=5;
              else if(zt_old==3) gkbz=7;
              else               gkbz=9;
              }
       else if(zt==5)
              {
              if(zt_old==1)      gkbz=1;
              else if(zt_old==7) gkbz=5;
              else               gkbz=9;
              }
       else if(zt==1)
              {
              if(zt_old==0)      gkbz=0;
              else if(zt_old==5) gkbz=1;
              else               gkbz=9;
              }
       else if(zt==0)
              {
              if(zt_old==4)      gkbz=4;
              else if(zt_old==1) gkbz=0;
              else               gkbz=9;
              }
       else if(zt==4)
              {
              if(zt_old==6)      gkbz=6;
              else if(zt_old==0) gkbz=4;
              else               gkbz=9;
              }
       else if(zt==6)
              {
              if(zt_old==2)      gkbz=2;
              else if(zt_old==4) gkbz=6;
              else               gkbz=9;
              }
       else if(zt==2)
              {
              if(zt_old==3)      gkbz=3;
              else if(zt_old==6) gkbz=2;
              else               gkbz=9;
              }
       else gkbz=9;
       zt_old=zt;
   }
   else {}



请教了,我只想利用这个编码盘纠正行程,不让行程漂移

相关帖子

沙发
chenyongand|  楼主 | 2010-8-19 17:31 | 只看该作者

使用特权

评论回复
板凳
chenyongand|  楼主 | 2010-8-19 17:33 | 只看该作者
[localimg=339,191]1[/localimg]


波形图再来一次:

使用特权

评论回复
地板
chenyongand|  楼主 | 2010-8-19 17:35 | 只看该作者
波形.jpg (25.96 KB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

514

帖子

8

粉丝