我的光电编码盘,上次已经发过帖子了,但问题还是没有解决掉,这次通过对编码盘的从新学习,又有了些了解,这次从新求教:
上面有三个光开,组成八种状态,我分析了下波形,是用格雷码编码的,这是波形图:
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 {}
请教了,我只想利用这个编码盘纠正行程,不让行程漂移 |