TI中文支持网
TI专业的中文技术问题搜集分享网站

关于TM4C123AH6PM的QEI的反向计数问题!!!

1 对于自己使用的TM4C123AH6PM的QEI模块外接端口(PF0)有NMI复用功能,所以软件配置如下:

 SysCtlPeripheralEnable( SYSCTL_PERIPH_QEI0 );                     

 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);  

 HWREG(GPIO_PORTF_BASE+GPIO_O_LOCK)  |= 0x4C4F434B;

 HWREG(GPIO_PORTF_BASE+GPIO_O_CR)   |= (1<<0);

 HWREG(GPIO_PORTF_BASE+GPIO_O_DEN)  &= (~(1<<0));  

HWREG(GPIO_PORTF_BASE+GPIO_O_PDR)  &= (~(1<<0));

 HWREG(GPIO_PORTF_BASE+GPIO_O_PUR)  &= (~(1<<0));

 HWREG(GPIO_PORTF_BASE+GPIO_O_AFSEL) &= (~(1<<0));    

GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW);

 GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1, GPIO_STRENGTH_4MA,  GPIO_PIN_TYPE_STD);    

 GPIOPinConfigure(GPIO_PF0_PHA0);                                               

 GPIOPinConfigure(GPIO_PF1_PHB0);                             //ÅäÖÃGPIOµÄ¸´Óù¦ÄÜ   PF1  

QEIConfigure(QEI0_BASE, (QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), 0);

 ROM_QEIConfigure(QEI_BASE, (QEI_CONFIG_NO_RESET | QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), 0);   

QEIVelocityConfigure(QEI0_BASE, QEI_VELDIV_1, 5000000);     //ÉèÖÃËٶȼì²âÖÜÆÚΪ100ms   

  QEIVelocityConfigure(QEI_BASE, QEI_VELDIV_1, SysCtlClockGet()/3000*500); //ÉèÖÃËٶȼì²âÖÜÆÚΪ500ms    

 QEIIntEnable(QEI0_BASE, QEI_INTTIMER);                               //ʹÄÜÖÜÆÚÖжÏ

   IntEnable(INT_QEI0);             

QEIEnable(QEI0_BASE);                                                            // ʹÄÜÕý½»±àÂëÆ÷    

QEIVelocityEnable(QEI0_BASE);      

 

2 QEI中断函数是void GetCoderValue(void)已经放在启动代码相应的中断位置了

中断处理代码如下:

{

     unsigned int Delta;            //±àÂëÆ÷ÊýÖµµÄÔöÁ¿  

     QEIIntClear(QEI0_BASE, QEI_INTTIMER);                 //Çå³ýÖжϱêÖ¾   i         //Èç¹ûµ±Ç°Ã»ÓÐÒªÐ޸ĵIJÎÊý£¬Ôò·µ»Ø   

     Delta = QEIVelocityGet(QEI0_BASE);  

     switch( CurrentPara )    {   

        case UP_TIME:{         

              if( Delta > 30 ) Delta *= 2;        //处理采样速度        

               else if( Delta > 15 ) Delta *= 1;   

               else  Delta /= 4;  

              MaxValue =    UP_TIME_MAX;         //限制最大最小      

              MinValue = UP_TIME_MIN;    break;      

             }  

 …… 

}

                                         

 if( 1 == QEIDirectionGet(QEI0_BASE))    

     AllPara[CurrentPara][WeldMethod] += Delta;

   if( -1 == QEIDirectionGet(QEI0_BASE))   

      AllPara[CurrentPara][WeldMethod] -= Delta;}     

 if( AllPara[CurrentPara][WeldMethod] > MaxValue )                 //¸ù¾Ý±äÁ¿ÏÞÖƵ±Ç°²ÎÊýµÄ·¶Î§*/

      AllPara[CurrentPara][WeldMethod] = MaxValue;   

 if( AllPara[CurrentPara][WeldMethod] < MinValue ) 

        AllPara[CurrentPara][WeldMethod] = MinValue;

}

       

//AllPara[CurrentPara][WeldMethod] 是个全局数组,并有个线程显示它,在中断处理赋值

我把以上代码下载到芯片里面去,出现了一个奇怪的现象:当我旋转QEI时,旋转到下限值时,如果旋转快速与突然,显示的下限值(最小值)

就会突变为上限值(最大值), 但是反向旋转增大显示值,不管旋转快与慢速,都不会出现最大值变为最小值        首先确定QEI模块硬件是好的

不过旋转慢时就不会出现上面的情况和程序运行的一致,最小值不会突变。

 

      中断处理函数最后的一句没起作用呢,是不是PF0的NMI的禁止不够彻底呢,所以影响到了QEI的正常的运行呢,还得请高手指点迷津呢,

 在此谢过了

 

 

 

 

 

 

 

 

xyz549040622:

应该是你程序中最大值与最小值的处理问题。当到达最小值时,程序没有进行处理,自动溢出,变为最大值了,重新开始计数了

RongQi Xu:

回复 xyz549040622:

最大最小值已经限制了,问题的出现是因为芯片的QEI A,B项未与QEI模块的对应,还有一个重要原因:QEI模块的质量有问题(即使是新产品),产生的波形是两条不同宽度的波形,以致芯片读数不对,某些国产的QEI模块的工艺不敢恭维!!

xyz549040622:

回复 RongQi Xu:

好吧。芯片的问题的话,这个确实软件没办法解决,太坑了。

赞(0)
未经允许不得转载:TI中文支持网 » 关于TM4C123AH6PM的QEI的反向计数问题!!!
分享到: 更多 (0)