本帖最后由 zlf0146 于 2014-1-12 13:14 编辑
当采用新买的增量式编码器(1000线)输出的A、B、I作为输入的信号时,手动转动编码器的转轴一圈时,发现EQep1Regs.QPOSCNT的值只有200多,正常应该有1000x4=4000,如果轴转得慢一点的话,EQep1Regs.QPOSCNT的值也会大一点,但远远没有达到4000。多转几圈的话,EQep1Regs.QPOSCNT的 值也并没有达到4000,基本是一圈200多递增,回转的时候也不递减,还是递增。
用其他的芯片检测该增量式编码器信号时,则一切正确,证明该增量式编码器本身是工作正常的。
以下是QEP寄存器的设置:
void PosSpeed_Init(void)
{
#if (CPU_FRQ_150MHZ)
EQep1Regs.QUPRD=1500000; / Unit Timer for 100Hz at 150 MHz SYSCLKOUT =10ms
#endif /在150MHz系统时钟下产生100Hz的单位时间值,即让qep10ms产生一次timeout中断
#if (CPU_FRQ_100MHZ)
EQep1Regs.QUPRD=1000000; // Unit Timer for 100Hz at 100 MHz SYSCLKOUT
#endif
EQep1Regs.QPOSCNT = 0;
EQep1Regs.QDECCTL.bit.QSRC=00;// QEP quadrature count mode 求积计数模式:产生方向和4倍频的时钟
EQep1Regs.QDECCTL.bit.XCR=0; // 2x resolution (cnt falling and rising edges)
EQep1Regs.QDECCTL.bit.SWAP=0;
EQep1Regs.QDECCTL.bit.IGATE=1; //该位置1后,连索引脉冲都过滤了
EQep1Regs.QDECCTL.bit.QAP=0;
EQep1Regs.QDECCTL.bit.QBP=0;
EQep1Regs.QDECCTL.bit.QIP=0;
EQep1Regs.QDECCTL.bit.QSP=0;
EQep1Regs.QEPCTL.bit.FREE_SOFT=2; //自然地动作
EQep1Regs.QEPCTL.bit.PCRM=00; // 每次索引事件产生时QPOSCNT复位
// EQep1Regs.QEPCTL.bit.PCRM=01; // 最大计数位置时QPOSCNT复位
EQep1Regs.QEPCTL.bit.UTE=1; // Unit Timeout Enable 使能单位定时器
EQep1Regs.QEPCTL.bit.QCLM=1; // Latch on unit time out使能单位时间输出时其他重要寄存器的锁存功能
// EQep1Regs.QPOSMAX=0xffffffff; //位置的最大计算值
EQep1Regs.QPOSMAX=7999; //位置的最大计算值
EQep1Regs.QEPCTL.bit.QPEN=1; // QEP enable 使能QEP
EQep1Regs.QCAPCTL.bit.UPPS=5; // 1/32 for unit position即每32个QCLK产生一个单位位置时件
EQep1Regs.QCAPCTL.bit.CCPS=7; // 1/128 for CAP clock 即捕捉定时器的时钟频率为SYSCLKOUT/128
EQep1Regs.QCAPCTL.bit.CEN=1; // QEP Capture Enable 使能QEP捕捉功能
}
请各位大侠帮帮忙!谢谢! |