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:在 TBCLKSYNC = 0时初始化 ePWM

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/980873/tms320f28379d-initializing-epwms-while-tbclksync-0

器件型号:TMS320F28379D

大家好、

对于我的应用、我将使用多个同步 ePWM 通道、初始化过程相当长、以确保输出信号在前几个周期内是完美的、没有任何奇数行为。 我遵循 TI 的建议、在初始化所有寄存器时保持 TBCLKSYNC = 0、然后写入 TBCLKSYNC = 1以激活 ePWM 操作(之后是软件强制同步)。 但是、我注意到初始化例程中的某些内容不符合我的预期。 例如、我要通过初始化 AQ 模块来设置 PWM 输出的状态初始化。 下面是我尝试执行此操作的大致方式:

//禁用 TBCLKSYNC
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

....

//初始化 AQ 以便两个引脚最初都处于低电平
//ePWMB 在 DB 模块中反相、因此需要设置 B 输出高
电平 EPwm1Regs.AQSFRC.bit.RLDSF=3;//立即重新加载 EPwm1Regs.AQSFRC.bit.AQSFFA=AQSFREG=AQ1Regs.AQSFR1.bit.AQSFR1.AQSFREG=1.AQSFREG1.AQSFREG=1.AQSFREG1.AQSFR1.AQSF1.AQSFR1.AQSFR1.AQSFREG1.AQSF1.AQSF1.bit.AQSFREG=1.AQSFREG1.







//设置 DB 以反转 AQ
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC 的 B 输出;//这是我观察 B 引脚变为高电平的位置。

(笑声) //完成寄存器初始化//启用时基时钟
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
__asm (" nop");
__asm (" nop");
__asm (" nop");__asm (" nop");
_asm (" nop");
__asm (" nop");
//执行软件同步
EPwm1Regs.TBCTL.bit.SWFSYNC = 1;//强制从 TBPHS 加载所有时基
__asm (" nop");
__asm (" nop");
__asm (" nop);__asm (" nop)

;
EDIS; 

但是、OTSFA 操作似乎不会执行任何操作。 但是 、当 DBCTL.bit.POLSEL 被写入时、我确实看到 ePWM1B 引脚变为高电平。 在调试器中、似乎如果我在此后的任何时间手动设置 TBCLKSYNC、那么 ePWM1B 会立即变为低电平、就好像 OTSF 操作一直保持挂起状态一样。

