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.

[参考译文] TMDSCNCD28027:切换 ePWM 输出失败(两个极性相同的连续脉冲)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/837575/tmdscncd28027-failure-to-toggle-epwm-output-two-consecutive-pulses-of-same-polarity

器件型号:TMDSCNCD28027

F28027控制卡的 EPWM1输出设置为切换输出时出现问题、如下所示:

EPwm1Regs.AQCTLA.bit.ZRO = 0x3;//当计数器= 0时、切换 EPWM1A 输出

问题如下所示。  黄色走线为 EPWM1A、蓝色走线为 EPWM1B。  在该单次触发跟踪中捕获 EPWM1A 的两个连续脉冲。  (粉红色迹线是 EPWM4、用于生成 ISR 和斜坡启动时序)。

我已设置 EPWM1、因此比较器可以生成同步事件、将 TBPHS 值(=0)加载到时基寄存器中。  如果比较器未跳闸、则 EPWM1将复位为 MAX_PERIOD 值。  当比较器在 MAX_PERIOD 之前跳闸时、发生双脉冲、以便比较器同步与 MAX_PERIOD 同步或几乎与 MAX_PERIOD 同步。  此处显示的波形是通过直流电压生成至比较器输入的、并且没有由 ePWM 输出控制的开关电子器件。

 

是否有任何方法可以抑制这种双脉冲?  如果我将开关电子器件实际连接到控制器、这种行为将是灾难性的。

以下是相关代码:

EALLOW;
//配置 ePWM1AB (用于切换初级半桥 FET)
PWM_ComplPairDB_CNF (1、MAX_PERIOD、1、0);//使用互补输出配置 EPWM1、1=主控模式、0=相位
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//当计数器= 0时同步输出
EPwm1Regs.TBCTL.bit.PHSEN = 1;//启用从相位寄存器加载计数器寄存器
EPwm1Regs.TBPHS.Half.TBPHS = 0;//相位寄存器值
EPwm1Regs.TBCTL.bit.PHSEN = 0x1;//导致计数器在 SYNC 变为 TBPHS
EPwm1Regs.TBPHS.Half.TBPHS = 0x0;//在 SYNC 设置计数器为0
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT;// 8 = DCAH =比较器1最初输出(在 Comp1和 Comp2之间交替每个相位)
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI;// 2 = DCAH 高电平上设置的 DCAEVT1 (当比较器输出变为高电平时将变为有效)
EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 1;// 1 =源为 DCEVTFILT 信号(由事件窗口过滤、见下文)
// EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = 0;// 0 = DCAEVT1.FORCE 的同步路径
EPwm1Regs.DCACTL.bit.EVT1SYNCE = 0x1;// 1 =同步生成启用
EPwm1Regs.TZCTL.bit.DCAEVT1 = 0x3;//事件发生时不对 EPWM1A 输出执行任何操作
EPwm1Regs.DCFCTL.bit.SRCSEL = DC_SRC_DCAEVT1;// 0 =滤波器源= DCAEVT1
EPwm1Regs.DCFCTL.bit.PULSESEL = DC_PULSESEL_ZERO;// 1 = TBCTR 上的滤波器启动= 0
EPwm1Regs.DCFCTL.bit.Blanke = DC_BLANK_ENABLE;// 1=启用消隐窗口
EPwm1Regs.DCFCTL.bit.BLANKINV = 0;// 0 =消隐窗口未反转
EPwm1Regs.DCFOFFSET = 0;//滤波器偏移
EPwm1Regs.DCFWINDOW = min_period;//缓存在斜坡被触发后结束
EPwm1Regs.AQCTLA.bit.ZRO = 0x3;//当计数器= 0时、切换 EPWM1A 输出
EPwm1Regs.AQCTLA.bit.CAU = 0x0;//不执行任何操作(禁用操作)
EPwm1Regs.AQCTLA.bit.PRD = 0x0;//不执行任何操作(禁用操作)
PWM_ComplPairDB_updatedb (1、红色、FED);//设置死区时序

//配置 PWM2A
PWM_1ch_UpCntDB_Compl_CNF (2、MAX_PERIOD、0、0);//将周期更改为 MAX_PERIOD
PWM_1ch_UpCntDB_Compl_updateedb (2、REM1、FEM1);

//配置 PWM3A
PWM_1ch_UpCntDB_CNF (3、MAX_PERIOD、0、0);//将周期更改为 MAX_PERIOD
PWM_1ch_UpCntDB_updatedb (3、REM2、FEM2);

