旋转编码器,很感兴趣,留意这个贴,差不多快2年了。
最近弄到了一个编码器样品,尝试编了一个程序。程序功能是这样:若发生正转,就亮一下正转指示灯,若发生反转,就亮一下反转指示灯,若停着不转,灯都熄灭。
首先,用示波器,看一下:这正转/反转,A相和B相到底是怎么样的波形。
算是看出了名堂,原来手头这款旋转编码器,发生正转时,A相始终比B相早发生跳变,到高电平。即使旋得非常快,A相也比 B相早3ms -5ms,跳到高电平。
发生反转时,B相始终比A相早发生跳变,到高电平。即使旋得非常快,B相也比 A相早3ms -5ms,跳到高电平。
程序框架按这样设计:做一个时间轮片函数,每隔1.5ms, 在主函数里启动编码器的扫描函数。同时,还设置了A相和B相电平【过去】与【当前】的状态变量。至于如何判断是正转或反转。是用了这么一段的代码:
/*****************************************************
函数功能:编码器扫描函数
***************************************************/
void Encoder_scan(void)
{
if(Encoder_enable) //若扫描编码器使能
{
A_Currentstate=Encoder_A;//扫描并获取当前A相电平,
B_Currentstate=Encoder_B;
if(A_Currentstate!=A_Laststate)
{
if((B_Currentstate==0)&&(A_Currentstate==1)) //A相发生跳变,且B相滞后,仍是0电平,为正转
{
Turn_Valve=0x01; //扫描后标记为顺时针
}
}
else if(B_Currentstate!=B_Laststate)
{
if((A_Currentstate==0)&&(B_Currentstate==1)) //B相发生跳变,且A相滞后,仍是0电平,为反转
{
Turn_Valve=0x00; //扫描后标记为逆时针
}
}
else if((A_Currentstate==A_Laststate)&&(B_Currentstate==B_Laststate)) //扫描到未发生转动
{
Turn_Valve=0x02; //扫描后标记为静止
}
}
A_Laststate=A_Currentstate;
B_Laststate=B_Currentstate;
Encoder_enable=0; //释放使能,等待下一次扫描
}
调试后,发现能快速判断正转/反转,不会有异常。转快转慢,也可以
|