那么、当 TBCLKSYNC=0时、哪些操作实际生效、哪些操作将等待 TBCLKSYNC 设置为1?

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

    尊敬的 Mike:

    当被置位时、TBCLKSYNC 位将为所选 CPU 内的所有 ePWM 模块启动时基计数器(TBCTR)。 除在 PCLKCR2中启用的每个模块的 TBCTR 之外的所有器件仍将由 EPWMCLK 计时。 这就是您看到死区生效而不是动作限定符设置的原因。 动作限定器取决于 TBCTR 计数、但死区模块不会(这是应用中的安全预防措施)。

    此致、

    Marlyn

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

    感谢 Marlyn 的回复、

    [引用 USER="Marlyn Rosales Castaneda20"]动作限定符取决于 TBCTR 计数,但死区模块不[/引用]

    我可以理解、AQ 的许多操作都依赖于 TBCTR、因为它处理的大多数事件都来自 TB 和 CC 模块。 但我认为、软件强制事件独立于 TBCTR 工作并不是不合理的、尤其是因为 TRM 表示软件强制事件具有最高优先级。 TZFRC 操作也会应用相同的逻辑。 这些也是 TBCLKSYNC 选通的吗?

    无论如何、那么初始化 AQ 的正确方法是什么? 我在有关 PWM 初始化的其他线程中看到、建议的解决方案向下推至"只允许前几个 PWM 周期提供衰减信号、 但禁止这些信号进入引脚、直到它们稳定至所需状态"、方法是使用 TZ 或 GPIO 多路复用器设置、但我不认为这些是可接受的解决方案(GPIO 多路复用器设置与 ePWM 时基不同步、 我需要进行设置、以便 TZ 事件触发故障处理 ISR)。 也许在初始化期间短暂启用 TBCLKSYNC 只是为了使 AQ 设置保持有效会起作用? 我还没有看到其他人尝试过这种方法。

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

    Mike、

    [引用 USER="Mike Twieg1]TZFRC 操作也会使用相同的逻辑。 这些也是 TBCLKSYNC 选通的吗?[/QUERP]

    否、TZFRC 操作不由 TBCLKSYNC 选通。 即使在初始化期间、这些仍然应该生效。 与死区子模块一样、跳闸区域子模块也应配置为在许多情况下提供预防措施。 这不取决于时基计数器。

    在您的应用中、您是否在初始化过程中或在应用中的哪个点之前尝试将所有 ePWM 输出保持在低电平? 正确的做法是、GPIO 多路复用器设置不与 ePWM 时基同步、但您始终可以在可编程事件数量后生成中断、并在该 ISR 内更改 GPIO 多路复用器设置。 这不应干扰触发区中断。 这是否适合您的应用?  

    此致、

    Marlyn

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

    您好、Marlyn、

    [引用用户="Marlyn Rosales Castaneda20"]TZFRC 操作不受 TBCLKSYNC 控制。 即使在初始化期间、这些仍然应该生效。 与死区子模块一样、跳闸区域子模块也应配置为在许多情况下提供预防措施。 这不取决于时基计数器。[/QUERT]

    好的、我了解为什么在 TBCLKSYNC 之前允许某些操作、这与为什么许多寄存器需要 EALLOW 类似。 问题是 TRM 似乎没有解释 TBCLKSYNC 控制哪些操作。 想象一下、如果 TRM 没有列出受 EALLOW 保护的寄存器... 这就是我要处理的内容。

    [报价用户="Marlyn Rosales Castaneda20"]在您的应用程序中,您是否正在尝试在初始化过程中或在应用程序中的哪一点之前将所有 ePWM 输出保持在低电平?

    直到 TBCLKSYNC 被置位。 此时、我有许多由 ePWM 生成的 SOC 和 INTS、所有这些都设置为触发 ADC 转换、控制 ISR 和 CLA 任务。 TBCLKSYNC 被置位后、我基本上处于"实时"模式。 CPU 必须为那些由 ePWM 触发的控制 ISR 提供优先级(tripzone ISR 是唯一的例外、并且被允许中断和阻断正常控制 ISR)。 我需要 PWM 信号不会产生任何交叉传导事件。 但进入"实时"模式后再加扰另一个初始化例程或 ISR 并不是一个有吸引力的解决方案。

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

    尊敬的 Mike:

    感谢您提供有关可用文档的反馈。 我将提交一个请求、以添加更多有关 TBCLKSYNC 选通哪些函数以及哪些函数不是 TRM 的下一个版本的详细信息。

    现在、让我们找出一个能够满足您所要做的工作的解决方案。 在当前设置中、您发现操作限定符强制寄存器未生效的问题是什么? 换句话说、如果 ePWM 输出 B 在初始化期间为高电平、这会对您的系统产生什么影响? SoC 事件应由时基计数器事件触发、在初始化期间不应发生时基计数器事件。  

    此致、

    Marlyn

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

    在我的应用中、我将使用每个 ePWM 通道的两个输出来控制半桥。 ePWMxA 驱动高侧 FET、ePWMxB 驱动低侧 FET。 为此、我将使用 AQ 的两个输出、而不是允许 DB 模块从单个 AQ 输出创建互补信号(我有充分的理由)。 此外、在我的应用中、有必要禁用 PWM 输出、从而禁用电力电子器件、然后再次启用它们、而无需复位 MCU。

    禁用时、我首先强制执行 OneShot TZ 事件、然后执行所有不同的寄存器访问以停止 EPWM 计数等 我看到有时、当我再次启用 ePWM 时、AQ 进入了两个输出初始化为高电平的状态、这会立即导致损坏。 我可以考虑很多可能的原因(例如、如果我在 CMPA 和 CMPB 事件之间停止 TBCTR)。 很难确定,因为调整数咨委会的国家不能直接观察到。 无法观察到酸盐本身并不是一个大问题、但如果我也不能强制 AQ 进入已知状态... 那么、这是一个大问题。

    我已经考虑但尚未测试的另一个选项是使用 SOFTPRES2位软复位 EPWM 通道、然后从头开始完全重新执行配置。  SOFTPRES2只是清除寄存器值、还是还清除 AQ、SOC 和 INT 等内部状态? 它是否完全取决于 TBCLKSYNC?

    此致、

    Mike

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

    尊敬的 Mike:

    您可以使用 SOFTPRES2位软复位 ePWM 模块、这将清除 AQ、SOC 和 INT 的寄存器值和内部状态。 如果在设置 SOFTPRES2位之前已经触发了某个操作、则仍将执行该操作。 但是、软复位将阻止任何新一代器件。 您是对的、您必须再次初始化 ePWM 模块并同时设置 TBCLKSYNC 位。

    此致、

    Marlyn