搜索
bottom↓
回复: 11

帮忙看看这个正交解码程序有什么问题

[复制链接]

出0入0汤圆

发表于 2010-6-10 17:00:45 | 显示全部楼层 |阅读模式
/******************************************************************************
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周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-6-10 17:15:31 | 显示全部楼层

(原文件名:未命名.JPG)

出0入0汤圆

发表于 2010-6-10 19:46:50 | 显示全部楼层
为啥在中断里面干这么多事情啊?

出0入0汤圆

 楼主| 发表于 2010-6-10 20:36:51 | 显示全部楼层
能给个其它方法的思路吗

出0入0汤圆

发表于 2010-6-11 11:41:32 | 显示全部楼层
找个带QEP抓捕功能的ARM吧,STM32应该有的,这样处理起来容易些的。


(原文件名:QEP.jpg)

出0入0汤圆

 楼主| 发表于 2010-6-11 22:01:48 | 显示全部楼层
现在打算使用正交解码芯片HCTL-2032,不知道有用过该芯片的朋友没有

出0入0汤圆

发表于 2010-6-11 22:55:16 | 显示全部楼层
HCTL-2032 性能好 价格高 货也不好找

出0入0汤圆

 楼主| 发表于 2010-6-12 09:41:07 | 显示全部楼层
HCTL-2032确实货源不好找,那有什么比较好找的正交解码芯片吗?麻烦推荐一下

出0入0汤圆

发表于 2010-6-12 14:14:39 | 显示全部楼层
请参考这个贴 http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3219450&bbs_page_no=1&search_mode=4&search_text=wang_xm&bbs_id=9999

出0入0汤圆

 楼主| 发表于 2010-6-12 16:37:49 | 显示全部楼层
谢谢楼上

出0入0汤圆

 楼主| 发表于 2010-6-12 17:12:50 | 显示全部楼层
/******************************************************************************
2个输入引脚:
                                EINT8  -----( GPF  )---A Phase
                                EINT11 -----( GPF  )---B Phase
                4倍频检测,A相和B相的边沿进行中断,通过读取超前和滞后状态确定方向
                对于A信号的外中断来说,每一个变化的边沿都检查A,B两个信号电平
是否相同,相同则计数器减小,不同则计数器增加;对于B信号的外中断来说,每一个变化的边沿都检测A、B两信号电
平是否相同,相同则计数器增加,不同则计数器减小。
                 
******************************************************************************/

/*********************************[边沿触发中断处理程序]*********************************************/
static void __irq Decode_ISR(void)
{
        U32 r;

        EnterCritical(&r);
        ClearPending(BIT_EINT8_23);//清除中断标志位
        if(rEINTPEND&(1<<8))//用户手册V1.3 P307
                {
                       
                        rEINTPEND |= 1<< 8;
                        if ((rGPGDAT&(1<<0))==(rGPGDAT&(1<<3)))
                        {
                        count--;
                        dir = ccw;
                        }
                        else
                        {
                        count++;
                        dir = cw;
                        }
                }
        if(rEINTPEND&(1<<11))
                {
                    rEINTPEND |= 1<< 8;
                    if ((rGPGDAT&(1<<0))==(rGPGDAT&(1<<3)))
                        {
                        count++;
                        dir = cw;
                        }
                        else
                        {
                        count--;
                        dir = ccw;
                        }
                  
             }
       
        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中断       

}
现在修改为这样,但是可能是由于干扰,造成不断计数,不知道有什么好办法没有

出0入0汤圆

发表于 2010-8-5 06:14:39 | 显示全部楼层
解决了么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 00:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表