|
/******************************************************************************
2个输入引脚:
EINT8 -----( GPF )---A Phase
EINT11 -----( GPF )---B Phase
4倍频检测,A相和B相的边沿进行中断,通过读取超前和滞后状态确定方向
*******************************************************************************/
/*********************************[边沿触发中断处理程序]*********************************************/
static void __irq Decode_ISR(void)
{
U32 r;
U8 n;
EnterCritical(&r);
ClearPending(BIT_EINT8_23);//清除中断标志位
if(rEINTPEND&(1<<8))//用户手册V1.3 P307
{
rEINTPEND |= 1<< 8;
if (rGPGDAT&(1<<0))//若A为上升沿
{
for(n=0;n<200;n++)
{
__asm{NOP;}
}
if (rGPGDAT&(1<<0))
{
if(rGPGDAT&(1<<3))//上升沿且B相为高
{
count --;
dir = ccw;
// Uart_Printf( "A 1 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
else //上升沿且B相为低
{
count ++;
dir = cw;
// Uart_Printf( "A 2 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
}
}
else
{
for(n=0;n<200;n++)
{
__asm{NOP;}
}
if( !(rGPGDAT&(1<<0)))
{
if(rGPGDAT&(1<<3))//下降沿且B相为高
{
count ++;
dir = cw;
// Uart_Printf( "A 3 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
else //下降沿且B相为低
{
count --;
dir = ccw;
// Uart_Printf( "A 4 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
}
}
}
if(rEINTPEND&(1<<11))
{
rEINTPEND |= 1<<11;
if (rGPGDAT&(1<<3))//若为上升沿
{
for(n=0;n<200;n++)
{
__asm{NOP;}
}
if (rGPGDAT&(1<<3))
{
if(rGPGDAT&(1<<0))//上升沿且A相为高
{
count ++;
dir = cw;
// Uart_Printf( "B1 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
else //上升沿且A相为低
{
count --;
dir = ccw;
// Uart_Printf( "B2 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
}
}
else
{
for(n=0;n<200;n++)
{
__asm{NOP;}
}
if (!(rGPGDAT&(1<<3)))
{
if(rGPGDAT&(1<<0))//下降沿且A相为高
{
count --;
dir = ccw;
//Uart_Printf( "B3 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
else //下降沿且A相为低
{
count ++;
dir = cw;
// Uart_Printf( "B4 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
}
}
}
}
ExitCritical(&r);
}
/*********************************[中断检测函数]*********************************************/
void KeyScan_Test(void)
{
Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");
rGPGCON = rGPGCON & (~((3<<6)|(3<<0))) | (2<<6)|(2<<0) ; //GPG0 3 set EINT 用户手册V1.3 P293
rEXTINT1 = rEXTINT1 &( ~((0xf<<0)|(0xf<<12)))|(0xe<<0)|(0xe<<12); //用户手册V1.3 P301
//set eint8 11 both edge int
rEINTPEND |= (1<<8)|(1<<11); //clear eint 4 用户手册V1.3 P307
rEINTMASK &= ~((1<<8)|(1<<11)); //enable eint 4
ClearPending(BIT_EINT8_23);
pISR_EINT8_23 = (U32)Decode_ISR;
EnableIrq(BIT_EINT8_23); //打开中断
while( Uart_GetKey() != ESC_KEY ) ;//一直在此处循环,直到ESC按下
Uart_Printf( "B4 Motion occur!... Pulse count: %d \n Dir: %d\n", count,dir) ;
count = 0;
DisableIrq(BIT_EINT8_23);//关闭IRQ中断
}
用S3C2440来做的,其中
FCLK =400000000 Hz
PCLK =50000000 Hz
HCLK =100000000 Hz
用来读取伺服电机驱动器输出的编码器信号,正交编码信号
现在的问题就在于中断过于频繁,计数脉冲也不准确 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|