EC11编码器识别程序——有时不准确,请达人指点
我编了一个EC11系列编码器的识别程序(汇编语言,不会C啊),但是有时不准确。不使用中断,直接程序识别。
目的:测试编码器;
硬件连接:编码器的AB信号直接输入到P1.0和P1.1。AB端用10K上拉,对地用0.1u电容去抖动。
恳请达人指点。谢谢!
E11TST: ;P1.0--E11A,P1.1--E11B
;顺时针:AB=11,01,00,10/D2H;逆时针:AB=11,10,00,01/E1H
;使用资源:A,B,R1,R2,ABH
MOV B,#03H
MOV A,P1 ;1
ANL A,#03H ;取低2位
MOV R1,A
MOV ABH,A
XRL A,#03H
JZ E11TST1 ;ABH=03H, GO
RET ;ABH<>03H
E11TST1:
MOV A,P1
ANL A,#03H
MOV R2,A ;2,3,4
XRL A,R1
JZ E11TST1 ;R1=R2, GO
MOV A,ABH
RL A
RL A
ADD A,R2
MOV ABH,A
MOV A,R2
MOV R1,A
DJNZ B,E11TST1
MOV A,ABH
XRL A,#0D2H
JNZ E11TST2 ;ABH<>D2H, GO
INC ABHN ;ABH=D2H,顺时针------------------
AJMP E11TST3
E11TST2:
MOV A,ABH
XRL A,#0E1H
JNZ E11TSTEND ;ABH<>E1H(&ABH<>D2H)
DEC ABHN ;ABH=E1H,逆时针-----------------
E11TST3:
E11TSTEND:
RET
本帖最后由 Lpdengsh 于 2012-5-25 10:02 编辑
不懂汇编传个STM32的C程序可以参考一下
/*
函数:EC11_1_Read()
功能:EC11旋转读取
参数:无
返回:EC11_1_State
为真 正转 假反转
*/
bool EC11_1_Read(void)
{
EC11_IORead();
if(BMA1&&BMB1)
flag1=1;
if(flag1==1)
{
if((BMA1==0)&&(BMB1==0))
{
if(Last_BMB1_status)
{
flag1=0;
EC11_1_State=TRUE;
}
if(Last_BMA1_status)
{
flag1=0;
EC11_1_State=FALSE;
}
}
}
Last_BMA1_status=BMA1;
Last_BMB1_status=BMB1;
return EC11_1_State;
}
bool EC11_2_Read(void)
{
EC11_IORead();
if(BMA2&&BMB2)
flag2=1;
if(flag2==1)
{
if((BMA2==0)&&(BMB2==0))
{
if(Last_BMB2_status)
{
flag2=0;
EC11_2_State=TRUE;
}
if(Last_BMA2_status)
{
flag2=0;
EC11_2_State=FALSE;
}
}
}
Last_BMA2_status=BMA2;
Last_BMB2_status=BMB2;
return EC11_2_State;
}
又认真研究了手里的EC编码器,有如下体会与大家分享:
E11TST: ;P1.0--E11A,P1.1--E11B
;顺时针:AB=11,01,00,10/D2H;逆时针:AB=11,10,00,01/E1H
;起始稳定状态为11(P1.0=1,P1.1=1)
;测试用0010、0001来识别
;单稳态:11态的AB相位变换:顺时针:AB=11,01,00,10;逆时针:AB=11,10,00,01
; 11态的AB相位变换:顺时针:AB=11,00,01; 逆时针:AB=11,01,00(12点,无开关,体积比较大的)
;双稳态:11态的AB相位变换:顺时针:AB=11,01,00; 逆时针:AB=11,10,00
; 00态的AB相位变换:顺时针:AB=00,10,11; 逆时针:AB=00,01,11
;手里有的EC编码器都可以用了!!
MOV B,#0C8H ;C8=200,200*1mS=200mS
MOV A,P1 ;1/00B
ANL A,#03H ;取低2位
MOV R1,A
MOV ABH,A
XRL A,#00H
JZE11TST1 ;ABH=00H/00B, GO
AJMP E11TST3 ;ABH<>00H
E11TST1:
ACALL DL1MS ;1mS延时
MOVA,P1
ANLA,#03H
MOVR2,A ;2/01B,10B
XRLA,R1
JNZE11TSTQ ;R1<>R2, GO
DJNZ B,E11TST1;R1=R2=00, GO
AJMP E11TST3 ;200mS内没有收到下一个变化则推出
E11TSTQ:
MOV A,ABH
RL A
RL A
ADD A,R2
MOV ABH,A
MOVA,R2
XRLA,#02H
JZ EC11INC ;R2=10B/0010,顺时针,GO
MOVA,R2
XRLA,#01H
JZ EC11DEC ;R2=01B/0001,逆时针,GO
AJMP E11TST3
EC11INC:
INC ABHN ;ABH=02H,顺时针------------------
AJMP E11TST3
EC11DEC:
DEC ABHN ;ABH=01H,逆时针-----------------
;----------------------------------------------
E11TST3:
E11TSTEND:
RET
最近要用,先标记一下
页:
[1]