//配置 EPWM4
PWM_1ch_CNF (4、MAX_PERIOD、0、MIN_PERIOD+MIN_Delta);//更改为从器件、周期更改为 MAX_PERIOD
// EPwm4Regs.CMPCTL.bit.SHDWAMODE = 1;//立即模式。 仅使用活动比较 A 寄存器。
EPwm4Regs.CMPA.half.CMPA = MAX_PERIOD-50;//设置 EPWM4输出脉冲启动和 CNTL_ISR 的触发点
EPwm4Regs.AQCTLA.bit.ZRO = 0x1;//输出低电平
EPwm4Regs.AQCTLA.bit.CAU = 0x2;//输出高电平
EPwm4Regs.AQCTLA.bit.PRD = 0x0;//不执行任何操作(禁用操作)

//配置比较器和斜坡发生器块
DacDrvCnf (1、0x7FFF、1、4、斜率); //为 PQMC 添加了:COMP1、DACVAL=max Q15、DACSOURCE=rampgen=1、RAMPSOURCE=PWM4
Comp1Regs.COMPCTL.bit.SYNCSEL = 0;//不过滤比较器输出
DacDrvCnf (2、0x7FFF、1、4、斜率); //为 PQMC 添加了:COMP2、DACVAL=max Q15、DACSOURCE=rampgen=1、RAMPSOURCE=PWM4
Comp2Regs.COMPCTL.bit.SYNCSEL = 0;//不过滤比较器输出

EDIS;

感谢您的帮助、

