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.

[参考译文] C2000WARE:死区模块无法正常工作、栅极驱动信号重叠

Guru**** 2752645 points

Other Parts Discussed in Thread: C2000WARE, POWERSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping

器件型号:C2000WARE
主题中讨论的其他器件: powerSUITE

您好!

我在 F2837xD 器件的 C2000Ware 代码中仍然有问题。 当对 ePWM 1和 ePWM 3的 PWM 死区模块进行编程时、两个输出都具有重叠的 PWM 信号。 我附上了这样一张 EPWM1的示例图片、该图片使用 HRPWM、具有1MHz 的输出开关频率:

正如您看到的、这里有明显的重叠。 我当时认为、我的栅极驱动器上升和下降时间可能不是最好的、但看起来即使打开/关闭命令也是重叠的、因此它很可能仍然是代码问题。 下面是 PWM1模块通道 A/B 的 PWM 设置:

// PWM 发生器定义
uint16_t FLY_PERIOD = 199;//计算:FCLK/FSW >>(200MHz/1MHz)- 1 = 199。
uint16_t fly_deadtime = 8;//死区时间生成= 8 x 5ns = 40ns

空 InitEPwm1 (空)

//设置时基
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数模式
EPwm1Regs.TBPRD = FLY_PERIOD;//设置计时器周期
EPwm1Regs.TBCTL.bit.PHSEN = 0;//禁用相位加载
EPwm1Regs.TBPHS.bit.TBPHS = 0;//相位为0
EPwm1Regs.TBCTR = 0;//清除计数器

//设置 TBCLK = EPWMCLK = 100MHz
//尽管系统时钟为200MHz
//最大 ePWM 时钟为100MHz
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;//时钟与 SYSCLKOUT 之比
EPwm1Regs.TBCTL.bit.CLKDIV = 0;
EPwm1Regs.TBCTL.bit.SYNCOSEL = 0x0;//不同步输出

计数器比较模块中的//初始调制
EPwm1Regs.CMPA.bit.CMPA = 10;//将比较 A 初始值设置为零(我们将需要软启动)
EPwm1Regs.CMPA.bit.CMPAHR =(1 << 8);//初始化 HRPWM 扩展
EPwm1Regs.CMPB.bit.CMPB = 100;
EPwm1Regs.CMPB.bit.CMPBHR =(1 << 8);

//在操作限定符模块中设置操作
EPwm1Regs.AQCTLA.bit.CAU = 0x1;//递增计数时强制 PWMA 为低电平
EPwm1Regs.AQCTLA.bit.ZRO = 0x2;//当 TBCTR = ZRO 时、强制 PWMA 为高电平
EPwm1Regs.AQCTLB.bit.CBU = 0x2;
EPwm1Regs.AQCTLB.bit.ZRO = 0x1;

EPwm1Regs.DBCTL.bit.OUT_MODE = 3;//为下降沿和上升沿完全启用死区
EPwm1Regs.DBCTL.bit.POLSEL = 2;//高电平有效互补(AHC)模式
//EPwm1Regs.DBFEDHR.bit.DBFEDHR = FLY_DEADTIME;//设置下降沿的死区时间
//EPwm1Regs.DBREDHR.bit.DBREDHR = FLY_DEADTIME;//设置上升沿的死区时间// JM Holland 已将*更改为 HR 位
EPwm1Regs.DBFED.bit.DBFED = FLY_DETTIME;
EPwm1Regs.DBRED.bit.DBRED = FLY_DEADTIME;
EALLOW;

//数字比较(DC)子模块
//从跳闸组合输入生成 DCAH 信号
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 15;//或全部由 DCALTRIPSEL 寄存器选择的触发组合-> DCAH
EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 15;//或全部由 DCALTRIPSEL 寄存器选择的触发组合-> DCBH

// DCAH/DCAEVT1/2用于单次触发故障
// DCBH/DCBEVT1/2用于逐周期故障
//单独选择哪些跳闸信号被传递到块中一起进行 OR 运算
EPwm1Regs.DCAHTRIPSEL.bit.TRIPINPUT5 = 1;//输入过压跳闸单次触发故障
EPwm1Regs.DCAHTRIPSEL.bit.TRIPINPUT7 = 1;//阴极过压跳闸单次触发故障
EPwm1Regs.DCBHTRIPSEL.bit.TRIPINPUT4 = 1;//反激式过流逐周期触发故障

//事件 A 操作限定符块
//根据 DCAH 和 DCBH 生成 DCAEVT1/DCBEVT1跳闸事件
//只有 EVT1可用于 OST、而 EVT2可用于 CBC
//需要启用这些寄存器的 A 和 B 来触发两个 PWMx 输出
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 2;// DCAEVT1:DCAH =高电平、DCAL =无关
EPwm1Regs.TZDCSEL.bit.DCAEVT2 = 2;// DCAEVT2:DCAH =高电平、DCAL =无关
EPwm1Regs.TZDCSEL.bit.DCBEVT1 = 2;// DCBEVT1:DCBH =高电平、DCBL =无关
EPwm1Regs.TZDCSEL.bit.DCBEVT2 = 2;// DCBEVT2:DCBH =高电平、DCBL =无关

//事件触发块-生成 DCAEVT1.FORCE 和 DCBEVT1.FORCE 信号(单触发源)
EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 0;//选择 DCAEVT1作为输入信号
EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = 1;//选择异步
EPwm1Regs.TZFRC.bit.DCAEVT1 = 0;//启用 DCAEVT1.force 输出信号
EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = 0;//选择 DCBEVT1作为输入信号
EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 1;//选择异步
EPwm1Regs.TZFRC.bit.DCBEVT1 = 0;//启用 DCBEVT1.force 输出信号

//事件触发块-生成的 DCAEVT2.FORCE 和 DCBEVT2.FORCE 信号(逐周期源)
EPwm1Regs.DCACTL.bit.EVT2SRCSEL = 0;//选择 DCAEVT2作为输入信号
EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = 1;//选择异步
EPwm1Regs.TZFRC.bit.DCAEVT2 = 0;//启用 DCAEVT2.force 输出信号
EPwm1Regs.DCBCTL.bit.EVT2SRCSEL = 0;//选择 DCBEVT2作为输入信号
EPwm1Regs.DCBCTL.bit.EVT2FRCSYNCSEL = 1;//选择异步
EPwm1Regs.TZFRC.bit.DCBEVT2 = 0;//启用 DCBEVT2.force 输出信号

