Part Number: TMS320F28377S
Other Parts Discussed in Thread: C2000WARE
Can you explain the problem in the GPIO initialization for eQEP because the position_now is not getting updated , I have been debugging it but not able to find the speed.
#include "F28x_Project.h"
#include "math.h"
#define SYS_CLK 200000000
#define PI 3.14159265358979323846
void Setup_GPIO();
void initEQEP();
void InitEQep1Gpio();
void delay_loop();
uint16_t value1 = 0;
uint16_t value2 = 0;
uint16_t value3 = 0;
uint16_t value4 = 0;
int spcnt = 0;
float wr_mech = 0;
float RAD_PER_COUNT = 0.000785;// Encoder pulses per revolution
float lPrevPos = 0;
float lNowPos = 0 ;
int B= 0;
float lDifference = 0;
// uint32_t pulseCount = 0;
extern interrupt void cpu_timer0_isr(void);
int a=0;
void main(void)
{
// Initialize system clocks, GPIOs, and other necessary peripherals
// Initialize eQEP module
InitGpio();
//ENCODER
// GPIO_SetupPinMux(105 , GPIO_MUX_CPU1 , 0);
// GPIO_SetupPinOptions(105 , GPIO_OUTPUT , GPIO_PUSHPULL);
// GpioDataRegs.GPDSET.bit.GPIO105 = 1;
initEQEP();
InitSysCtrl();
// InitEQep1Gpio();
DINT;
// Setup the ADCs for software conversions
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.TIMER0_INT = &cpu_timer0_isr;
EDIS;
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0,200,100);
CpuTimer0Regs.TCR.all = 0x4000;
IER |= M_INT1;
IER |= M_INT3;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
EINT;
ERTM;
while(1)
{
}
}
float ReadEncoder ()
{
float position_now;
position_now = EQep1Regs.QPOSCNT;
return position_now;
}
void InitEQep1Gpio()
//{
//// // pg 959 Table Mux, pg 965 Registers and spruhm8i.pdf - Technical reference
EALLOW;
//
// GpioCtrlRegs.GPAMUX1.all = 0;
// GpioCtrlRegs.GPAMUX2.all = 0;
//// GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1; // Disable pull-up on GPIO10 (EQEP1A)
//// GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0; // Sync GPIO10 to SYSCLK (EQEP1A)
GpioCtrlRegs.GPAGMUX2.bit.GPIO20 = 1; // Configure GPIO6 as EQEP1A
//// GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // Configure GPIO6 as EQEP1A
////
//// GpioCtrlRegs.GPAPUD.bit.GPIO21 = 1; // Disable pull-up on GPIO7 (EQEP1B)
//// GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0; // Sync GPIO7 to SYSCLK (EQEP1B)
GpioCtrlRegs.GPAGMUX2.bit.GPIO21= 1; // Configure GPIO7 as EQEP1B
//// GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // Configure GPIO7 as EQEP1B
////
//// GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1; // Disable pull-up on GPIO7 (EQEP1B)
//// GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0; // Sync GPIO7 to SYSCLK (EQEP1B)
GpioCtrlRegs.GPAGMUX2.bit.GPIO22= 1; // Configure GPIO7 as EQEP1B
//// GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1; // Configure GPIO7 as EQEP1B
////
//// GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; // Disable pull-up on GPIO9 (EQEP1I)
//// GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; // Sync GPIO9 to SYSCLK (EQEP1I)
GpioCtrlRegs.GPAGMUX2.bit.GPIO23 = 1; // Configure GPIO9 as EQEP1I
//// GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // Configure GPIO9 as EQEP1I
//// EDIS;
//
//
// Enable internal pull-up for the selected pins.
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0; // Enable pull-up on GPIO20 (EQEP1A)
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0; // Enable pull-up on GPIO21 (EQEP1B)
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; // Enable pull-up on GPIO22 (EQEP1S)
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0; // Enable pull-up on GPIO23 (EQEP1I)
// Inputs are synchronized to SYSCLKOUT by default.
GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0; // Sync to SYSCLKOUT GPIO20 (EQEP1A)
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0; // Sync to SYSCLKOUT GPIO21 (EQEP1B)
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0; // Sync to SYSCLKOUT GPIO22 (EQEP1S)
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; // Sync to SYSCLKOUT GPIO23 (EQEP1I)
// Configure eQEP-1 pins using GPIO regs
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // Configure GPIO20 as EQEP1A
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // Configure GPIO21 as EQEP1B
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1; // Configure GPIO22 as EQEP1S
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // Configure GPIO23 as EQEP1I
// value1 = GpioDataRegs.GPADAT.bit.GPIO20 ;
// value2= GpioDataRegs.GPADAT.bit.GPIO21 ;
// value3 = GpioDataRegs.GPADAT.bit.GPIO22 ;
// value4 = GpioDataRegs.GPADAT.bit.GPIO23 ;
EDIS;
}
//
void initEQEP()
{
// CPUSysRegs.PCLKCR4.bit.EQEP1ENCLK = 1;
EQep1Regs.QUPRD = SYS_CLK ; // Unit timer period for 100Hz frequency (arbitrary, adjust as needed)
EQep1Regs.QDECCTL.bit.QSRC = 1; // Quadrature direction count mode
// EQep1Regs.QDECCTL.bit.QSP = 0; // 1x resolution (default)
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // Run on emulation suspend
EQep1Regs.QDECCTL.bit.XCR = 0; // 0 for rising/falling edge . 1 for rising edge only also XCR = 1x resolution
// EQep1Regs.QDECCTL.bit.SWAP = 1; // 0 for no change. 1 for swap A and B.
EQep1Regs.QEPCTL.bit.PCRM = 2; // Position counter reset 0 means reset on index, 1 means reset once max ,
// 2 mean reset on first index , 3 mean reset on a unit time event
EQep1Regs.QEPCTL.bit.QCLM = 1; // Latch on unit time out
EQep1Regs.QEPCTL.bit.UTE = 1;
// Unit Timer Enable
EQep1Regs.QPOSINIT = 0;
EQep1Regs.QPOSMAX = 0xFFFFFFFF; //desired maximum count
EQep1Regs.QEPCTL.bit.QPEN = 1; // QEP enable
EQep1Regs.QCAPCTL.bit.UPPS = 5; // 1/32 for unit position
EQep1Regs.QCAPCTL.bit.CCPS = 6; // 1/64 for CAP clock
EQep1Regs.QCAPCTL.bit.CEN = 1; // QEP capture enable
}
//void dalcSpeed(float lEncCount)
//{
//
// wr_mech = lEncCount*RAD_PER_COUNT/(10);
extern interrupt void cpu_timer0_isr()
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
lNowPos = ReadEncoder();
a++;
spcnt++;
if(spcnt>9)
{ B++;
lDifference = lNowPos - lPrevPos;
wr_mech = lDifference *RAD_PER_COUNT*1000;
lPrevPos = lNowPos;
spcnt = 0;
}
// pulseCount = EQep1Regs.QPOSCNT; // Read the pulse count
// motorSpeed = pulseCount * 60 * SYS_CLK / (ENCODER_PPR * EQep1Regs.QPOSCNT); // Calculate motor speed in RPM
// Clear interrupt flags if necessary
// EQep1Regs.QCLR.bit.UTO = 1;
}