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.

[参考译文] Δ Σ-F28379D:LAUNCHXL-F28379D_eQEP_Problem 推出XL

Guru**** 2482105 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D, TMS320F28335, TMS320F28379D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1448414/xl-f28379d-launchxl-f28379d_eqep_problem

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件: TMS320F28335TMS320F28379DC2000WARE

工具与软件:

问题描述:DSP TMS320F28379D 上的 eQEP 频率计算异常

我当前使用的是 LAUNCHXL-F28379D 开发板、连接到控制电机的三相逆变器。 系统设置如下:

  • 电流频率 :10 Hz
  • ADC 中断频率 :10 kHz
  • 电机规范 :8极、预期速度为150 RPM (使用转速计验证)
  • 编码器分辨率 :10000 CPR、仅使用 A/B 相位输入、不使用索引信号
  • eQEP 初始化 :基于官方实例 Eqep_pos_speed.c
  • 手动将电机旋转一整圈时、示波器会显示正确且完整的波形、从而确认编码器信号没有故障

问题:

  1. 在输出时 QPOSCNT 数值作为模拟信号、预期的频率为 2.5 Hz (对应于150 RPM)、但实际测量频率是 6.8 Hz .
  2. 将当前频率增加到20Hz 时、频率对应于 QPOSCNT 越大 7.8 Hz 仍然比理论值高得多。
  3. 相同的 eQEP 初始化配置(包括 QUALPRD、UPP、CCP 等)在上正确工作 TMS320F28335 输出频率与理论值匹配。

尝试的解决方案:

  • 调整了 QUALPRD (单位周期寄存器)设置为各种值。
  • 已修改 UPP (采棉头位置预分频器)和 CCP (捕获时钟预分频器)参数。
  • 已验证电机的实际速度、消除了机械问题。
  • 测试了 TMS320F28335上的示例代码、确认它在该平台上的正确性。

请求协助:

  • 是否存在任何已知问题 TMS320F28379D eQEP 模块 导致此类频率异常、是什么呢?
  • 仅使用 A/B 相位输入时、是否需要特定的配置 QEPCTL (eQEP 控制寄存器)或其他参数?
  • 是否有其他调试建议、例如分析中断、寄存器状态或潜在的硬件相关问题?

其他信息: 我可以提供信号波形测量或进一步介绍 DAC 输出设置以供分析。

我希望能得到社会人士的意见、以解决这个问题。 谢谢!

void POSSPEED_Init (void)

EALLOW;

EQep2Regs.QUPRD = 2000000;

EQep2Regs.QDECCTL.bit.QSRC = 00;
EQep2Regs.QDECCTL.bit.XCR = 0;
EQep2Regs.QEPCTL.bit.free_soft = 2;

EQep2Regs.QEPCTL.bit.PCRM = 01;

EQep2Regs.QEPCTL.bit.UTE = 1;
EQep2Regs.QEPCTL.bit.QCLM = 1;

EQep2Regs.QPOSMAX = 10000;
EQep2Regs.QEPCTL.bit.QPEN = 1;

EQep2Regs.QCAPCTL.bit.CEN = 1;
EQep2Regs.QCAPCTL.bit.CCP = 6;
EQep2Regs.QCAPCTL.bit.UPP = 2;

EQep2Regs.QPOSCNT = 0;


EDIS;
}

void InitEQep2Gpio (void)

EALLOW;


GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1;// Disable pull-up on GPIO24 (EQEP2A)(禁用 GPIO24上拉电阻)
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1;// Disable pull-up on GPIO25 (EQEP2B)(禁用 GPIO25上的上拉)
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 1;// Disable pull-up on GPIO26 (EQEP2S)(禁用 GPIO26上的上拉电阻)
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 1;// Disable pull-up on GPIO27 (EQEP2I)(禁用 GPIO27上的上拉)


