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:
好吧。芯片的问题的话,这个确实软件没办法解决,太坑了。