if(!PinA && PinA_O && PinB) {
Now++;
}PinA_O = PinA;
if(!PinB && PinB_O && PinA) {
Now--;
}PinB_O = PinB;
只有六行代碼就能用EC11對Now進行加減操作
为什么这样写呢?
上时序图
顺时针转:
逆时针转:
我们看到,当顺时针转时
Pin A会早于Pin B 转低电平,反之亦然
代码解读:
!PinA && PinA_O && PinB//当Pin A 为低电平而之前为高电平(即下降沿)并且Pin B为高电平
这一句就捕捉到顺时针转时序图中箭指着的那一刹那的情况
于是Now加1
!PinB && PinB_O && PinA//当Pin B 为低电平而之前为高电平(即下降沿)并且Pin A为高电平
这一句就捕捉到逆时针转时序图中箭指着的那一刹那的情况
于是Now减1
如果编码器不加电容消抖
就用软件消抖
if(ScanCount++ > 50) { //其数值按单片机速度加减
ScanCount = 0;
if(PinA && !PinA_O && PinB) {
Now++;
}PinA_O = PinA;
if(PinB && !PinB_O && PinA) {
Now--;
}PinB_O = PinB;
Now>9? Now = 0:_nop_();
Now<0? Now = 9:_nop_();
}
现附上小应用实例一则
基如STC15F104E的EC11软串口六位密码检查程序
如发现顺逆时针相反,对调PinA/PinB 定义脚即可
|