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, ' '); }