项目应用需求,想用正交编码器的Z信号,产生一个中断,来告知CPU,Z信号的到来。
我在eQEP的数据手册中,看到有IEL中断,但起什么作用?
手册中并没有对QEP的中断作详细说明……
个人认为:通过正确配置(1.对QEPCTL寄存器的IEL设置为 Index信号(Z信号)上升沿触发,2.对QEINT寄存器的IEL置1,3.正确配置PIE),当Z信号上升沿来临时,是将QEPCNT中值锁存在QPOSILAT中,并触发中断。
但是,实际调试(并不是仿真),IEL中断只能触发一次,第一个Z信号触发后,以后的Z信号来临都不会触发了。我将QEPCNT配置为有Index信号复位,是可以正常复位的,说明Z信号没有问题。
在eQEP的数据手册中,对EQEP的中断描述太少,而且官方历程中也没有看到相关应用。所以,只好来发帖。
问题:1、IEL中断到底起什么作用?
2、如果如我描述,那么又如何正确使用呢?(以下是我的配置代码以及中断代码)
初始化:
void EQepInit(void)
{
EQep1Regs.QDECCTL.bit.QSRC=00; // QEP正交计数模式
EQep1Regs.QEPCTL.bit.FREE_SOFT=2;
EQep1Regs.QEPCTL.bit.PCRM=00; // PCRM=00 mode – QPOSCNT reset on index event
EQep1Regs.QPOSMAX=0xffffffff;
EQep1Regs.QEPCTL.bit.QPEN=1; // 使能QEP
EQep1Regs.QCAPCTL.bit.UPPS=5; // 1/32 for unit position
EQep1Regs.QCAPCTL.bit.CCPS=7; // 1/128 for CAP clock
// EQep1Regs.QCAPCTL.bit.CEN=1; // QEP Capture Enable
EQep1Regs.QEPCTL.bit.IEL = 0x1; // Index事件在Index信号上升沿锁存
EQep1Regs.QEINT.bit.IEL = 1; // Index事件中断使能
EALLOW;
PieVectTable.EQEP1_INT = &QepInterrupt;
EDIS;
// PIE: Group 5 interrupt 1
PieCtrlRegs.PIEIER5.bit.INTx1 = 1;
IER |= M_INT5;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP5; // 清除标志位
EQep1Regs.QCLR.bit.IEL = 1;
EINT;
}
中断程序:
int count = 0;
interrupt void QepInterrupt(void)
{
count++; // 计数
PieCtrlRegs.PIEACK.all = PIEACK_GROUP5; // 清除标志位
EQep1Regs.QCLR.bit.IEL = 1;
}