工具/软件:Code Composer Studio
嗨、我正在尝试使用 AM4379 QEP 功能。
以下是我的初始化步骤:
void POSSPEED_Init (void)
{
uint16_t regval = 0;
uint16_t readval =0;
//在1000MHz SYSCLKOUT 上针对100Hz 的单位定时器
HW_WR_REG32 (PWMSS_eQEP_QUPRD、10000000);
readval = HW_RD_REG32 (PWMSS_eQEP_QUPRD);
UART_printf ("\n PWMSS_eQEP_QUPRD 为%x \n"、readval);
//------------------------------------------------
//正交计数模式选择14 15位置00正交编码模式 QSRC
regval = HW_RD_REG16 (PWMS_eQEP_QDECCTL);
regval = regval & 0x3fff;
HW_WR_REG16 (PWMSS_eQEP_QDECCTL、regval);
readval = HW_RD_REG32 (PWMS_eQEP_QDECCTL);
UART_printf ("\n PWMSS_eQEP_QDECCTL 为%x \n"、readval);
///-----------------------------------------------------
位置计数器不受仿真挂起的影响 μ s 位 写10 15 μ s
regval = HW_RD_REG16 (PWMSS_eQEP_QEPCTL);
regval =((regval & 0x3fff)|0x8000);
HW_WR_REG16 (PWMSS_eQEP_QEPCTL、regval);
//位置计数器在索引位置上复位 PCRM=00在索引事件发生时 QPOSCNT 复位// 12 13位清零00
regval = HW_RD_REG16 (PWMSS_eQEP_QEPCTL);
regval = regval & 0xcfff;
HW_WR_REG16 (PWMSS_eQEP_QEPCTL、regval);
使能单元定时器 μ s 启用单元计时器
regval = HW_RD_REG16 (PWMSS_eQEP_QEPCTL);
regval = regval | 0x0002;
HW_WR_REG16 (PWMSS_eQEP_QEPCTL、regval);
第2位置1 QEP捕捉锁存模式 单元超时时候锁存,单元超时的时候位置计数器等被锁存/
regval = HW_RD_REG16 (PWMSS_eQEP_QEPCTL);
regval = regval | 0x0004;
HW_WR_REG16 (PWMSS_eQEP_QEPCTL、regval);
位置计数器使能 eQEP 位置计数器
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 为%x \n"、readval);
///----------------------------------
最大位置计数器 μ s
HW_WR_REG32 (PWMSS_eQEP_QPOSMAX、0xffffffff);
UART_printf ("\n PWMSS_eQEP_QPOSMAX 为%x \n"、HW_RD_REG32 (PWMSS_eQEP_QPOSMAX));
///----------------------------------
单元位置事件预分频器32分频/μ s 5.
regval = HW_RD_REG16 (PWMSS_eQEP_QCAPCTL);
regval =((regval & 0xFF0)|0x0005);
HW_WR_REG16 (PWMSS_eQEP_QCAPCTL、regval);
qep捕获时 时钟预分配64 μ s
regval = HW_RD_REG16 (PWMSS_eQEP_QCAPCTL);
regval =((regval & 0x78f)|0x0060);
HW_WR_REG16 (PWMSS_eQEP_QCAPCTL、regval);
使能qep捕获 eQEP 捕捉单元
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 为%x \n"、readval);
///------------------------------
}
空 InitEQep1Gpio (空)
{
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 & 0xffff)|0x00000001);
HW_WR_REG32 (my_CTRL_CONF_McASP0_ACLKR、regVal);
UART_printf ("\n my_CTRL_CONF_McASP0_ACLKR 为%x \n"regVal);
regVal = HW_RD_REG32 (my_CTRL_CONF_McASP0_FSX);
regVal =((regVal & 0xffff)|0x00000001);
HW_WR_REG32 (my_CTRL_CONF_McASP0_FSX、regVal);
UART_printf ("\n my_CTRL_CONF_McASP0_FSX 为%x \n"regVal);
regVal = HW_RD_REG32 (my_CTRL_CONF_McASP0_AXR1);
regVal =((regVal & 0xffff)|0x00000001);
HW_WR_REG32 (my_CTRL_CONF_McASP0_AXR1、regVal);
UART_printf ("\n my_CTRL_CONF_McASP0_AXR1为%x \n"regVal);
regVal = HW_RD_REG32 (my_CTRL_CONF_McASP0_AHCLKX);
regVal =((regVal & 0xffff)|0x00000001);
HW_WR_REG32 (my_CTRL_CONF_McASP0_AHCLKX、regVal);
UART_printf ("\n my_CTRL_CONF_McASP0_AHCLKX 为%x \n"regVal);
时钟开启 μ s
/*启用 PWMSS0模块的 QEP 时钟*/
regVal= HW_RD_REG32 (QEP_BAS_ADDRESS_PWMSS0_CLKCONFIG);
regVal = regVal |0x100;
HW_WR_REG32 (QEP_BASE_ADDRESS_PWMSS0_CLKCONFIG、regVal);
UART_printf ("\n CLKCONFIG 为%x \n"regVal);
/*为 PWMMSS0模块启用时基时钟*/
regVal= HW_RD_REG32 (CONTRAL_MODULE_CTRL_PWMSS0);
regVal = regVal |0x1;
HW_WR_REG32 (CONTRAL_MODULE_CTRL_PWMSS0、regVal);
UART_printf ("\n PWMSS0为%x \n"regVal);
}
------------------------------------------------------------------
//位置速度计算
void POSSPEED_CALC (空)
{
长温度;
int pos16bval;
uint32_t tempval = hw_RD_REG16 (PWMSS_eQEP_QEPSTS);
UART_printf ("\n PWMSS_eQEP_QEPSTS 为%x \n"tempval);
int DirectionQep =(tempval & 0x0020)>>5;
}
--------------------------------------------------
问题:
为什么方向不改变。
我是否错过了什么?