本帖最后由 lxyppc 于 2009-10-30 09:51 编辑
/**
不妨设旋转编码器的输出波形如下
______ ______ ______ ______
正转时: A相 __| |______| |______| |______|
______ ______ ______ ___
B相 ______| |______| |______| |______|
低位为A相 01 11 10 00 01 11 10 00 01 11 10 00 01 11
______ ______ ______ ______
反转时: A相 ______| |______| |______| |______|
______ ______ ______ ___
B相 __| |______| |______| |______|
低位为A相 10 11 01 00 10 11 01 00 10 11 01 00 10 11
A相接在某端口上,对应检测代码为 if((REG32(P4SIN) & (1<<3))) PhaseShift |= 0x01;
B相接在某端口上,对应检测代码为 if((REG32(P1SIN) & (1<<2))) PhaseShift |= 0x02;
PhaseShift的<1:0>两位表示当前AB两相的状态,<3:2>两位表示上一次AB两相的状态
正转时,AB相变化顺序为 01->11->10->00->01 低位为A相
因此正转时,PhaseShift的低四位值为 0111 1110 1000 0001
反转时,AB相变化顺序为 10->11->01->00->10 低位为A相
因此反转时,PhaseShift的低四位值为 1011 1101 0100 0010
*/
/* 假设正转为减,反转为加,则可得如下一表 */
const u8 table_Phase[16]=
{
phase_no_move, // 0000 未转动
phase_dec, // 0001 正转
phase_inc, // 0010 反转
phase_bad, // 0011 不可能
phase_inc, // 0100 反转
phase_no_move, // 0101 未转动
phase_bad, // 0110 不可能
phase_dec, // 0111 正转
phase_dec, // 1000 正转
phase_bad, // 1001 不可能
phase_no_move, // 1010 未转动
phase_inc, // 1011 反转
phase_bad, // 1100 不可能
phase_inc, // 1101 反转
phase_dec, // 1110 正转
phase_no_move, // 1111 未转动
};
/* 根据PhaseShift的低四位值来查此表即可得转动方向 */
PhaseShift &= 0x0f;
if(table_Phase[PhaseShift] == phase_inc) PhaseCount++;
if(table_Phase[PhaseShift] == phase_dec) PhaseCount--;
/* 当同一方向上的转动次数为4次时,才认为是一次有效的转动,达到了去抖的目的 */
if(PhaseCount > 3)
{
PhaseCount -= 4;
return phase_inc;
}
else if(PhaseCount < -3)
{
PhaseCount += 4;
return phase_dec;
}
|