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.

[参考译文] TMS320F28379D:仅在 CPU2上输出 PWM

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/979841/tms320f28379d-pwms-only-output-on-cpu2

器件型号:TMS320F28379D

我们为双核设置了系统、并在单独的内核上启用和控制 PWM。 出于某种原因、PWM 仅在 CPU2上输出、而不是 CPU1。 下面是我们在每个内核上使用的 PWM 列表:
PWM (CPU1):

  • EPWM2 (通道 A 和 B)
  • EPWM3 (通道 A 和 B)-> TI BiSS-C 位置管理器库也使用了 EPWM3 (BiSS-C 库使用的 CLB 需要、我们知道不应发生冲突)
  • EPWM4 (通道 A 和 B)-> TI BiSS-C 位置管理器库也使用了 EPWM4 (需要为 BiSS-C 库内部时钟生成启用、不应像我们知道的那样发生冲突)
  • EPWM5 (通道 A 和 B)
  • EPWM10 (通道 A 和 B)
  • EPWM11 (通道 B)

PWM (CPU2):

  • EPWM1 (通道 A)
  • EPWM11 (通道 A)->目前已禁用、因此 CPU1可以使用 EPWM11通道 B
  • EPWM12 (通道 A)

我们使用了为 PWM 初始化提供的 TI 示例。 所有 PWM 在单核(CPU1)上都可以正常工作、但在双核分离后、只有 CPU2 PWM 看起来工作正常。

起初、我认为它可能与 GTBCLKSYNC 问题有关、因此我实现了以下 TI 文章中推荐的 PWM 初始化流程、但它似乎无法解决该问题:

目前、我们的 PWM 初始化流程如下所示:

在 CPU1上:

  1. 启用 CPU1 PWM 外设(EPWM2、EPWM3、EPWM4、EPWM5、EPWM10、 EPWM11)
  2. 为任何 CPU2 PWM 外设(EPWM1和 EPWM12)提供对 CPU2的访问权限
  3. 将 ePWM 时钟分频器设置为 SYSCTL_EPWMCLK_DIV_2
  4. 禁用 GTBCLKSYNC
  5. 初始化每个 CPU1 PWM (EPWM4除外):
    1. 设置时基周期
    2. 将相移设置为0
    3. 将时基计数器设置为0
    4. 将仿真模式设置为 ePWM_EMPY_FREE_RUN
    5. 将时基计数器模式设置为 ePWM_COUNTER_MODE_UP
    6. 禁用相移负载
    7. 将时钟预分频器设置为 ePWM_CLOCK_DEVIDER_1和 ePWM_HSCLOCK_DEVIDER_1
    8. 对于每个通道、设置计数器比较值为0 (CMPA 或 CMPB)
    9. 对于每个通道、将操作限定符设置为 ePWM_AQ_OUTPUT ON_TIMEBASE_ZERO 和 ePWM_AQ_OUTPOUT_ON_TIMEBASE_UP_CMPA (或 CMPB)
    10. 将周期加载事件设置为 EPWM_SHADOK_LOAD_MODE_COUNTER_ZERO
  6. 初始化 EPWM4 (基于 BiSS-C 位置管理器库示例)
    1. 设置 TZCTL TZA = 1
    2. 设置 TZCTL TSB = 1
    3. 设置 TZFRC OST = 1
  7. 强制关闭 CPU2 PWM 初始化并等待其完成
  8. 启用 GTBCLKSYNC

在 CPU2上:

  1. 将 ePWM 时钟分频器设置为 SYSCTL_EPWMCLK_DIV_2
  2. 初始化每个 CPU2 PWM (与上面相同的过程)
  3. 让 CPU1知道 CPU2 PWM 初始化已完成

我在 CPU1上检查过的 PWM 不输出任何内容、但我看到一些寄存器值发生了变化、它们是 EPWM3和 EPWM10。 我在 CPU2上检查的工作 PWM 是 EPWM1。 当我设置占空比(CMPA 和 CMPB 值)时、我是否可以检查任何寄存器以确保至少 PWM 模块本身在 CPU1上正常工作?

