RDK-BLDC QEI模块 编码器位置读取问题

Other Parts Discussed in Thread: LM3S8971

在使用RDK-BLDC(LM3S8971)评估板做功能测试过程中,尝试添加位置闭环控制,因此使用到QEI模块的库函数。

发现问题:QEIPositionGet(QEI0_BASE)函数读回来的编码器位置始终为0,也就是说QEI位置积分器器(QEIPOS寄存器)的值没有增加。

QEI相关配置如下:

GPIOPinTypeQEI(PIN_ENCA_PORT, PIN_ENCA_PIN);
GPIOPinTypeQEI(PIN_ENCB_PORT, PIN_ENCB_PIN);

GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_DIR_MODE_HW); //自己添加的,目的是启用IO复用功能
GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_HW); //自己添加的,目的是启用IO复用功能

GPIOIntTypeSet(PIN_ENCA_PORT, PIN_ENCA_PIN, GPIO_RISING_EDGE);

IntEnable(INT_GPIOC);

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

QEIVelocityConfigure(QEI0_BASE, QEI_VELDIV_2, SYSTEM_CLOCK / QEI_INT_RATE);

QEIEnable(QEI0_BASE);
QEIVelocityEnable(QEI0_BASE);

QEIIntEnable(QEI0_BASE, QEI_INTTIMER);
IntEnable(INT_QEI0);

QEIPositionSet(QEI0_BASE,0);

//end

请问各位工程师有没有遇到过这种情况?可以怎么解决编码器位置的读取问题呢?

在此先谢谢啦!

  • 在此对上述问题补充说明一下:

    (1)查外设驱动库用户手册里有关于GPIOPinTypeQEI( )的说明:

    Note:
    This function cannot be used to turn any pin into a QEI pin; it only configures a QEI pin for proper operation. Devices with flexible pin muxing also require a GPIOPinConfigure() function call.

    我的理解是:这个引脚配置函数并没有将QEI的3个引脚设置为QEI外设引脚,还需要调用GPIOPinConfigure() 函数进行补充设置。此时又有另外一个问题出现,

    在手册里关于GPIOPinConfigure()也有说明:

    Note:
    This function is not valid on Sandstorm, Fury, and Dustdevil-class devices. Also, if the same signal is assigned to two different GPIO port pins, the signal is assigned to the port with the lowest letter and the assignment to the higher letter port is ignored.

    LM3S8971不正是Fury系列的吗?因此该函数不适用。确实,在pin_map.h中也确实找不到相关变量的宏定义。

    因此才想到用GPIODirModeSet( )来对引脚模式进行设置,也不知道这样是否可行。

    (2)查了英文论坛里同样问题的相关帖子如下,无奈功力不足实在看不明白,还请大家指点迷津。

    http://e2e.ti.com/support/microcontrollers/stellaris_arm/f/471/p/59893/529972.aspx

    http://e2e.ti.com/support/microcontrollers/stellaris_arm/f/471/t/276997.aspx?pi171693=1