//跳闸区域子模块-跳闸逻辑块
//仅使用 TZCTL 和 EVT1
EPwm1Regs.TZCTL2.bit.ETZE = 0;//仅使用 TZCTL 寄存器,禁用 TSCTL2

EPwm1Regs.TZCTL.bit.DCAEVT1 = 0x10;//跳闸时、强制 EPWM1A 进入低电平状态
EPwm1Regs.TZCTL.bit.DCBEVT1 = 0x10;//跳闸时、强制 EPWM1B 处于低电平状态
EPwm1Regs.TZCTL.bit.DCAEVT2 = 0x10;//跳闸时、强制 EPWM1A 进入低电平状态
EPwm1Regs.TZCTL.bit.DCBEVT2 = 0x10;//跳闸时、强制 EPWM1B 处于低电平状态
EPwm1Regs.TZCTL.bit.TZA = 0x10;//跳闸时、强制 EPWM1A 进入低电平状态
EPwm1Regs.TZCTL.bit.TSB = 0x10;//跳闸时、强制 EPWM1B 处于低电平状态

//跳闸区域子模块-选择 OSHT 和 CBC 源
EPwm1Regs.TZSEL.bit.DCAEVT1 = 1;//为此 ePWM 模块启用 DCAEVT1作为单触发源
EPwm1Regs.TZSEL.bit.DCBEVT1 = 1;//为此 ePWM 模块启用 DCBEVT1作为单触发源
EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;//启用 DCAEVT2作为此 ePWM 模块的 CBC 跳闸源
EPwm1Regs.TZSEL.bit.DCBEVT2 = 1;//启用 DCBEVT2作为此 ePWM 模块的 CBC 跳闸源

//EPwm1Regs.TZFRC.bit.OST = 0x01;//强制跳闸禁用 PWM 输出
//EPwm1Regs.TZFRC.bit.CBC = 0x01;//强制逐周期跳闸以禁用 PWM 输出

//可以插入在清除一次性故障之前等待延迟时间的代码,或沿这些行插入一些代码
//目前,我认为这将关闭 PWM 模块,直到用户复位。

//高分辨率脉宽调制器定义
EPwm1Regs.HRCNFG.ALL = 0x0;//首先清除 HRCNFG 寄存器中的所有位
EPwm1Regs.HRCNFG.bit.EDGMODE = 0x3;//使用 MEP 控制下降沿和上升沿延迟
EPwm1Regs.HRCNFG.bit.CTLMODE = 0x0;// CMPAHR 控制 MEP
EPwm1Regs.HRCNFG.bit.HRLOAD = 0x0;// CTR 上的影子加载= 0用于递增模式

EPwm1Regs.HRCNFG.bit.AUTOCONV = 1;//启用自动转换逻辑
EPwm1Regs.HRPCTL.bit.HRPE = 0;//关闭高分辨率周期控制

EDIS;

//设置 ADC 触发脉冲到 ADC SOCA (ADCAINT1)
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = 2;//在周期匹配时选择 SOCA
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲

上述代码是否存在任何明显错误? PRD 为199、死区时间为8、因此在1uS 周期内约为40ns。 我已经尝试过更短的死区时间、但没有结果、面临同样的问题。
任何建议都值得赞赏、我可以提供的任何其他信息都将非常乐意提供。 下面是信号的详细介绍;


此致、

