工具/软件:Code Composer Studio
您好,
我将 tms320f28555 DSP 微控制器用于 eQEP (正交编码器)。
在此示例中、我的使用是_2833xEqep_pos_speed.c
我已使用控制套件中存在的 example_2833xEqep_pos_speed.c 示例代码、并且我已按如下方式配置 eQEP:
(三
void POSSPEED_CALC (POSSPEED * p)
void POSSPEED_Init (void)
{
#IF (CPU_FRQ_150MHz)
EQep1Regs.QUPRD=1500000;//在150MHz SYSCLKOUT 上100Hz 的单位定时器
#endif
#IF (CPU_FRQ_100MHz)
EQep1Regs.QUPRD=1000000;// 100MHz 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;//针对 CAP 时钟、1/128
EQep1Regs.QCAPCTL.bit.CEN = 1;// QEP 捕捉启用
}
(三
--------------------------------------------------------------------
在上面的 POSSPEED_Init (void)函数中、PCRM=00 (索引事件上的位置计数器复位)被选中并且当下面的 POSSPEED_CALC (POSSPEED * p)
从中断函数_interrupt void prdTick (void)调用;下面的语句对此进行了解释
pos16bval=(unsigned int) EQep1Regs.QPOSCNT;//每个 QA/QB 周期捕捉位置一次;在下面的函数中
(三
void POSSPEED_CALC (POSSPEED * p)
{
长温度;
unsigned int pos16bval、temp1;
_iq Tmp1、newp、oldp;
//****位置计算-机械和电动马达角度**//
P->DirectionQep = EQep1Regs.QEPSTS.bit.QDF;//电机方向:0=CCV/反向、1=CW/正向
pos16bval=(unsigned int) EQep1Regs.QPOSCNT;//每个 QA/QB 周期捕捉位置一次
p->theta_raw = pos16bval+ p->cal_angle;//原始 theta =当前位置。 +对。 来自 QA 的偏移
(三
--------------------------------------------------------------------
但是、在 TMS320F28335 - eQEP 数据表中、没有针对每个 QA/QB 引脚的位置捕获的说明、而是对进行了说明
按如下所述放置锁存器。
(三
捕获定时器(QCTMR)和捕获周期寄存器(QCPRD)可配置为在之后锁定
事件。
·CPU 读取 QPOSCNT 寄存器
·单位超时事件
如果 QEPCTL[QCLM]位被清零、那么捕获定时器和捕获周期值被锁存在中
当 CPU 读取位置计数器时、QCTMRLAT 和 QCPRDLAT 寄存器会分别发生变化
(QPOSCNT)。
如果 QEPCTL[QCLM]位被置位、则位置计数器、捕捉定时器和捕捉周期值为
分别锁存在 QPOSLAT、QCTMRLAT 和 QCPRDLAT 寄存器中、单位超时。
(二
--------------------------------------------------------------------
因此、我无法理解以下语句中每个 QA/QB 周期一次的捕获位置是如何完成的
(二
pos16bval=(unsigned int) EQep1Regs.QPOSCNT;//每个 QA/QB 周期捕捉位置一次
(二
--------------------------------------------------------------------
我能否随时随机读取 QPOSCNT 而不锁存它、因为 QPOSCNT 会根据 QCLK 和 DIR 发生变化、是否存在任何可能性?
如何在不发生任何索引事件、单元位置事件和单元超时事件的情况下捕获 QPOSCNT?
请帮我解决这个问题、因为 QPOSCNT 是计算位置、速度的基本步骤、而这是非常重要的要求、因此我无法继续前进。
请尽早指导我。
我正在等待你的答复。