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.

[参考译文] 如何在void POSSPEED_CALC(POSSPEED *p)中对每个QA/QB周期执行一次捕获位置--- pos16bval=(unsigned int)EQep1Regs.QPOSCNT;

Guru**** 2524460 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/635571/how-capture-position-once-per-qa-qb-period-is-done-in-the-void-posspeed_calc-posspeed-p-------pos16bval-unsigned-int-eqep1regs-qposcnt

主题中讨论的其他部件:TMS320F2.8335万

您好,
我正在为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是计算位置,速度的基本步骤,这是非常重要的要求,因此我无法前进。

请尽快指导我。
我正在等待你的答复。