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/TMS320F28335:如何在 void POSSPEED_CALC (POSSPEED *p)中完成每个 QA/QB 周期一次的捕捉位置--- pos16bval=(unsigned int) EQep1Regs.QPOSCNT;

Guru**** 2522770 points


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

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

器件型号:TMS320F28335

工具/软件: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 是计算位置、速度的基本步骤、而这是非常重要的要求、因此我无法继续前进。

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

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

    在您正在使用的示例项目中、设置了 QEPCTL.QCLM、因此位置计数器、捕获计时器和捕获周期值会锁存在单元超时。

    这意味着您可以随时读取 QPOSCNT、而不会触发任何事件。

    此致、
    标记