本帖最后由 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;
- }
|