Other Parts Discussed in Thread: C2000WARE, POWERSUITE
主题中讨论的其他器件: 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




