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.

[参考译文] TMS320F28388D:ePWM 为单次触发

Guru**** 2583925 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1137260/tms320f28388d-epwm-as-one-shot

器件型号:TMS320F28388D
Thread 中讨论的其他器件:SysConfigC2000WARE

是否可以通过 ESC 的 SYNC0在增-减模式下启动 PWM 计数器、然后在计数器再次递减至零时让其冻结。 那么、它只会在下一个 SYNC0到达时启动下一个向上计数?

我们希望同步多个 EtherCAT 从站的 PWM。 这可以通过使用从器件 ESC 的 SYNC0来触发 EPWM 的 SYNC 输入来实现。 但是、由于 SYNC0周期不会与 ePWM 周期完全匹配、我们可以得到这样的效果:PWM 计数器将在下一个周期的触发之前或之后再次开始计数。 因此、我们将遇到不受控制的 CTR=ZERO 事件。 如果我们可以"一次性"运行 PWM 计数器、我们将启动略小于 SYNC0周期的单个 PWM 周期。 因此、我们将通过网络实现完美的 PWM 信号同步。 但我找不到任何用于将 PWM 设置为一次性的寄存器。 我的问题是,如果可以通过使用其他触发器和寄存器(例如,在零到达时自动切换模式以冻结)来实现这一点。 如果不可能、我们需要不断地将计数器周期设置为 SYNC0周期的99%、以确保在下一个 SYNC0之前得到一个 CTR=0。 因此、我们将释放1%的 PWM 范围。

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

    我已经阅读了有关使用 AQCTLB 重影来生成单次触发的主题帖。 但是、如果我正确的话、这将巧妙地操纵 PWM 输出对计数器、比较器或其他信号的反应方式。 计数器将在它达到零后开始递增计数。 但是、这种行为已经通过我们将 SYNC0周期修整为 PWM 周期的方式来建立。 当我们使用 U/d 模式并在 CTR=CMPA 时切换输出(死区模式)时、当计数器重新开始递增计数直到再次达到 CMPA 时、我们确实具有稳定的输出。 但在 ESC 的下一个 SYNC0将计数器重置为零之前、绝不会发生这种情况。 因此、如果我对了、使用阴影方法强制输出仅为单次触发不会有任何好处。

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

    您好!

    我可以想到的从外部触发器生成单次 ePWM 信号的最简单方法是使用可配置逻辑块(CLB)工具。 实际上、CLB 用户指南中提供了一个有关如何执行该操作的示例! 在 C2000根文件夹中、导航至"utilities"->"clb_tool"->"clb_syscfg"->"doc"->"CLB Tool Users Guide"。 在该指南中、第5.8节讨论了 CLB 的示例17:单次 PWM 生成、其中一种运行模式依赖于外部触发信号。

    如果您希望调整示例中使用的技术、我建议查看示例中选择的 SysConfig 选项、并确定您需要使用哪些选项以及您的应用不需要哪些选项。

    (注意:在 CLB 用户指南中、专门引用了 f28004x 器件-在您的情况下、您需要将其替换为您使用的器件 f2838x。 有关 CLB 的更多信息、请在许多位置找到、包括 C2000 Academy 中的基本教程、页面顶部的 TI 培训下拉菜单中的视频教程以及器件 TRM 中的更多特定架构信息。)

    希望我能够提供帮助、

    Jason Osborn

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

    您好 Jason、

    非常感谢您的回复。 我们曾考虑使用 MCU 的其他特性来模拟 ePWM 部分。 但我们放弃了这一想法、因为我们正在使用 ePWM 的几个其他高级功能。 在我们设计伺服驱动器时、我们很高兴拥有可配置的红色/馈送时间等功能来解决死区任务。 我们还需要使用 PWM 信号边沿触发 ISR、但会延迟馈送时间、以便从 EMI 区域启动多个 ADC 转换。 使用值比较器进行上行/下行分流来调整脉冲宽度的原因还包括:使用3个并联和同步的 PWM、我们使用此方法来分离所有三个驱动器输出的开关边沿(从而减少 EMI 问题)、并仍然同步它们(仅进行相移)。

    使用 CLB 模拟所有这些功能就像重建强大的 ePWM、只是为了获得 OneShot 功能。 因此、我们宁愿继续使用 ePWM 和20ns 的最大占空比、以获得不同 SYNC0至 TBPRD 周期的安全裕度。

    还有其他想法吗?

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

    这是使用 ORU 实际解决方案时的情况。 但在下一个 SYNC0从 ESC 发出之前、让计数器重新启动计数是一种"丑陋"的做法。 例如、如果由于错误而没有 SYNC0 (ESC 状态机停止同步)、则 EPWM 将生成更多脉冲、直到某种错误检测和反应例程停止 EPWM。 如果没有来自 ESC 的 SYNC0、我们更希望立即自动停止输出脉冲。 因此、将 SYNC0作为 OneShot 脉冲的触发器(但仍具有 ADC ISR 等的延迟触发器、并且具有可配置的红色/馈送)将是完美的。 但我看不到实现这一目标的方法。

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

    编辑:请参阅我的下一个答复-尽管下面描述的方法 应该起作用、但我认为、使用 AQ 模块的外部触发器可以明显更直观、记录良好的方法来执行此操作。

    啊,我看到你现在要问什么,我很抱歉。 在这种情况下、我认为我看到的第一个答案是使用跳闸区域模块。 通过正确的设置、应该可以设置单次触发(OST)条件以强制 EPWMxA/B 为低电平。 然后、可以将外部信号设置为执行两项操作:生成触发区中断 、清除重新启用 EPWMxA/B 的 OST 跳闸标志、并充当同步信号、将计数器设置为零。 最后、 您需要设置 CTR=Zero 信号以生成中断、从而重新设置 OST 条件、在单周期结束时再次将信号强制为低电平。

    或者、我们可以再次查看 CLB、它可以配置为在初始状态下强制 ePWM 信号处于低电平、在第二个系统状态(由外部信号触发)下通过 ePWM 信号、然后在一个 ePWM 周期后返回初始状态。 此外、您的信号需要充当同步信号、以确保计数器处于您需要的位置、但总体而言、只要您愿意通过 CLB 执行该操作、这可能是一条更可靠的路由。

    希望这很有道理、并且始终可以自由地提出更明确的问题、
    Jason Osborn

    (另外、当 计数器通过同步复位为零时、我不确定是否触发 CTR=Zero 信号。 如果是、我个人只需将该中断设置为在 软件中首次触发时忽略它。}

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

    您好!

    我刚刚意识到、我错过了比我所说的更简单的答案。 推荐-抱歉! 如果您仔细查看器件的 C2000Ware 示例、ePWM_ex12_monoshot_mode 应该正是您所需要的-针对外部信号的单次 ePWM!

    我再次对我在最初的答复中遗漏这一点表示歉意。

    希望这对您有所帮助、

    Jason Osborn

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

    您好 Jason、

    请尝试了解应用的需求、如之前所述:

    我们正在设计每个模块具有3个轴的模块化伺服驱动器。

    通过 EtherCAT 网络的"分布式时钟"(=DC)功能、这些模块可同步至+/- 10ns。

    TMS2838的每个 ESC (EtherCAT 从站控制器)都在运行其自身但全局同步的时钟、该时钟会生成所谓的 SYNC0信号。

    µs 的 SYNC0周期为32.25 μ s。 DC 是通过网络电缆将多个 TMS2838与 ns 同步的唯一方法。

    最初满足 SYNC0以触发数字 IO 的输入或输出锁存器。

    在我们的情况下(伺服驱动器)、它需要同步 PWM 脉冲以激发同步多个轴。

    正如我在本主题中提到的、减少多个 PWM 输出的同步边沿有 EMI 的原因。

    因此、脉冲同步到脉冲中间位置、此时不会发生边沿。

    如果仔细查看我发布的图表、您将看到 outa/outb 的边沿在计数器周期的中点周围对称(几乎与 SYNC0周期相同)。

    因此、我们不仅更改每个控制器周期的脉冲宽度(它是一个闭环电流控制器)、还会移动相位。

    这降低了整个系统中同时发生脉冲边沿的可能性。

     

    因此、不可能通过"外部"信号 SYNC0 (TMS2838内部的 B.T.W.)打开脉冲。

    周期开始(SYNC0)和 OUTA/OUTB 边沿之间的时间因周期而异、具体取决于 PWM CMPA 值。

    我希望您了解 ePWM_ex12_monoshot_mode 对我们不起作用。

     

    到目前为止、我所读过的 OneShot 操作的所有解决方案都受到了根部的影响:

    TI 应简单地实施 OneShot 计数器模式、如向上、向下、向上/向下和冻结。

    但 TI 建议使用 CLB 实现 EPWM 逻辑、或以复杂的方式使用 EPWM 功能(因其他原因而发明)。

    这样做会导致重要的 ePWM 特性变得宽松(向上/向下模式、死区切换等)。

     

    因此、为了避免在 SYNC0丢失的情况下产生错误的信号(例如、ESC 状态机已更改状态)、

    我们更喜欢在 CTR=ZERO 时启动计时器窗口、如果该窗口内没有发生 SYNC0、则触发单触发器 TRIPzone (关闭 OUTA/B)。

    因此、我们将允许 CTR 从零重新开始递增、但如果未接收到 SYNC0、则不允许 CTR=CMPA 设置 outA/B。

     

    您好!

    Volker。

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

    沃尔克、您好!

    另一位 TI 员工和我目前正在研究此问题、我们应该能够在星期五结束之前通过另一种方法与您联系。 同时、我要注意的是、CLB 的使用不一定会失去 ePWM 特性- CLB 能够"劫持"到各种 ePWM 子模块的输入和输出来操纵相关信号、 这个功能的使用是我在第二次答复中建议的-在已经通过所有 ePWM 子模块之后操作 ePWM 的最终输出。

    无论如何、我们将继续为您研究、希望我们能找到令人满意的解决方案。

    此致、

    Jason Osborn

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

    沃尔克、您好!

    我们还为您提供了另外两种解决方案。

    首先、事件触发器模块能够通过数字比较模块的输入生成 SOC 和中断、而数字比较模块又能够接收来自 ePWM X-BAR 的输入。 CLB 能够将计数器比较事件(例如 CTR=Zero、PRD、CMPA、CMPB、 以及 ePWM 输出信号。 CLB 还可配置为接收同步信号、然后输出到 X-Bar。

    通过正确设置 CLB 的状态机、只有在接收到输入 synct0脉冲后一个周期内发生计数器事件、并且在单个周期过后 ePWMxA/B 信号保持恒定时、才能生成 SOC 或中断。 虽然计数器本身仍在运行、但它实际上  无法执行任何操作。

    其次、您之前提到过、您希望避免一般使用 CLB。 尽管上述特性对 ePWM 功能没有任何影响、但我们也找到了一种不依赖它的解决方案。  警告。 此解决方案使用通常不推荐使用的功能。  首先、将 CMPC 设置为在您的周期的99%处发生(您之前讨论过的将您的周期缩短到的点)。 其次、通过 ET 子模块将 CTR=CMPC 设置为 ISR 的触发器。 在该 ISR 中、设置:

    • TBCTL[CTRMODE]= 3

    这会将模式设置为 冻结 、而不是向上向下。 最后、在接收到要设置的同步信号时设置 ISR

    • TBCTL[CTRMODE]= 2

    这会将模式设置为向上向下计数、而不是冻结。 此外、在任何一种解决方案中、同步信号也应用作 TB 模块的同步输入信号、就像它在您的现有代码中一样。 问题是、这个系统依赖于在正常运行期间、而不是只在初始化期间改变上述寄存器。   这不是推荐的行为、我们无法100%保证。

    此致、

    Jason Osborn

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

    您好 Jason、

    很抱歉我的回复很晚、但我在过去两周休假了。 感谢您的最后建议。 我可以看到您建议的阻止 ISR 的方法、方法是在计数器比较信号和事件触发器模块之间使用 CLB 状态机。 如果自上次触发以来存在 SyncSignal、CLB 将仅将计数器比较信号旁路到事件触发器模块。 到目前为止都很好。 但我还不了解您可以通过死区 模块来更改 ePWMA/B 输出的方法。 DB 由 AQ 触发。 AQ (在我的实际建议中)由 CC CTR=CMPA 触发。 我看不到停止 CC 的方法、无法将其 CTR=CMPA 信号插入到 AQ 模块、因为 AQ (ET 以外的)似乎没有可供 CLB 状态机使用的数字比较输入。 那么、我们如何阻止计数器触发 AQ/DB 呢? 或者、如果 CLB 状态机在没有之前的 SYNC0的情况下检测到 CNT=CMPA、您是否会看到使用 TZ 冻结输出的可能性?

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

    好的、我已经检查了可能性、发现我可以使用 CLB 状态机来解决 输出 ePWMA/B 的冻结问题 通过使用 CLB 对 DC 单元执行操作、然后使用 TZ 模块、我们可以定义 DB 仅在条件"SYNC0在最后一个 CTR=CMPB"之后到达"为真时生成 PWM 脉冲。 因此、通过使用 CLB 在 CTR=CMPB 信号进入 ET 模块之前对其进行滤波、并使用 CLB 冻结 DB 输出、我们最终得到了我所需的结果。

    非常感谢您在这种复杂的情况下提供的帮助!