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.

[参考译文] TMS320F28377S:在跳闸区中断条件下、询问如何设置 ePWM 死区

Guru**** 2392905 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1447341/tms320f28377s-inquire-about-setting-dead-band-of-epwm-under-condition-of-trip-zone-interrupt

器件型号:TMS320F28377S
主题中讨论的其他器件:SysConfig

工具与软件:

尊敬的团队:

我们使用 cmpss 将波形作为输入、当它达到 DACHVALS.bit.DACVAL 和 DACLVALS.bit.DACVAL 设置的基准值时、生成跳闸区中断、并生成同步的 ePWM 占空比。 跳闸区使用一次性跳闸。
当跳闸区域未激活时、会在 ePWM 中创建死区、但当跳闸区域被激活时、不会创建死区、并且会继续输出与输入波形同步的波形。
是否有方法可以在发生跳闸区域时给出死区?
我们已尝试在跳闸区中断中设置死区、但它不起作用。

此致、
Oh Junyeong Oh

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

    尊敬的 Junyeong:

    您能提供一些波形来说明您看到的行为吗?  

    您能否查看以下应用报告?  https://www.ti.com/lit/an/spradf4/spradf4.pdf

    我们的实现使用 CLB 在硬件中保持同步的 ePWM 占空比、而无需通过软件中断进行处理。 这可能与您正在实施的方案类似吗?

    此致、

    Peter

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

    尊敬的 Peter:  

    底部的图片是在没有触发区中断发生的情况下设置50% epwm2、4占空比输出和死区的互补运行的波形。 我们可以使用 DBRED、DBFED 寄存器处理死区时间。  


    底部的图片是互补操作的波形、在该波形中、当 cmpss 输入波形超过特定参考值(DACHVALS.bit.DACVAL 和 DACLVALS.bit.DACVAL)时、发生跳闸区中断、并输出与超过参考值的输入波形同步的 ePWM。 在这种情况下、我们设置死区、但波形是 ePWM 的输出、没有死区。

    这与您在链接材料中实现死区逻辑时尝试实现的情况类似、但在查看数据表后、似乎无法使用它、因为377S 不支持 CLB 功能。

    此致、
    Oh Junyeong Oh

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

    尊敬的 Junyeong:

    感谢您提供的附加图像描述了您的问题、我误读了您的器件型号 但正确的是、CLB 不可用于您的器件。 我认为此问题可能与 ePWM 外设的配置有关。 您的 ePWM 是静态配置还是更改控制环路中的 ePWM 配置? 如果您还可以发送用于配置 ePWM 模块的那部分代码、会有所帮助。

    有关初始外设配置、建议参阅 SysConfig 工具。 您可以通过 dev.ti.com 工具链访问此工具。 您能够通过图形界面配置 ePWM 外设。 然后、您可以通过 board.h 文件查看生成的代码、并将此代码与代码进行比较、查看是否有任何配置错误的内容。

    此致、

    Peter

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

    尊敬的 Peter:

    底部的代码是 EPWM2控制代码、在主循环中静态配置、部分通过中断控制 EPWM。

    主循环

    PieVectTable。 EPWM2_TZ_INT =&EPWM2_TZ_ISR;

    EALLOW;
    EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0x4;
    EPwm2Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 0x4;
    EPwm2Regs.TZDCSEL.bit.DCAEVT1 = 2;// DCAH = HIGH、DCAL =不用考虑
    EPwm2Regs.TZDCSEL.bit.DCBEVT1 = 2;// DCBH = HIGH、DCBL =不用考虑
    EPwm2Regs.TZSEL.bit.DCAEVT1 = 1;
    EPwm2Regs.TZSEL.bit.DCBEVT1 = 1;
    EPwm2Regs.TZCTL.bit.DCAEVT1 = TZ_NO_CHANGE;
    EPwm2Regs.TZCTL.bit.DCBEVT1 = TZ_NO_CHANGE;
    EPwm2Regs.DCACTL.bit.EVT1SRCSEL = 0;// Source is DCAEVT2 Signal (源是 DCAEVT2信号)
    EPwm2Regs.DCBCTL.bit.EVT1SRCSEL = 0;// Source is DCBEVT2 Signal (源是 DCBEVT2信号)
    EPwm2Regs.DCACTL.bit.EVT1FRCSYNCSEL = 1;// Source is Asynchronous Signal (源是异步信号)
    EPwm2Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 1;// Source is Asynchronous Signal (源是异步信号)
    EDIS;

    EALLOW;
    EPwm2Regs.TZCTL.bit.tZA = TZ_FORCE_LO;
    EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_HI;

    // ePWM 模式设置
    EPwm2Regs.TBPRD = PWM_PRD;//设置计时器周期801 TBCLK
    EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;// Phase 为0
    EPwm2Regs.TBCTR = 0x0000;//清除计数器
    EPwm2Regs.CMPA.bit.CMPA = PWM_PRD/2;
    EPwm2Regs.CMPB.bit.CMPB = PWM_PRD/2;

    //设置计数器模式
    EPwm2Regs.TBCTL.bit.CTRMODE = tb_count_updown;//向上计数和向下计数
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;// Disable phase loading (禁用相位加载)
    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    EPwm2Regs.TBCTL.bit.SYNCOSEL = 0;

    //设置隐藏
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// Load on Zero
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    //设置操作
    EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//针对事件 A 设置 PWM2A、向上计数
    EPwm2Regs.AQCTLA.bit.CAD = AQ_Clear;//在发生事件 A 时清除 PWM2A、向下计数
    EPwm2Regs.AQCTLB.bit.CBU = AQ_clear;//针对事件 B 设置 PWM2B、向上计数
    EPwm2Regs.AQCTLB.bit.CBD = AQ_SET;//在事件 B、向下计数时清除 PWM2B

    //设置死区
    EPwm2Regs.DBCTL.bit.out_mode = 0x3;
    EPwm2Regs.DBCTL.bit.POLSEL = 0x2;
    EPwm2Regs.DBCTL.bit.in_mode = 0x0;
    EPwm2Regs.DBCTL.bit.OUTSWAP = 0x0;
    EPwm2Regs.DBCTL.bit.DEDB_MODE = 0x0;
    EPwm2Regs.DBRED.all = 100;
    EPwm2Regs.DBFED.all = 100;
    EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_PRDZERO;//等于零或周期(TBCTR = 0或 TBCTR = TBPRD)
    EPwm2Regs.ETSEL.bit.INTEN = 1;// Enable INT (启用 INT)
    EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;//在发生第1个事件时生成 INT
    EPwm2Regs.TZEINT.bit.DCAEVT1 = 1;
    EPwm2Regs.TZEINT.bit.DCBEVT1 = 1;
    EDIS;

    EALLOW;
    EPwmXbarRegs.TRIP5MUX0TO15CFG.ALL = 0x0000;
    EPwmXbarRegs.TRIP5MUX16TO31CFG.ALL = 0x0000;
    EPwmXbarRegs.TRIP5MUX0TO15CFG.bit.MUX2 = 1;
    EPwmXbarRegs.TRIP5MUXENABLE.bit.MUX2 = 1;
    EPwmXbarRegs.TRIPOUTINV.bit.TRIP5 = 0;
    EDIS;

    SysConfig

    中断失效 EPWM2_TZ_ISR (void)

    EALLOW;
    EPwm2Regs.TBCTR = 0;
    EPwm2Regs.TZCLR.all = 0x7f;
    EDIS;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;

    }

    中断失效 EPWM2_ISR (void)

    EPwm2Regs.TZFLG.ALL = 0x00;
    PieCtrlRegs.PIEACK.all = PIEACK_Group3;
    }

    在我看来、通常用于 OCP (过流保护)和 OVP (过压保护)目的的跳闸区中断必须立即激活、所以我想问在结构上是否不能提供死区。

    感谢您的评论。

    此致、
    Oh Junyeong Oh

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

    尊敬的 Junyeong:

    为了实现峰值电流模式控制、死区和 CMPSS 跳闸均受到支持、请参阅下图。

    我认为、还应该在跳闸区域选择上配置逐周期选项、因为这将在 PWM 周期结束时自动清除跳闸、并为下一个周期重新启用跳闸。

    EPwm2Regs.TZSEL.bit.CBC1 = 1;

    这是用于我们参考设计的 PCMC 实现的标准 PWM 配置、因此这也应该适合您

    在边注上、我还注意到您已经将两个时钟分频器设置为/1。 您可以验证您的 EPWMCLKDIV 寄存器吗? 由于 ePWM 时钟在此器件上的最大100 MHz 值、因此应采用以下设置。

    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 1; 


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

    尊敬的 Peter:

    它设置为一次性跳闸、但我已尝试各种方法将其设置为逐周期、包括将其设置为 DCAEVT2和 DCBEVT2、包括您提供的代码、但设置死区似乎不起作用。

    而且当 EPWMCLKDIV 寄存器设置为0时、会生成所需频率的 ePWM、并且0似乎正确。


    此致、
    Oh Junyeong Oh

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

    尊敬的 Junyeong:

    如果 EPWMCLKDIV 设置为0、 TBCTL.bit.HSPCLKDIV 和 TBCTL.bit.CLKDIV 设置为 TB_DIV1、则您的 EPWM 时钟将设置为200 MHz、这违反了 EPWM 模块的最大时钟频率。 您能尝试将 EPWMCLKDIV 设置为1吗? 您需要考虑从200 MHz 到100 MHz 的时钟减少情况、从而重新调整用于计算所需频率的数学计算。

    此致、

    Peter

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

    尊敬的 Peter:

    如您所说、我将 EPWMCLKDIV 设置为1并将 TBPRD 减少一半、以生成所需的频率。 波形输出良好、但死区仍然没有创建。  

    我通过分别将 TZCTL.bit.TZA 和 TZB 设置为2和1使 epwm2a、b​​具有互补作用、但由于默认值与此相反、是否可以认为无法提供死区?

    或者、在跳闸区情况下、当创建与​​DACHVAL 和 DACLVAL 寄存器值同步的 ePWM 时、是否无法从寄存器值更改死区?


    此致、
    Oh Junyeong Oh

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

    尊敬的 Junyeong:

    由于时钟似乎不是错过死区的原因、我认为可能的解决方案是尝试使用 ePWM 中的 CBC 跳闸模式、而不是一次性跳闸。 这将有助于避免您需要使用中断来清除跳闸、并且还应允许您在检测到 CMPSS 跳闸时具有死区。 请允许我与 PWM 专家协调、以检查您的实施情况

    此致、

    Peter

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

    尊敬的 Junyeong:

    您是否已能够验证您 ePWM 问题的解决方案?

    此致、

    Peter

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

    尊敬的 Peter:

    我还没有解决它。

    此致、
    Oh Junyeong Oh

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

    尊敬的 Junyeong:

    您可以参考此主题: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1005096/tms320f28384s-one-question-of-epwm-trip-zone-submodule

    由于 TZ 位于 DB 模块之后(以尽可能缩短用于 OCP/OVP 的关断时间)、因此这是预期的行为。 因此、其他线程中提到的方法应该是有效的。 您也可以将 CMPSS 输入配置为作为直流事件进入 ePWM、然后通过动作限定符将该事件配置为 T1/T2事件。 在这些情况下、T1/T2的功能与使用静态 CMPx 值来更改 PWM 输出时的功能相同

    此致、

    Peter