//将输入同步到 SYSCLK
//用户可以启用或禁用同步。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 0;//将 GPIO24同步到 SYSCLK (EQEP2A)
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 0;//将 GPIO25同步到 SYSCLK (EQEP2B)
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 0;//将 GPIO26同步到 SYSCLK (EQEP2S)
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 0;//将 GPIO27同步到 SYSCLK (EQEP2I)



GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2;//将 GPIO24配置为 EQEP2A
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2;//将 GPIO25配置为 EQEP2B
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2;//将 GPIO26配置为 EQEP2S
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 2;//将 GPIO27配置为 EQEP2I

EDIS;
}

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

    使用 TMS320F28379D 的 eQEP 模块时、在我的状态窗口中检测到了以下错误标志:

    1. QEPSTS。 CDEF = 1 :捕获方向错误标志已设置,表示编码器的方向信号与捕获方向不一致。
    2. QEPSTS。 UPEVNT = 1 :已设置单位位置事件标志、指示发生了单位位置事件。
    3. QEPSTS。 QDF = 1 :设置正交方向标志、显示当前正交方向。
    4. QFLG。 PHE = 1 :正交相位错误标志被设置,表明编码器的 A 和 B 信号之间存在异常相位关系。
    5. QFLG。 QDC = 1 :设置正交方向改变中断标志,指示方向信号意外改变。
    6. QFLG。 PCV = 1 :位置计数器下溢中断标志置1、表示位置计数器已下溢。
    7. QFLG。 PCO = 1 :位置计数器溢出中断标志置位、表示位置计数器溢出。
    8. QFLG。 SEL = 1 :设置选通事件锁存标志、显示发生了选通事件。

    问题:
    这些标志是否指示编码器信号或配置存在问题? 具体来说、可能是由信号干扰或接线问题引起的捕获方向误差(CDEF)和正交相位误差(PHE)。 然而、同时发生的单元位置事件(UPEVNT)和计数器溢出/下溢(PCO/PCV)引起了对 eQEP 配置的担忧。 进一步调试的建议步骤是什么? 我是否还应该检查硬件连接?

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

    您好、Odamate:

    两个 TMS320F28379D  时钟配置是否与   eQEP 的 TMS320F28335的时钟配置相匹配? 两个 eQEP 时钟源相同很重要、否则会得到错误的读数。

    TMS320F28335 可在100Mhz 或150Mhz 频率下运行、具体取决于器件。  TMS320F28379D 的运行频率最高可达200MHz。 两个器件都从系统时钟提供 eQEP 时钟。

    此致!

    Ryan Ma

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

    感谢您的答复。 我已配置 QUALPRD CCP 基于 TMS320F28379D 文档中提供的示例代码的参数、确保这些参数与 TMS320F28379D (200MHz)和 TMS320F28335 (100MHz)之间的时钟速度差异一致。 但是、我不确定是否还有其他参数也可能需要针对时钟速度进行调整。

    在更新初始化设置后、我观察到了 QPOSCNT 频率 现在更接近理论值、但仍然存在一些差异。 此外 相位误差(PHE) 尽管发生了这些更改、问题仍然存在。

    对于其他与时钟相关的配置或解决 PHY 问题的潜在解决方案、您有什么建议吗?

    据观察、以单个方向旋转时、位置计数器溢出标志(QFLG。 PCO)

    和位置计数器下溢标志(QFLG)。 PCU)将被触发。

    这种行为与预期行为不一致、因为在正常操作中、

    QPOSCNT 的上溢和下溢应该相互排斥
    期待您的建议和解决方案、谢谢!

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    EQep2Regs.QPOSINIT = 1;
    EQep2Regs.QUPRD = 2000000;

    EQep2Regs.QDECCTL.bit.QAP = 0;
    EQep2Regs.QDECCTL.bit.QBP = 0;

    EQep2Regs.QDECCTL.bit.QSRC = 00;
    EQep2Regs.QDECCTL.bit.XCR = 1;
    EQep2Regs.QEPCTL.bit.free_soft = 2;

    EQep2Regs.QEPCTL.bit.PCRM = 01;
    EQep2Regs.QEPCTL.bit.UTE = 1;
    EQep2Regs.QEPCTL.bit.QCLM = 1;
    EQep2Regs.QCLR.all = 1;
    EQep2Regs.QPOSMAX = 9999;
    EQep2Regs.QEPCTL.bit.QPEN = 1;

    EQep2Regs.QCAPCTL.bit.CEN = 1;

    EQep2Regs.QCAPCTL.bit.CCP = 6;
    EQep2Regs.QCAPCTL.bit.UPP = 4;


    EQep2Regs.QCAPCTL.bit.CEN = 0;
    EQep2Regs.QPOSCNT = 0;
    EQep2Regs.QEINT.all = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

    您好、Odamate:

    此外 相位误差(PHE) 尽管有这些更改、问题仍然存在[/QUOT]

    您可以查看自己的输入信号是什么吗? 它们是否相移90度? 这是现在唯一仍然存在的错误吗?

    此致!

    Ryan Ma

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

    我已经连接了 AB 输入信号、包括在电机手动旋转以及电机运行期间捕获的信号(包括一些额外噪声)。 此外、我已经为 QFLG 寄存器提供了监控窗口。

    我也修改了 QUPRD= 100 、并观察到 Phe flag 重复出现并消失。 手动旋转电机时 QPOSCNT 频率看起来是正确的。 然而、在150 RPM 时 QPOSCNT 频率会变得不准确并波动。

    您能帮助确定这些问题的可能原因吗? 非常感谢您的建议。

    此致、

                 手动旋转电机

    电机正在运行(包括一些额外的噪声、已过滤 μ。)

    电机正在运行(包括一些未滤除。的额外噪声 μ、)

          QFLG 寄存器的监控窗口。

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

    您好、Odamate:

    如何计算 QUALPRD? 您是否有机会查看 c2000ware SDK 中 ex1和 ex2的 eQEP exmamples 文件夹下的计算器?

    此致!

    Ryan Ma

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

    您好、Ryan、

    感谢您之前的建议。 我重新讨论了我的配置、并通过调整 eQEP2的 GPIO 初始化函数中的同步时钟设置来解决该问题。

    下面是更新后的代码片段:

    void InitEQep2Gpio (void)

    EALLOW;

    //
    //禁用所选输出引脚的内部上拉
    //以降低功耗
    //用户可以启用或禁用上拉。
    //注释掉其他不需要的行。
    //
    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1;// Disable pull-up on GPIO24 (EQEP2A)(禁用 GPIO24上拉电阻)
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1;// Disable pull-up on GPIO25 (EQEP2B)(禁用 GPIO25上的上拉)
    GpioCtrlRegs.GPAPUD.bit.GPIO26 = 1;// Disable pull-up on GPIO26 (EQEP2S)(禁用 GPIO26上的上拉电阻)
    GpioCtrlRegs.GPAPUD.bit.GPIO27 = 1;// Disable pull-up on GPIO27 (EQEP2I)(禁用 GPIO27上的上拉)

    //
    //将输入同步到 SYSCLK
    //用户可以启用或禁用同步。
    //注释掉其他不需要的行。
    //
    GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 1;//将 GPIO24同步到 SYSCLK (EQEP2A)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 1;//将 GPIO25同步到 SYSCLK (EQEP2B)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 1;//将 GPIO26同步到 SYSCLK (EQEP2S)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 1;//将 GPIO27同步到 SYSCLK (EQEP2I)


    //
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2;//将 GPIO24配置为 EQEP2A
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2;//将 GPIO25配置为 EQEP2B
    GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2;//将 GPIO26配置为 EQEP2S
    GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 2;//将 GPIO27配置为 EQEP2I

    EDIS;
    }

    关键是确保输入引脚正确同步 系统时钟 (GPAQSEL2.bit)。

    这种变化使信号稳定下来并解决了问题。

    再次感谢您为我指明正确的方向!

    此致!

    Odamate Firy