Joel

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

    您好、Joel、

    由于您使用的是高分辨率 PWM 模式、当 CTRMODE 配置为向上计数模式时、不支持死区模块。 您必须将 CTRMODE 切换为向上/向下计数模式。  

    我们正在努力更新我们的技术参考手册、 以包含此注释。

    此致、

    Marlyn

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

    您好、Marlyn、

    非常感谢您的观看、我将直接对其进行编程、看看它是否会产生任何影响。  

    但是、我的第四个 PWM 模块 EPWM4中仍然存在相同的重叠问题、该模块不使用 HRPWM 模式。 我*想*我已经为 AHC 设置了这个设置,所以不知道为什么我看到重叠。

    //谐振 LCC PWM 模块
    空 InitEPwm4 (空)

    //设置时基
    EPwm4Regs.TBCTL.bit.CTRMODE = 0;//向上计数模式
    EPwm4Regs.TBPRD = RES_PERIOD_MIN;//初始化具有最高频率的 TBPRD 以开始
    EPwm4Regs.TBCTL.bit.PHSEN = 0;//禁用相位加载
    EPwm4Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
    EPwm4Regs.TBCTR = 0x0000;//清除计数器

    //设置 TBCLK = EPWMCLK = 100MHz
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = 0;//时钟与 SYSCLKOUT 之比
    EPwm4Regs.TBCTL.bit.CLKDIV = 0;//
    EPwm4Regs.TBCTL.bit.SYNCOSEL = 0x0;//禁用同步输出(??)

    //设置初始调制
    EPwm4Regs.CMPA.bit.CMPA = RES_PERIOD_MIN/2;//设置初始比较 A 值
    // EPwm4Regs.CMPB.bit.CMPB = RES_PERIOD_MIN/2;

    //设置操作
    EPwm4Regs.AQCTLA.bit.CAU = 0x1;//在 TBCTR = CMPA 时递增计数时强制 PWMA 为低电平
    EPwm4Regs.AQCTLA.bit.ZRO = 0x2;//当 TBCTR = ZRO 时、强制 PWMA 为高电平

    EPwm4Regs.DBCTL.bit.OUT_MODE = 3;// DB 完全启用
    EPwm4Regs.DBCTL.bit.POLSEL = 2;//高电平有效互补(AHC)
    EPwm4Regs.DBFED.bit.DBFED = RES_PERIOD_MIN*0.05;//设置谐振模块的初始死区时间
    EPwm4Regs.DBRED.bit.DBRED = RES_PERIOD_MIN*0.05;//设置谐振模块的初始死区时间

    EALLOW;
    //数字比较(DC)子模块
    //从跳闸组合输入生成 DCAH 信号
    EPwm4Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 15;//或全部由 DCALTRIPSEL 寄存器选择的触发组合-> DCAH
    EPwm4Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 15;//或全部由 DCALTRIPSEL 寄存器选择的触发组合-> DCBH

    // DCAH/DCAEVT1/2用于单次触发故障
    // DCBH/DCBEVT1/2用于逐周期故障
    //单独选择哪些跳闸信号被传递到块中一起进行 OR 运算
    EPwm4Regs.DCAHTRIPSEL.bit.TRIPINPUT5 = 1;//输入过压跳闸单次触发故障
    EPwm4Regs.DCAHTRIPSEL.bit.TRIPINPUT8 = 1;//集电极过压跳闸单次触发故障
    EPwm4Regs.DCBHTRIPSEL.bit.TRIPINPUT10 = 1;//电流谐振逐周期触发故障

    //事件 A 操作限定符块
    //根据 DCAH 和 DCBH 生成 DCAEVT1/DCBEVT1跳闸事件
    //只有 EVT1可用于 OST、而 EVT2可用于 CBC
    //需要启用这些寄存器的 A 和 B 来触发两个 PWMx 输出
    EPwm4Regs.TZDCSEL.bit.DCAEVT1 = 2;// DCAEVT1:DCAH =高电平、DCAL =无关
    EPwm4Regs.TZDCSEL.bit.DCAEVT2 = 2;// DCAEVT2:DCAH =高电平、DCAL =无关
    EPwm4Regs.TZDCSEL.bit.DCBEVT1 = 2;// DCBEVT1:DCBH =高电平、DCBL =无关
    EPwm4Regs.TZDCSEL.bit.DCBEVT2 = 2;// DCBEVT2:DCBH =高电平、DCBL =无关

    //事件触发块-生成 DCAEVT1.FORCE 和 DCBEVT1.FORCE 信号(单触发源)
    EPwm4Regs.DCACTL.bit.EVT1SRCSEL = 0;//选择 DCAEVT1作为输入信号
    EPwm4Regs.DCACTL.bit.EVT1FRCSYNCSEL = 1;//选择异步
    EPwm4Regs.TZFRC.bit.DCAEVT1 = 0;//启用 DCAEVT1.force 输出信号
    EPwm4Regs.DCBCTL.bit.EVT1SRCSEL = 0;//选择 DCBEVT1作为输入信号
    EPwm4Regs.DCBCTL.bit.EVT1FRCSYNCSEL = 1;//选择异步
    EPwm4Regs.TZFRC.bit.DCBEVT1 = 0;//启用 DCBEVT1.force 输出信号

    //事件触发块-生成的 DCAEVT2.FORCE 和 DCBEVT2.FORCE 信号(逐周期源)
    EPwm4Regs.DCACTL.bit.EVT2SRCSEL = 0;//选择 DCAEVT2作为输入信号
    EPwm4Regs.DCACTL.bit.EVT2FRCSYNCSEL = 1;//选择异步
    EPwm4Regs.TZFRC.bit.DCAEVT2 = 0;//启用 DCAEVT2.force 输出信号
    EPwm4Regs.DCBCTL.bit.EVT2SRCSEL = 0;//选择 DCBEVT2作为输入信号
    EPwm4Regs.DCBCTL.bit.EVT2FRCSYNCSEL = 1;//选择异步
    EPwm4Regs.TZFRC.bit.DCBEVT2 = 0;//启用 DCBEVT2.force 输出信号

    //跳闸区域子模块-跳闸逻辑块
    //仅使用 TZCTL 和 EVT1
    EPwm4Regs.TZCTL2.bit.ETZE = 0;//仅使用 TZCTL 寄存器、禁用 TSCTL2

    EPwm4Regs.TZCTL.bit.DCAEVT1 = 0x10;//跳闸时、强制 EPWM4A 进入低电平状态
    EPwm4Regs.TZCTL.bit.DCBEVT1 = 0x10;//跳闸时、强制 EPWM4B 进入低电平状态
    EPwm4Regs.TZCTL.bit.DCAEVT2 = 0x10;//跳闸时、强制 EPWM4A 进入低电平状态
    EPwm4Regs.TZCTL.bit.DCBEVT2 = 0x10;//跳闸时、强制 EPWM4B 进入低电平状态
    EPwm4Regs.TZCTL.bit.TZA = 0x10;//跳闸时、强制 EPWM4A 进入低电平状态
    EPwm4Regs.TZCTL.bit.TSB = 0x10;//跳闸时、强制 EPWM4B 进入低电平状态

    //跳闸区域子模块-选择 OSHT 和 CBC 源
    EPwm4Regs.TZSEL.bit.DCAEVT1 = 1;//为此 ePWM 模块启用 DCAEVT1作为单触发源
    EPwm4Regs.TZSEL.bit.DCBEVT1 = 1;//为此 ePWM 模块启用 DCBEVT1作为单触发源
    EPwm4Regs.TZSEL.bit.DCAEVT2 = 1;//启用 DCAEVT2作为此 ePWM 模块的 CBC 跳闸源
    EPwm4Regs.TZSEL.bit.DCBEVT2 = 1;//启用 DCBEVT2作为此 ePWM 模块的 CBC 跳闸源

    //EPwm4Regs.TZFRC.bit.OST = 0x01;//强制跳闸禁用 PWM 输出
    //EPwm4Regs.TZFRC.bit.CBC = 0x01;//强制逐周期跳闸以禁用 PWM 输出

    //可以插入在清除一次性故障之前等待延迟时间的代码,或沿这些行插入一些代码
    EDIS;

    //设置 ADC 触发脉冲到 ADC SOCA (ADCAINT1)
    EPwm4Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOCA
    EPwm4Regs.ETSEL.bit.SOCASEL = 2;//在周期匹配时选择 SOCA
    EPwm4Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
    EPwm4Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲

    如果您有任何其他想法/想法、请告诉我。

    最棒的  
    Joel

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

    您好、Marlyn

    只需阅读3年前的博客文章中的以下内容:  

    以下是一些一般准则。 对于特定的功率级/应用、可能还有许多其他选择、这些选择可能会为特定的用例带来好处。

    1. 在相同的 PWM 频率下、上数和下数 PWM 操作的周期计数比上数和下数 PWM 操作的周期计数多2倍。
      1. 这意味着您可以实现更高的分辨率。

    2. 当需要低谐波失真时、通常使用对称(上-下计数) PWM 方法。
    3. C2000器件上的 HRPWM (高分辨率 PWM)操作强加了一些占空比值限制。
      1. 对于向上计数或向下计数模式、不具有高分辨率周期:在一个 PWM 周期中丢失3个系统时钟占空比步长。
      2. 对于向上计数模式、具有高分辨率周期:丢失6个系统时钟占空比。
      3. 对于向上/向下计数模式、具有高分辨率周期:12个系统时钟占空比步长的损耗。
    4. 如果需要 HRPWM 周期控制、只能使用上数或上数/下数计数模式。 不支持递减计数模式。
    5. 当 PWM 之间的相移是受控参数时、将 PWM 配置为非对称模式通常比对称模式更容易处理。 这是因为、当相移大于180度时、需要将同步 PWM 配置为在同步事件上的另一个方向计数、而不是将其配置为相移小于180度。 这必须由软件处理。
    6. 如果需要50%的恒定占空比、则更容易使用向上/向下计数模式并将动作限定器事件配置为 CTR = 0和 PRD。 如果需要高分辨率周期控制、则不建议使用此动作限定器配置。

    这表示支持向上计数模式、但不支持向下计数模式。 从此时起是否发生了变化、可能是软件中的错误尚未修复?

    最棒的

    Joel

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

    您好、Marlyn、

    我认为我可能已经发现了问题、但我还无法通过实验来测试电路板、请告诉我您的看法?

    对于转换器1 -我仅设置高分辨率寄存器的 CMPA 值。 我认为 CMPB 值是根据 CMPA 值自动计算的、即死区模块中的上升沿和下降沿延迟。 这是不正确的吗? 我是否需要以更新 CMPA 的相同方式在每个周期更新 CMPB、或者死区模块是否会自动为我更新 CMPB?

    对于转换器2 -我要同时设置 CMPA 和 CMPB 值、这是一个半桥转换器。 但是、我将两个占空比都设置为(RES_PERIODE/2)-1。 我的红色和 FED 死区设置为非零值、 因此、如果我将两个 CMPA 和 CMPB 值相加、然后再将馈送和红色值相加、我相信我在这段时间内超出了允许的时间、因此这可能会导致信号重叠... 但是、我从 TI 示例中获得了此代码、因此我很困惑为什么除非不使用死区模块、否则会以这样的方式对其进行编程。 仍然将其切近、信号之间仅保留1个周期、可能会导致重叠。  

    我将在星期一有时间进行测试。 但是、考虑到这一点、也许您可以再次查看代码、看看这些看起来是否是问题?

    最棒的

    JH

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

    您好、Joel、

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3865693 #3865693">但是、我的第四个 PWM 模块 EPWM4中仍然存在相同的重叠问题、该模块不使用 HRPWM 模式。 我*想*我已经为 AHC 设置了这个设置,所以不知道为什么我看到重叠。[/引述]

    查看您的 EPWM4死区配置、我看不到任何问题。 您是否更改了 CMPA 的值? 我看到注释显示初始值、但如果您在整个程序中更改此值、则可能会影响输出。 您现在是否还可以尝试禁用 TZ 子模块配置(如果可以的话、调试将变得更简单)。 由于跳闸区域子模块位于死区之后、我只想确保死区子模块在输出使其到达跳闸区域子模块之前正常工作。

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3865750 #3865750"]这表示支持向上计数模式,但不支持向下计数模式。 从此时起是否发生了变化、可能是软件中的错误尚未修复?
    [/报价]

    如果这是三年前的事,我们可能当时并不知道这是一个问题。 请从7个月前开始查看以下内容: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/985066/tms320f28377d-high-resolution-pwm-and-dead-band 

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3866005 #3866005)]对于转换器1 -我仅设置高分辨率寄存器的 CMPA 值。 我认为 CMPB 值是根据 CMPA 值自动计算的、即死区模块中的上升沿和下降沿延迟。 这是不正确的吗? 我是否需要以更新 CMPA 的相同方式在每个周期更新 CMPB、或者死区模块是否会自动为我更新 CMPB?[/QUERT]

    CMPAHR 仅影响 A 通道、并应用于斩波器子模块和跳闸区域子模块之间。  CMPBHR 只影响在同一位置应用 B 通道。  这里重要的是、这些延迟会应用于死区模块之后的通道。  因此、尽管 CMPBHR 实际上只是来自死区的反相 A 信号、但它仍然对 EPWMxB 信号执行操作。  因此 、是的  、每次写入 CMPAHR 时、也应写入 CMPBHR。  

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3866005 #3866005)]因此,如果我将两个 CMPA 和 CMPB 值相加,然后再将馈送值和红色值相加,我相信我在这段时间内超出了允许的时间,因此这可能导致信号重叠... 但是、我从 TI 示例中获得了此代码、因此我很困惑为什么除非不使用死区模块、否则会以这样的方式对其进行编程。 仍然将其切近、信号之间仅保留1个周期、可能会导致重叠。  [/报价]

    是否可以将其绘制出来? 当您说"将两个 CMPA 和 CMPB 值相加、然后再将馈送和红色值相加"时、我有点困惑。 这也是我的问题、即您是否在整个程序中更改 CMPA 和 CMPB 值。 在您选择的模式下、死区的 EPWMxA 输出应用了红色、死区的 EPWMxB 输出应用了。 您参考的是哪一个 TI 示例?

    此致、

    Marlyn

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

    您好、Marlyn、

    是的、每次我运行 CLA 并为转换器计算新的频率/占空比时、我都会更改 CMPA 的值。 但是、我没有为 CMPB 设置任何值、因为我假定在高电平有效比较模式下、这将自动处理、也许这是我遇到问题的原因、我现在正在处理代码。

    关于上升沿和下降沿延迟、我的意思是将 PRD 值设置为特定值、例如500。  
    如果我们将 CMPA 和 CMPB 设置为 PRD/2、即250、占空比为50%、则在周期内不会留下任何"空间"来插入上升沿和下降沿延迟。 如果我们希望在 PWMA 和 PWMB 信号的高电平转换和低电平转换之间馈送"25"和红色信号、这将为 PRD 增加额外的50、 这样、在插入延迟的情况下、PWMA 和 PWMB 打开所需的总时间将为550、因此会导致重叠、因为 PWMA 可能会再次变为高电平、而 PWMB 输出上仍有下降沿。 希望这是有道理的。 如果不是,下次我回答我的意思时,我可以抽出时间。 我不记得我使用的确切示例、但我经常在 powerSUITE 示例中看到、占空比设置为周期的一半、而不考虑馈电和红色的长度。 我再次假设死区模块中必须注意这一点、但我肯定是错的。 以下是我的建议:

    从控制器 CLA 程序中设置 CMPA、假设这是200。  
    可用总周期= 500。  
    将 CMPB 设置为(500)-(CMPA)-(FED)-(红色)

    这将仍然是高电平有效的互补输出、但会使互补输出不会与另一个重叠、因为它考虑了死区模块的延迟。 不过、我认为我可能过于复杂、因为我在示例代码中从未真正看到过类似的东西。

    此致、
    Joel

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

    下面是 powerSUITE、TIDM1001、两相 LLC 的示例

    void UpdateRegs (空)

    ScaledPrd =(ScaledPrd < min_period)? Min_Period:ScaledPrd;//钳位最大频率
    // ScaledPrd =(ScaledPrd > MAX_PERIOD)? Max_Period:ScaledPrd;//Clamp Min freq -已经由'caledPrd = var1.Out * Max_Period'完成

    Duty1 = Duty + Duty_adj - Duty_shed_adj1;// Duty_adj =_iQ24 (0.05)
    Duty2 = Duty - Duty_adj - Duty_shed_adj2;

    Duty1 =(Duty1 < min_Duty)? min_Duty:Duty1;//钳位最大频率
    Duty1 =(Duty1 > MAX_DUTY)? MAX_DUTY:Duty1;//钳位最小频率

    Duty2 =(Duty2 < min_Duty)? min_Duty:Duty2;//钳位最大频率
    Duty2 =(Duty2 > MAX_DUTY)? MAX_DUTY:Duty2;//钳位最小频率

    CMPval1 = Duty1*(float) ScaledPrd;

    CMPval2 = Duty2*(float) ScaledPrd;

    (* ePWM[PWM_HS_PH1]).TBPRD = ScaledPrd;
    (* ePWM[PWM_SRA_PH1]).TBPRD = ScaledPrd;
    (* ePWM[PWM_HS_PH2]).TBPRD = ScaledPrd;
    (* ePWM[PWM_SRA_PH2]).TBPRD = ScaledPrd;

    (* ePWM[PWM_HS_PH1]).DBRED=红色;
    (* ePWM[PWM_HS_PH1]).DBFED= FED;
    (* ePWM[PWM_HS_PH2]).DBRED=红色;
    (* ePWM[PWM_HS_PH2]).DBFED= FED;

    (* ePWM[PWM_HS_PH1]).CMPB.bit.CMPB = CMPval1;
    (* ePWM[PWM_HS_PH1]).cmpA.bit.cmpA = ScaledPrd - CMPval1;…

    这里不关心总周期中的红色或 FED、看起来 CMPA 和 CMPB 值是在不关心 FED /红色值的情况下设置的。 那么、在本示例中的一个周期中、我希望看到重叠、不是?  

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

    您好、Joel、

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3870444 #3870444]]\n 如果我们将 CMPA 和 CMPB 设置为 PRD/2、即50%占空比为250、则在该期间内不会留下任何"空格"来插入上升沿和下降沿延迟。 如果我们希望在 PWMA 和 PWMB 信号的高电平转换和低电平转换之间馈送"25"和红色信号、这将为 PRD 增加额外的50、 这样、在插入延迟的情况下、PWMA 和 PWMB 打开所需的总时间将为550、因此会导致重叠、因为 PWMA 可能会再次变为高电平、而 PWMB 输出上仍有下降沿。 希望这是有道理的。 如果不是、我可以在下次回复我的意思时抽出时间。

    您已经配置了死区模块、如下面高亮显示的路径所示。 AQ 子模块的 ePWM 输出 A 连接到红色和馈送路径。 但是请注意、只有输出 A 为红色、只有输出 B 已馈送。 在该图像的右侧、以图形方式显示了这一点、EPWMxA 应用了上升沿、而 EPWMxB 应用了下降沿(即使应用了相同的红色/馈入值、也不会重叠)。  

    即使在零或周期事件之后、只要存在边沿、上升沿和下降沿延迟也将生效。 在电流递增计数方案中、您已将输出配置为在零事件时"高"、在 CMPA 匹配时"低"。 因此、死区子模块之后、EPWMxA 输出将在 CMPA 匹配时变为低电平、并在 TBCTR = 25 (0 +红色= 25)时变为高电平。 EPWMxB 将应用下降沿延迟、因此它不会在 CMPA 匹配上变为低电平、而是在(CMPA + FED = 250 + 25 = 275)时变为低电平、然后在 TBCTR = 0时变为高电平。 在应用延迟后、EPWMxB 将反相。  

    同样的概念也适用于向上/向下计数模式。 请告诉我上述内容是否不清楚、我可以帮助进一步解释。

    是否可以删除跳闸区域配置(仅用于调试)并查看 ePWM 4输出的外观?  

    此致、

    Marlyn

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

    大家好、看起来更好、我现在了解死区模块。 下面是新的屏幕截图:第一个是以200kHz 运行的 EPWM4、第二个是以1MHz 运行的 EPWM1。 我更新了代码、以更新 EPWM1的 CMPA 和 CMPB  

    //向上/向下计数模式下将周期除以2
    EPwm1Regs.CMPA.all =(uint32_t)((反激式命令*(float32_t) fly_period_cla/2)*(float32_t)((uint32_t) 1 << 16)+ 0.5f);
    EPwm1Regs.CMPB.bit.CMPB =(FLY_PERIOD_CLA/2 - EPwm1Regs.CMPA.bit.CMPA);

    //更新反激模块的死区时间
    EPwm1Regs.DBFED.bit.DBFED =(FLY_PERIOD_CLA * 0.01);
    EPwm1Regs.DBRED.bit.DBRED =(FLY_PERIOD_CLA * 0.01);

    事实上、我也不是在更新 CMPB、而是只更新 CMPA。 对于 EPWM4、我没有做太多更改、我注释了两个模块的 tripzone。  

    EPwm4Regs.CMPA.bit.CMPA =(RES_PERIODE/4);//最大50%占空比向上/向下计数模式
    EPwm4Regs.CMPB.bit.CMPB =(EPwm4Regs.TBPRD - EPwm4Regs.CMPA.bit.CMPA);   //从 CMPA 计算 CMPB 并最大 TBPRD

    看起来更好。 显然、插入了一个死区、我相信黄色输出。 但蓝色输出上没有死区。 PWM1和 PWM4的情况看起来完全相同、似乎只有一个死区插入信号。

    还有其他建议吗?

    此致、再次感谢您、
    Joel

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

    您好、Joel、

    我看一下、只是想确认 EPWMxA 是示波器捕获的黄色输出、蓝色信号是 EPWMxB?

    此致、

    Marlyn

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

    您好!  

    抱歉、应该已经提到、是:PWMA 为黄色、而 PWM4为蓝色。 我刚才意识到、这是 PWM1的另一种方法、其中蓝色是 PWMA、黄色是 PWMB。 抱歉、直到我再次测试后才意识到这一点!

    谢谢、
    Joel

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

    您好、Joel、

    不用担心、感谢您提供进一步的说明。 我想测试您拥有的值、但我不知道  fly_period_CLA 的值是什么、因此下面的代码不会告诉我您为 DBRED 和 DBFED 设置了什么值。 您希望延迟的时间是多久? 如果 FLASH_PERIOD_CLA 不断变化、我建议您将 DBFED 和 DBRED 设置为一个固定值、以便查看您是否可以在输出端看到正确的应用值。  

    EPwm1Regs.DBFED.bit.DBFED =(FLY_PERIOD_CLA * 0.01);
    EPwm1Regs.DBRED.bit.DBRED =(FLY_PERIOD_CLA * 0.01);

    此外 、由于您将计数模式从向上计数更新为向上计数和向下计数模式、您是否修改了动作限定 符设置、我能否看到更新的设置?  

    此致、

    Marlyn

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

    您好、Marlyn、

    感谢您的回复。 FLASH_PERIOD_CLA 为100、因此可提供1MHz 频率。 100MHz PWM 时钟的频率。 我在 CLA 中定义了它、因为这是我更新寄存器的位置。 DBRED 和 DBFED 值在反激中是恒定的、但在谐振转换器中是可变频率更新的。 谐振转换器为 PWM4A/B、反激式转换器为 PWM1A/B 以下是操作限定符:

    EPwm1Regs.CMPCTL.bit.LOADAMODE = 1;//对于非对称 PWM 生成和向上向下计数模式、在周期匹配时加载 CMPA/CMPB
    EPwm1Regs.CMPCTL.bit.LOADBMODE = 1;//但 HRPWM 配置说明使用 LOADA/BMODE 2...
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;//通过 CPU 进行的所有写入操作都会访问 A 和 B 输出的影子寄存器

    //在 PWMA 的动作限定符模块中设置动作
    EPwm1Regs.AQCTLA.bit.CAU = 0x1;//递增计数时强制 PWMA 为低电平
    EPwm1Regs.AQCTLA.bit.ZRO = 0x2;//当 TBCTR = ZRO 时、强制 PWMA 为高电平

    //在 PWMB 的操作限定符模块中设置操作
    EPwm1Regs.AQCTLB.bit.CAU = 0x2;//在递增计数时、在 CMPA 匹配上强制 PWMB 为高电平
    EPwm1Regs.AQCTLB.bit.ZRO = 0x1;//在 TBCTR = ZRO 匹配时强制 PWMB 为低电平

    EPwm1Regs.DBCTL.bit.OUT_MODE = 3;//为下降沿和上升沿完全启用死区
    EPwm1Regs.DBCTL.bit.POLSEL = 2;//高电平有效互补(AHC)模式
    //EPwm1Regs.DBFEDHR.bit.DBFEDHR = FLY_DEADTIME;//设置下降沿的死区时间
    //EPwm1Regs.DBREDHR.bit.DBREDHR = FLY_DEADTIME;//设置上升沿的死区时间// JM Holland 已将*更改为 HR 位
    EPwm1Regs.DBFED.bit.DBFED = FLY_DETTIME;
    EPwm1Regs.DBRED.bit.DBRED = FLY_DEADTIME;

    和:

    // CMPA/B 控制
    EPwm4Regs.CMPCTL.bit.LOADAMODE = 0;
    EPwm4Regs.CMPCTL.bit.LOADBMODE = 0;
    EPwm4Regs.CMPCTL.bit.SHDWAMODE = 0;
    EPwm4Regs.CMPCTL.bit.SHDWBMODE = 0;

    //如果更新上升沿和下降沿延迟,可变频率
    EPwm4Regs.DBCTL.bit.SHDWDBREDMODE = 1;//为红色启用影子加载
    EPwm4Regs.DBCTL.bit.LOADREDMODE = 0;// CTR 上的负载= 0
    EPwm4Regs.DBCTL.bit.SHDWDBFEDMODE = 1;//为馈送启用影子负载
    EPwm4Regs.DBCTL.bit.LOADFEDMODE = 0;// CTR 上的负载= 0

    //设置 TBCLK = EPWMCLK = 100MHz
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = 0;//时钟与 SYSCLKOUT 之比
    EPwm4Regs.TBCTL.bit.CLKDIV = 0;
    EPwm4Regs.TBCTL.bit.SYNCOSEL = 0x0;//禁用同步输出

    //设置初始调制
    EPwm4Regs.CMPA.bit.CMPA = EPwm4Regs.TBPRD-1;//设置初始比较 A 值、50%占空比
    EPwm4Regs.CMPB.BIT.CMPB = EPwm4Regs.TBPRD-1;//设置初始比较 B 值、50%占空比

    //在操作限定符块(AQ)中设置操作
    EPwm4Regs.AQCTLA.bit.CAD = 0x2;//当 TBCTR = CMPA 开启递减计数时、强制 PWMA 为高电平
    EPwm4Regs.AQCTLA.bit.CAU = 0x1;//当 TBCTR = CMPA 打开递增计数时、强制 PWMA 为低电平
    EPwm4Regs.AQCTLB.bit.CBD = 0x1;//当 TBCTR = CMPB 递减计数时、强制 PWMB 为低电平
    EPwm4Regs.AQCTLB.bit.CBU = 0x2;//当 TBCTR = CMPB 递增计数时、强制 PWMB 为高电平

    // EPwm4Regs.DBCTL.bit.OUT_MODE = 0x00;//完全禁用死区模块
    EPwm4Regs.DBCTL.bit.OUT_MODE = 0x02;//对死区模块完全启用
    EPwm4Regs.DBCTL.bit.POLSEL = 2;//高电平有效互补(AHC)
    EPwm4Regs.DBFED.bit.DBFED = RES_PERIOD_MIN*0.05;//设置谐振模块的初始死区时间
    EPwm4Regs.DBRED.bit.DBRED = RES_PERIOD_MIN*0.05;//设置谐振模块的初始死区时间

    希望这对您有所帮助。

    此致、

    Joel

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

    您好、Joel、

    我想首先重点介绍 EPWMx4、并与您一起工作。 EPWM4以200kHz 的频率运行、根据您的时钟分频器、我会说 TBPRD = 250、您能否确认这是否正确?

    然后、我看到您具有以下代码:

    EPwm4Regs.CMPA.bit.CMPA =(RES_PERIODE/4);//最大50%占空比向上/向下计数模式
    EPwm4Regs.CMPB.bit.CMPB =(EPwm4Regs.TBPRD - EPwm4Regs.CMPA.bit.CMPA);   //从 CMPA 计算 CMPB 并最大 TBPRD

    那么、在本例中、我假设 RES_PERIOD 为250? 除以4可以使 CMPA 62.5 (62)。 然后、CMPB 为187.5 (187)。

    在您发布的新代码中、初始 CMPA/CMPB 值为249 (与 注释状态一样、这不会产生50%的占空比)

    //设置初始调制
    EPwm4Regs.CMPA.bit.CMPA = EPwm4Regs.TBPRD-1;//设置初始比较 A 值、50%占空比
    EPwm4Regs.CMPB.BIT.CMPB = EPwm4Regs.TBPRD-1;//设置初始比较 B 值、50%占空比

    然后、根据您的最新回复、红色和输入延迟如下所示。 RES_PERIOD_MIN 的值是多少?  

    EPwm4Regs.DBFED.bit.DBFED = RES_PERIOD_MIN*0.05;//设置谐振模块的初始死区时间
    EPwm4Regs.DBRED.bit.DBRED = RES_PERIOD_MIN*0.05;//设置谐振模块的初始死区时间

    了解您拥有的变量以及它们何时链接/范围受限、这将非常有帮助。 如果没有这种知识、很难知道您是否遇到临界情况。  

    您提到了 EPWM4是一种变频应用、可改变红色/馈送值。 如果有用、我建议将值保持为固定值(用于调试)、并查看您是否获得正确的输出(初始化后)。 如果输出符合您的预期、则我们知道问题来自您更新周期或红色/馈送值时代码中的稍后部分。

    此致、

    Marlyn

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

    您好、Marlyn、

    感谢您的评论。 我更改了 CMPA/CMPB 位、使 CMPA 为(EPwm4Regs.TBPRD/2)-1、CMPB 为 TBPRD - CMPA、这样我获得50%的占空比。 我仍然会遇到相同的问题。  

    由于我的控制器没有任何 ADC 输入、尽管这是一个变频应用、但输出当前固定在最小输出频率、因此馈送和红色也固定在该频率的一部分。 RES_PERIOD_MIN 是最高频率、400kHz 或250。 RES_PERIOD_MAX 为500或200kHz。 最终的计划是、这将是具有可变频率的25-50%可变占空比、这就是我编码为具有这种特定的向上-向下对称计数方案的原因。

    出于某种原因、控制器似乎在一个输出上插入了两个延迟? PWMB 的下降边沿和 PWMA 的上升边沿之间有一个很大的死区时间、但是在下一个转换切换时没有。

    初始调制设置为 相同:

    EPwm4Regs.CMPA.bit.CMPA =(EPwm4Regs.TBPRD/2)-1;50%占空比
    EPwm4Regs.CMPB.bit.CMPB = EPwm4Regs.TBPRD - EPwm4Regs.CMPA;50%占空比

     

    此致、

    Joel

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

    在死区配置中、问题确实存在-我刚刚完全禁用了它、并在代码中手动更改了 CMPA/CMPB 限制、波形看起来更好:

    我仍然想调试死区模块、因为我不必担心输出中的任何重叠、而是要在代码中得到保证。

    最棒的
    Joel

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

    您好、Joel、

    之前在代码中、OUT_MODE 位为3、这是启用 RED 和 FED 的值、但在最新代码中、您提供的值更改为2、这意味着仅应用 RED。 我想这就是为什么您在输出中只看到一个延迟的原因。 我对 C2000Ware 中的死区示例进行了一些修改。 通过提供的配置、输出具有红色和馈送延迟(数量正确)、输出为400kHz。

    请 比较您的死区配置并将值与以下值进行比较。 请注意、您不需要为 EPWM4提供 CMPB 值、因为您 不使用高分辨率 PWM。 死区模块的输入仅为 EPWMxA、因为您要配置高电平有效互补。  

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3875402 #3875402]RES_PERIOD_MIN 为最高频率400kHz 或250。 RES_PERIOD_MAX 为500或200kHz。 [/报价]

    计算得出 TBPRD 的值取决于您的计数模式。 由于您使用向上和向下计数模式、400kHz 输出实际上是125而不是250的 TBPRD 值。 您还需要为 RES_PERIOD_MAX 重新计算 TBPRD。 下面是计算示例:

    Tpwm = 1/Fpwm =(1/400kHz)= 2.5us

    TBCLK = EPWMCLK/(HSPCLKDIV * CLKDIV)= 100MHz/(1*1)= 100MHz

    TTBCLK = 1/TBCLK = 1/100MHz = 10nsec

    Tpwm = 2*TBPRD*TTBCLK -> TBPRD = Tpwm /(2*TTBCLK)=(2.5usec)/(2 * 10nsec)= 125

    *注意:我在下面的中使用了 EPWM1、但这有助于 EPWM4的设置

    //
    // Included Files
    //
    #include "F28x_Project.h"
    
    //
    // Defines
    //
    #define RES_PERIOD_MIN 125 //400kHz
    
    //
    // Globals
    //
    Uint32 EPwm1TimerIntCount;
    
    //
    // Function Prototypes
    //
    void InitEPwm1Example(void);
    __interrupt void epwm1_isr(void);
    
    //
    // Main
    //
    void main(void)
    {
    //
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the F2837xD_SysCtrl.c file.
    //
        InitSysCtrl();
    
    //
    // Step 2. Initialize GPIO:
    // This example function is found in the F2837xD_Gpio.c file and
    // illustrates how to set the GPIO to its default state.
    //
    //    InitGpio();
    
    //
    // enable PWM1, PWM2 and PWM3
    //
        CpuSysRegs.PCLKCR2.bit.EPWM1=1;
    
    //
    // For this case just init GPIO pins for ePWM1, ePWM2, ePWM3
    // These functions are in the F2837xD_EPwm.c file
    //
        InitEPwm1Gpio();
    
    //
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
    //
        DINT;
    
    //
    // Initialize the PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the F2837xD_PieCtrl.c file.
    //
        InitPieCtrl();
    
    //
    // Disable CPU interrupts and clear all CPU interrupt flags:
    //
        IER = 0x0000;
        IFR = 0x0000;
    
    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in F2837xD_DefaultIsr.c.
    // This function is found in F2837xD_PieVect.c.
    //
        InitPieVectTable();
    
    //
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
    //
        EALLOW; // This is needed to write to EALLOW protected registers
        PieVectTable.EPWM1_INT = &epwm1_isr;
        EDIS;   // This is needed to disable write to EALLOW protected registers
    
    //
    // Step 4. Initialize the Device Peripherals:
    //
        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
        EDIS;
    
        InitEPwm1Example();
    
        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =1;
        EDIS;
    
    //
    // Step 5. User specific code, enable interrupts:
    // Initialize counters:
    //
        EPwm1TimerIntCount = 0;
    
    //
    // Enable CPU INT3 which is connected to EPWM1-3 INT:
    //
        IER |= M_INT3;
    
    //
    // Enable EPWM INTn in the PIE: Group 3 interrupt 1-3
    //
        PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    
    //
    // Enable global Interrupts and higher priority real-time debug events:
    //
        EINT;  // Enable Global interrupt INTM
        ERTM;  // Enable Global realtime interrupt DBGM
    
    //
    // Step 6. IDLE loop. Just sit and loop forever (optional):
    //
        for(;;)
        {
            asm ("          NOP");
        }
    }
    
    //
    // epwm1_isr - EPWM1 ISR
    //
    __interrupt void epwm1_isr(void)
    {
        EPwm1TimerIntCount++;
    
        //
        // Clear INT flag for this timer
        //
        EPwm1Regs.ETCLR.bit.INT = 1;
    
        //
        // Acknowledge this interrupt to receive more interrupts from group 3
        //
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
    }
    
    //
    // InitEPwm1Example - Initialize EPWM1 configuration
    //
    void InitEPwm1Example()
    {
        EPwm1Regs.TBPRD = RES_PERIOD_MIN;             // Set timer period
        EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;           // Phase is 0
        EPwm1Regs.TBCTR = 0x0000;                     // Clear counter
    
        //
        // Setup TBCLK
        //
        EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down
        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
        EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
    
        EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
        EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
        EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    
        //
        // Setup compare
        //
        EPwm1Regs.CMPA.bit.CMPA = RES_PERIOD_MIN/2; // 50% Duty
    
        //
        // Set actions
        //
        EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
        EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
    
        //
        // Active High Complementary - Setup Deadband
        //
    
          EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;          // 0 (default)
    
          EPwm1Regs.DBCTL.bit.DEDB_MODE = 0;              // 0 (default)
    
          EPwm1Regs.DBRED.bit.DBRED = RES_PERIOD_MIN*0.05;
          EPwm1Regs.DBFED.bit.DBFED = RES_PERIOD_MIN*0.05;
    
          EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;       // 2
    
          EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;  // 3
    
          EPwm1Regs.DBCTL.bit.OUTSWAP = 0;                // 0 (default)
    
        //
        // Interrupt where we will change the Deadband
        //
        EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;    // Select INT on Zero event
        EPwm1Regs.ETSEL.bit.INTEN = 1;               // Enable INT
        EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;          // Generate INT on 1st event
    }
    
    //
    // End of file
    //

    此致、

    Marlyn

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

    "请注意、您不需要为 EPWM4提供 CMPB 值、因为您 不使用高分辨率 PWM。 死区模块的输入仅为 EPWMxA、因为您正在配置高电平有效互补。"

    您好、Marlyn、 非常感谢您提出上述代码理念。 我将实施它并返回给您。 同时、
    您上面的评论-那么、在我确实使用 HRPWM 模式的情况下、我的 EPWM1代码应该如何更改? 我需要为这些值同时提供 CMPA 和 CMPB 值、这与我不使用 HRPWM 的情况不同吗? 为什么会出现这种情况? 我希望高电平有效互补和死区模块在 HRPWM 模式下仍然可用?  

    因此、在 HRPWM 模式下、最好提供 CMPA 和 CMPB 以及旁路死区模块、并在代码中确保它们永远不会重叠?

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

    您好、Joel、

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3875635 #3875635]EEPWM1的代码如何更改、而我确实在使用 HRPWM 模式? 我需要为这些值同时提供 CMPA 和 CMPB 值、这与我不使用 HRPWM 的情况不同吗? 为什么会出现这种情况?[/引述]

    对于 EPWM1、是的、您需要写入 CMPBHR 和 CMPAHR。 这可以返回到之前的回复:"CMPAHR 仅影响 A 通道、并应用于斩波器子模块和跳闸区域子模块之间。  CMPBHR 只影响在同一位置应用 B 通道。  这里重要的是、这些延迟会应用于  死区模块之后的通道。  因此、尽管 CMPBHR 实际上只是来自死区的反相 A 信号、但它仍然对 EPWMxB 信号执行操作。  因此 、是的、每次您写入 CMPAHR 时、您还应写入 CMPBHR。" 死区之后将应用高分辨率部分、因此您仍需要同时为 HRPWM 提供这两种选项。  

    另请注意、对于 HRPWM、由于您正在使用死区、因此还必须设置半时钟。 上升沿和下降沿延迟值的公式将发生变化。 这是 TRM 中的注释:"高分辨率死区红色和 FED 需要半周期计时模式(DBCTL[HALFCYCLE]= 1)。"

    [引用 userid="420268" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1044888/c2000ware-dead-band-module-not-working-properly-gate-drive-signals-are-overlapping/3875635 #3875635]\n 我希望高电平有效互补模块和死区模块在 HRPWM 模式下仍然可用?  [/报价]

    是的、即使在 HRPWM 模式下、您仍然可以使用死区模块的高电平有效互补模式。 如果您使用向上/向下计数模式、我不会旁路死区模块。  

    此致、

    Marlyn

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

    您好、Marlyn、

    我是否理解、CMPA 和 CMPB 的写入方式正常、死区设置正常-因此我们写入 CMPA、CMPB、红色、FED。 为了使用死区、我们还必须从该模块写入 CMPAHR、CMPBHR、DBREDHR、DBFEDHR、该模块将高分辨率应用于预先存在的 CMPA 和 CMPB 值?

    此致、

    Joel

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

    您好、Joel、

    是的、您的理解是正确的。 HRPWM 在多个子模块中进行了增强、

    此致、

    Marlyn