Hi, I'm using TM4C123GXL evaluation board.
I tried to use QEI with Peripheral Drive Library, but only one QEI module seem to be working.
QEI1 is OK, when I connect encoder channel A and B to PC5 and PC6(QEI module 1), I can see encoder count increment.
However when I connect the same encoder signals to PD6 and PD7(QEI module 0), the encoder count just doesn't change very much(a random number +-1), any suggestion what could be the problem?
I think I'm using almost the same code for QEI 0 and QEI 1.
Thanks.
Here's the code:
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
//--------------
// QEI
//--------------
SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);//QEI0
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//QEI1
//
GPIOPinConfigure(GPIO_PD6_PHA0);
GPIOPinConfigure(GPIO_PD7_PHB0);
GPIOPinConfigure(GPIO_PC5_PHA1);
GPIOPinConfigure(GPIO_PC6_PHB1);
//
GPIOPinTypeQEI(GPIO_PORTD_BASE, GPIO_PIN_6);
GPIOPinTypeQEI(GPIO_PORTD_BASE, GPIO_PIN_7);
GPIOPinTypeQEI(GPIO_PORTC_BASE, GPIO_PIN_5);
GPIOPinTypeQEI(GPIO_PORTC_BASE, GPIO_PIN_6);
//
QEIConfigure(QEI0_BASE, (QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), 25030);
QEIConfigure(QEI1_BASE, (QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUADRATURE | QEI_CONFIG_NO_SWAP), 25030);
QEIEnable(QEI0_BASE);
QEIEnable(QEI1_BASE);
//--------------
// UART
//--------------
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
UARTEnable(UART0_BASE);
//--------------
// Loop
//--------------
uint32_t duty_cycle = 100;
uint32_t pos1 = 0;
uint32_t pos2 = 0;
char buffer[20]={0};
while(1)
{
SysCtlDelay(5000000);
pos1 = QEIPositionGet(QEI0_BASE);
pos2 = QEIPositionGet(QEI1_BASE);
//the following is just to convert pos to char for UART output
uint32_t n = pos1;
int i = 0;
bool isNeg = false;
unsigned int n1 = isNeg ? -n : n;
while(n1!=0)
{
buffer[i++] = n1%10+'0';
n1=n1/10;
}
if(isNeg)
buffer[i++] = '-';
buffer[i] = '\0';
int t = 0;
for(;t < i/2;t++)
{
buffer[t] ^= buffer[i-t-1];
buffer[i-t-1] ^= buffer[t];
buffer[t] ^= buffer[i-t-1];
}
//
i=0;
while(buffer[i])
{
UARTCharPut(UART0_BASE, buffer[i]);
i++;
}
UARTCharPut(UART0_BASE, ' ');
}