您好,
我正在为eQEP (正交编码器)使用tms320f2.8555万 DSP微控制器。
在此示例中,_2833xEqep_pos_speed.c我的quseare
我使用了控制套件中的example_2833xEqep_pos_speed.c的示例代码,并且我按如下方式配置了eQEP:
******************
void POSSPEED_CALC(POSSPEED *p)
void POSSPEED_Init (void)
{
#IF (CPU_FRQ_150MHz)
EQep1Regs.QUPRD=150万;// 150 MHz SYSCLKOUT时100Hz的单位计时器
#endif
#IF (CPU_FRQ_100MHz)
EQep1Regs.QUPRD=100万;// 100 MHz SYSCLKOUT时100Hz的单位计时器
#endif
EQep1Regs.QDECCTL.bit.QSRC=00;// QEP正交计数模式
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2;
EQep1Regs.QEPCTL.bit.PCRM=00;// PCRM=00模式-在索引事件上QPOSCNT重置
EQep1Regs.QEPCTL.Bit.UTE=1;//启用单元超时
EQep1Regs.QEPCTL.bit.QCLM=1;//单元上的闩锁超时
EQep1Regs.QPOSMAX=0xffffffff;
EQep1Regs.QEPCTL.bit.QPEN=1;// QEP启用
EQep1Regs.QCAPCTL.bit.UPPS=5;// 1/32表示单元位置
EQep1Regs.QCAPCTL.bit.CCPS=7;//1/128用于CAP时钟
EQep1Regs.QCAPCTL.bit.CEN=1;// QEP捕获启用
}
******************
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在上述POSSPEED_Init(void)函数中,选择了PCRM=00 (索引事件上的位置计数器重置),并且当以下POSSPEED_CALC(PSSPEED *p)
是从中断函数__interrupt void prdTick(void)调用的;下面的语句解释了这一点
pos16bval=(unsigned int)EQep1Regs.QPOSCNT;//每个QA/QB周期捕获一次位置;在FEL低 函数中
******************
void POSSPEED_CALC(POSSPEED *p)
{
长温度;
unsigned int pos16bval,temp1;
_IQ提示1,newp,oldp;
//****位置计算-机械和电动马达角度**///
P->DirectionQep = EQep1Regs.QEPSTS.bit.QDF;//电机方向:0=逆时针/反向,1=顺时针/正向
pos16bval=(unsigned int)EQep1Regs.QPOSCNT;//每个QA/QB周期捕获一次位置
p->theta_raw = pos16bval+ p->cal_angle;// raw theta =当前位置。 +从QA偏移量
******************
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
但在TMS320F2.8335万 - eQEP数据表中,没有关于每个QA/QB线的位置捕获的说明,而是关于的说明
按如下所述定位锁扣。
******************
捕获计时器(QCTMR)和捕获周期寄存器(QCPRD)可配置为锁定以下项
活动。
·QPOSCNT寄存器的CPU读取
·装置超时事件
如果QEPCTL[QCLM]位被清除,则捕获计时器和捕获周期值被锁定到中
当CPU读取位置计数器时,QCTMRLAT和QCPRDLAT分别进行注册
(QPOSCNT)。
如果设置了QEPCTL[QCLM]位,则位置计数器,捕获计时器和捕获周期值为
在装置超时时时时,分别锁定到QPOLAT,QCTMRLAT和QCPRDLAT寄存器。
*************************
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
因此,我无法理解每个QA/QB周期的捕获位置是如何完成的,具体如下所述
*************************
pos16bval=(unsigned int)EQep1Regs.QPOSCNT;//每个QA/QB周期捕获一次位置
*************************
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我是否可以随时随机读取QPOSCNT而不锁定它,因为QPOSCNT会根据QCLK和DIR而变化,是否有任何可能?
如何在没有任何索引事件,单元位置事件,单元超时事件的情况下捕获QPOSCNT?
请帮我解决这个问题,因为QPOSCNT是计算位置,速度的基本步骤,这是非常重要的要求,因此我无法前进。
请尽快指导我。
我正在等待你的答复。