是否还需要在两个内核上设置 ePWM 时钟分频器?

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

    您好、Nigel、

    您能否再次检查映射到 CPU1的 EPWM 模块是否确实连接到 CPUSEL0寄存器中的 CPU1?

    [引用 USER="Nigel Paing1"]但我看到一些寄存器值发生了变化、分别是 EPWM3和 EPWM10[/QUERPES]

    EPWM3和 EPWM10的寄存器值有哪些变化? 您能否在表达式窗口中查看 TBCTR 内的内容是否针对映射到 CPU1的每个 ePWM 模块进行了更改? 另一个值得检查的好方法是 CPU1注意到 CPU2已完成对 PWM 的初始化。 是否可以在启用 GTBCLKSYNC 后设置断点并检查它是否确实已设置?

    [引用 user="Nigel Paing1"]是否还在设置两个内核上所需的 ePWM 时钟分频器?

    看一下时钟系统、似乎不必在两个内核上设置 ePWM 时钟分频器、因为它只是对 PLLSYSCLK 进行分频并将其前馈。  

    此致、

    Marlyn

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

    Marlyn、感谢您的回答。 我检查了 CPUSEL0、唯一设置为1 (映射到 CPU2)的位是 EWPM1和 EPWM12外设(如预期的那样):

    以下是初始化后设置的 EPwm3Regs:

    EPWM10Regs 具有相同的设置、但 EPWMXLINK 设置为 0x90099999除外。

    我还进行了检查、以确保 EPWM3和 EPWM10 (CPU1)和 EPWM1 (CPU2)的 TBCTR 寄存器递增、并且确实是递增的、这是一个很好的迹象。  GTBCLKSYNC 还设置在正确的位置、我验证了 IPC 标志在代码中的正确位置获得 ACK、以便在设置 GTBCLKSYNC 之前初始化 CPU2 PWM。

    还有其他想法吗?

    编辑:我还确保在我命令 PWM 进入满占空比后设置 CMPA、EPwm3Regs 窗口在设置 CMPA 之前显示相同的值、唯一的区别是 CMPA 寄存器值从 0x00000000更改为 0x0FA00000、 因此、它似乎按预期工作

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

    解决了这个问题。

    我们是通过 H 桥器件发送 C2000 PWM 输出的、而 H 桥是通过 CPU1通过 GPIO 启用的、但随后、由于 GPIO 初始化为 CPU2上的错误值、GPIO 立即被 CPU2禁用并保持禁用状态。 这说明了我们为什么没有从示波器上 H 桥的 PWM 输出中获得任何东西。

    总之、事实证明这不是 PWM 问题、而是 H 桥 GPIO 使能问题、但这项调查确实发现了采用 GTBCLKSYNC 的 PWM 设计中的一个重要缺陷、因此、如果 PWM 设计现在考虑到了这一点、

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

    您好、Nigel、

    我很高兴您能够发现您的计划正在发生什么情况、并感谢您发布您的解决方案。  

    请您进一步解释您认为 GTBCLKSYNC 在您的应用中是一个问题的原因吗? 当该位置位时、所有模块的 PWM 时基开始计数。 您之前提到 TBCTR 正在计数与两个 CPU 相对应的 ePWM 模块。

    此致、

    Marlyn

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

    我不确定它是否确实出现了任何问题、但之前我们已经执行了以下 PWM 初始化步骤:

    CPU1:

    1. 禁用 GTBCLKSYNC
    2. 设置 CPU1 PWM
    3. 启用 GTBCLKSYNC

    CPU2:

    1. 禁用 GTBCLKSYNC
    2. 设置 CPU2 PWM
    3. 启用 GTBCLKSYNC

    但我想更好的策略是执行以下操作(基于上述论坛帖子):

    CPU1:

    1. 禁用 GTBCLKSYNC
    2. 设置 CPU1 PWM
    3. 等待 CPU2设置其 PWM
    4. 启用 GTBCLKSYNC

    CPU2:

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

    您好、Nigel、

    是的、第二种方法是实施设置的方法。 很高兴现在一切都很好!

    此致、

    Marlyn