This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/AM4379: eQEP direction issue

Part Number: AM4379

Tool/software: Code Composer Studio

Hey ,I am trying to use the AM4379 QEP function.

below is my init steps:

void POSSPEED_Init(void)
{

uint16_t regval = 0;
uint16_t readval =0;


// Unit Timer for 100Hz at 1000 MHz SYSCLKOUT
HW_WR_REG32(PWMSS_EQEP_QUPRD,10000000);

readval = HW_RD_REG32(PWMSS_EQEP_QUPRD);
UART_printf("\n PWMSS_EQEP_QUPRD is %x \n", readval);
//--------------------------------------------------------------


//正交计数模式选择 14 15位置00 正交编码模式 QSRC
regval = HW_RD_REG16(PWMSS_EQEP_QDECCTL);
regval = regval & 0x3fff;
HW_WR_REG16(PWMSS_EQEP_QDECCTL,regval);

readval = HW_RD_REG32(PWMSS_EQEP_QDECCTL);
UART_printf("\n PWMSS_EQEP_QDECCTL is %x \n", readval);
//------------------------------------------------------------------


//位置计数器不受仿真挂起的影响 14 15 位 写10
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = ((regval & 0x3fff) |0x8000);
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);


//位置计数器在索引位置上复位 pcrm=00 QPOSCNT reset on index event //12-13位清零 00
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval & 0xcfff;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);


//使能单元定时器 Enable unit timer
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval | 0x0002;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);

//QEP捕捉锁存模式 单元超时时候锁存,单元超时的时候位置计数器 等被锁存//第2位置1
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval | 0x0004;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);

//位置计数器使能 eQEP position counter is enabled
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval | 0x0008;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);


readval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
UART_printf("\n PWMSS_EQEP_QEPCTL is %x \n", readval);

//-------------------------------------------------------------------------------
//最大位置计数器
HW_WR_REG32(PWMSS_EQEP_QPOSMAX,0xffffffff);
UART_printf("\n PWMSS_EQEP_QPOSMAX is %x \n", HW_RD_REG32(PWMSS_EQEP_QPOSMAX));

//-----------------------------------------------------------------------------
//单元位置事件预分频器 32分频 5
regval = HW_RD_REG16(PWMSS_EQEP_QCAPCTL);
regval = ((regval & 0xfff0) |0x0005);
HW_WR_REG16(PWMSS_EQEP_QCAPCTL,regval);

//qep捕获时 时钟预分配64
regval = HW_RD_REG16(PWMSS_EQEP_QCAPCTL);
regval = ((regval & 0xff8f) |0x0060);
HW_WR_REG16(PWMSS_EQEP_QCAPCTL,regval);


//使能qep捕获 eQEP capture unit is enabled
regval = HW_RD_REG16(PWMSS_EQEP_QCAPCTL);
regval = regval |0x8000;
HW_WR_REG16(PWMSS_EQEP_QCAPCTL,regval);


readval = HW_RD_REG32(PWMSS_EQEP_QCAPCTL);
UART_printf("\n PWMSS_EQEP_QCAPCTL is %x \n", readval);
//-------------------------------------
}

void InitEQep1Gpio(void)
{

uint32_t regVal;

//16位置0 0-3位写1 enable上拉+ 引脚复用 模式7更改为模式1 QEP模式
regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_ACLKR);//eQEP0A_in
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_ACLKR,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_ACLKR is %x \n",regVal);

regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_FSX);
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_FSX,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_FSX is %x \n",regVal);

regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_AXR1);
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_AXR1,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_AXR1 is %x \n",regVal);

regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_AHCLKX);
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_AHCLKX,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_AHCLKX is %x \n",regVal);

//时钟开启
/* Enabling the qep clock for the PWMSS0 module */
regVal= HW_RD_REG32(QEP_BASE_ADDRESS_PWMSS0_CLKCONFIG);
regVal = regVal |0x100;
HW_WR_REG32(QEP_BASE_ADDRESS_PWMSS0_CLKCONFIG,regVal);
UART_printf("\n CLKCONFIG is %x \n",regVal );

/*Enabling the Time-base clock for the PWMMSS0 module */
regVal= HW_RD_REG32(CONTROL_MODULE_CTRL_PWMSS0);
regVal = regVal |0x1;
HW_WR_REG32(CONTROL_MODULE_CTRL_PWMSS0,regVal);
UART_printf("\n PWMSS0 is %x \n",regVal );
}

-------------------------------------------------------------------------------------------------------------------------------

//position speed caculate
void POSSPEED_Calc(void)
{
long tmp;
int pos16bval;

 
uint32_t tempval = HW_RD_REG16(PWMSS_EQEP_QEPSTS );
UART_printf("\n PWMSS_EQEP_QEPSTS is %x \n",tempval);
int DirectionQep = (tempval & 0x0020)>>5;

}

-----------------------------------------------------------------------------------

question:

why  the direction does not change .

do i miss something?

  • Hi,

    Could you please provide a bit more information about your hardware & software?

    • Version of PRSDK / PDK?
    • Hardware board?
    • Incremental encoder model?
    • Hardware signals connected from encoder to AM437x?
    • High-level description of eQEP modes you want to use?

    Thanks and regards,
    Frank