Ciaran

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

    有关问题的更多信息:

    在某些时序条件下、可能会产生无限的重复 EPWM1A 高电平脉冲流:

    当比较器事件发生时或者 TBCTR = TBPRD 后稍稍稍稍稍稍稍稍稍发生时、就会发生这种情况。  当 TBCTR=0时、消隐窗口被置位。  比较器的 DCAEVT1与消隐窗口的置位之间似乎存在竞态条件、而 DCAEVT1正在胜出。  它在消隐窗口被置为有效前经过、并再次复位 TBCTR、从而产生 ePWM 输出的双次切换。

    是否有针对这种情况的配置解决方案、或者我是否必须放弃在切换模式下使用控制器?  现在、我将使用两个 EPWM 来实现此功能(一个用于控制 PWM 输出、另一个用于生成时序信号)。  如果我分离每个开关相位的控制、可能需要4个 EPWM。

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

    今天我没有时间完全回答你的问题,明天我将回答。

    此致、
    Cody  

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

    谢谢、我可以使用这方面的帮助。

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

    锡亚兰

    我不太清楚如何使用比较器输出将 TBPHS 加载到 TBCTR、您能详细说明吗?

    在 C2000器件上、消隐窗口(BW)生效前存在3个周期的延迟。 如果您在 TBCTR=0时将 BW 设置为空白、那么它实际上会在 TBCTR=3时开始消隐、您认为这是您看到的问题的原因吗?

    为了避免这种情况在 TBPRD-3周期启动 BW、它将继续进入下一个 PWM 周期。

    希望这对您有所帮助。

    此致、
    Cody  

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

    Cody、

    很不错!  哇哦!  这3个周期延迟与我的观察结果一致、即消隐窗口处于活动状态之前有一个小窗口让第二个同步脉冲通过。  我按照您的建议进行了修正、方法是将 DFFFOSET 从0更改为 MAX_PERIOD-3、然后将消隐窗口的宽度延长3以进行补偿。

    是否有描述这些内部延迟的文档?  《TMS320F2802x、TMS320F2802xx Piccolo 技术参考手册》(SPRUI09)中未显示这些延迟。  例如、"图3-51. 消隐窗口时序图"显示了在 CTR=0被置为有效后从时钟开始的消隐窗口。  它不显示3周期延迟。  我在文本中搜索了所有"消隐"实例、但没有发现任何提及。    我在其他地方看到这些内部延迟的示例=例如、PWM_1ch_Cnf.c 等 PWM 配置代码向 TBPHS 值添加2以补偿逻辑延迟。  对于关键计时、必须了解这些延迟。

    >> 我不太清楚如何使用比较器输出将 TBPHS 加载到 TBCTR、您能详细说明吗?

    COMP1输出触发事件 DCAEVT1、该事件被设置为生成一个将 TBCTR 复位为 TBPHS 的同步脉冲。  DCAEVT1由消隐窗口过滤、以防止它在 Min_Period 经过之前同步 EPWM。  相关设置为:

    EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 8;//将 DCAH 设置为 COMP1输出
    EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 2;//将事件 DCAEVT1设置为高电平(当 COMP1输出变为高电平时)
    EPwm1Regs.DCACTL.bit.EVT1SYNCE = 1;//启用事件 DCAEVT1上的同步生成(将 TBCTR 同步到 TBPHS)
    EPwm1Regs.TZCTL.bit.DCAEVT1 = 3;// DCAEVT1对 EPWM1A 输出没有直接影响
    EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 1;//启用消隐窗口
    EPwm1Regs.DCFCTL.bit.SRCSEL = 0;//过滤 DCAEVT1事件
    EPwm1Regs.DCFCTL.bit.PULSESEL = 1;//在 TBCTR = 0时启动滤波器
    EPwm1Regs.DCFCTL.bit.Blanke = 1;//启用消隐窗口
    EPwm1Regs.DCFCTL.bit.BLANKINV = 0;//消隐窗口未反相
    EPwm1Regs.DCFOFFSET = MAX_PERIOD-3;//将滤波器偏移设置为 TBPRD-3以补偿启动消隐窗口的3个时钟延迟(绕回至下一个周期)
    EPwm1Regs.DCFWINDOW = min_Period+3;//消隐窗口持续时间= min_cycle、加3以补偿提早启动窗口3个时钟。

    感谢您的帮助、

    Ciaran

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

    锡亚兰

    这将很快进入文档、这是一个相对新的发现、因为大多数系统设计人员都认为这是比较器和跳闸操作之间延迟的一部分。

    很高兴您解决了这个问题!

    此致、
    Cody  

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

    我想在此问题中添加 PostScript。

    实际上、事实证明、上述解决方案无法解决问题。  嗯、它解决了在消隐窗口被激活前的3个时钟内、TBPRD 之后不久比较器跳闸的直接问题。  这会生成两个 EPWM 同步事件、导致如上所示的双脉冲问题。  但是、它会在其他地方破坏我的计时。

    它不工作的原因是这是一个变频控制器、其频率由比较器跳闸决定、可响应外部模拟电压。  设置 EPwm1Regs.DCFOFFSET = MAX_PERIOD-3不起作用、因为大多数时间周期小于 MAX_PERIOD。  因此、当周期长度由比较器设置时、这会导致在错误的时间出现消隐窗口。

    换言之、我们不知道周期开始时它会有多长时间。  此外、该技术实际上会设置下一个周期的偏移、而不是刚开始的周期的偏移。  如果消隐窗口不与 TBCTR=0同时开始、则无法防止计数器的双重同步。

    在我看来、这似乎是此硬件的一个基本限制。  我正在探索一种不依赖切换的更复杂的方案。  每个相位由单独的 ePWM 控制、并且每个 ePWM 在特定事件发生时绝对关闭或打开。  这需要从外部将 SYNCO 引脚回循环到 SYNCI 引脚、以便 PWM 可以以圆圈的形式相互同步。   同时、我将使用以下缓解措施:

    1)在不发生问题的参数空间(RAMPMAXREF、RAMPDECVAL、输入电压和 max_period)内运行。
    2) 2)在 MAX_PERIOD 之前不久在 EPWM2上生成一个外部脉冲、以强制比较器进行外部触发
    (使用外部电路强制比较器输入为高电平)。

    谢谢、

    Ciaran

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

    锡亚兰

    啊、当 VFD 被 PWM 跳闸时、这将是一个更大的问题。

    您是否在 PWM 之间保持相位偏移? 如果您将 TBCTR =-3复位并立即以相同的值开始消隐、该怎么办? 例如、负载 TBPHS =-3、这可能允许发生跳闸、但它不会影响整个周期、最多为3个周期。

    我同意这确实会给您的系统带来相当大的问题、但我们可能能够找到解决方法。

    此致、
    Cody  

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

    Cody、

    我不知道你可以为 TBCTR 或 TBPHS 使用负值。

    我认为您的建议并不完全有效、但它确实指向了可能的解决方案。  目标是确保滤波器在 ePWM 输出切换前启动3个周期、以防止输出发生双切换。

    滤波器的起始值由以下公式设置:

    EPwm1Regs.DCFCTL.bit.PULSESEL = 1;// 1 =滤波器在 TBCTR = 0时启动

    选择被限制在0或 TBPRD、所以滤波器的启动是固定的。  但 ePWM 输出的切换可能会延迟。  我在 TBCTR=0时切换输出、如下所示:

    EPwm1Regs.AQCTLA.bit.ZRO = 3;// 3 =当计数器= 0时、切换 EPWM1A 输出

    但是、我可以使用 CMPA、在 TBCTR=0时不执行任何操作、并使用 CMPA 来控制切换、从而将此延迟3个周期:

    EPwm1Regs.CMPA.half.CMPA = 3;// compa 触发点(用于在3个时钟后切换输出)
    EPwm1Regs.AQCTLA.bit.ZRO = 0;// 0 =在 TBCTR=0时不执行任何操作(禁用操作)
    EPwm1Regs.AQCTLA.bit.CAU = 3;// 3 =在 TBCTR=CMPA 时切换 EPWM1A 输出

    这会相对于消隐窗口的开始延迟 EPWM1输出切换3个时钟。  它似乎可以防止双切换。  它可能允许一些抖动、因为比较器仍然可以在该3个时钟窗口中再次将 TBCTR 复位为零。  但在范围上似乎可以忽略不计。

    感谢您的帮助、

    Ciaran