大家好、我正在尝试使用 TI 的控制卡 F28379D 生成~100kHz 频率范围内的 PWM 信号。 我想在 PWM 通道1A、1B、2A、2B、5A、5B、6A 和6B 上生成这些信号。 我使用的是 ePWM_Deadband 示例代码、对此进行了少量修改。
我希望 每个 PWM 通道的 A 和 B 信号(A 和 B 应该是互补信号)之间具有较短的死区时间。 我观察到 PWM 信号5A、5B、6A 和6B 在两者之间经过编程的死区时间正常。 然而、信号1B 和2B 是不一致的、它们的占空比在每个时间周期内都不同、并且信号1A 和1B 之间以及信号2A 和2B 之间没有死区时间。
.我 的代码中 PWM 通道1的中断子例程和 ePWM_FUNCTION 如下所示:(其他通道使用类似的代码)
_interrupt void epwm1_ISR (void)
{
if (EPwm1_DB_DIRECTION = DB_UP)
{
if (EPwm1Regs.DBFED.all < EPWM1_MAX_DB)
{
EPwm1Regs.DBFED.All++;
EPwm1Regs.DBRED.All++;
}
其他
{
EPwm1_DB_DIRECTION = DB_DOWN;
EPwm1Regs.DBFED.All--;
EPwm1Regs.DBRED.All--;
}
}
其他
{
if (EPwm1Regs.DBFED.all = EPWM1_MIN_DB)
{
EPwm1_DB_DIRECTION = DB_UP;
EPwm1Regs.DBFED.All++;
EPwm1Regs.DBRED.All++;
}
其他
{
EPwm1Regs.DBFED.All--;
EPwm1Regs.DBRED.All--;
}
}
EPwm1TimerIntCount++;
//清除此计时器的 INT 标志
EPwm1Regs.ETCLR.bit.INT = 1;
//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
空 InitEPwm1Examples()
{
EPwm1Regs.TBPRD = 100;//设置定时器周期
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
//设置 TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;//速度慢、我们可以观察到
//范围
//设置比较
EPwm1Regs.CMPA.bit.CMPA = 50;
//EPwm1Regs.CMPB.bit.CMPB = 60;
//设置操作
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//将 PWM3A 设置为零
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//将 PWM3A 设置为零
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;
//高电平有效互补 PWM -设置死区
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm1Regs.DBRED.ALL = 5;
EPwm1Regs.DBFED.ALL = 5;
EPwm1_DB_DIRECTION = DB_UP;
//中断,我们将在其中更改死区
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_3rd;//在第三个事件发生时生成 INT
}
连接了从 PWM 通道1生成的 PWM 波形(1A -浅蓝色、1B -深蓝色)。 可以看出、1B 的占空比在连续时间周期内变化(编程为50%)。 此外、1A 和1B 之间没有死区时间。

此处附上了从 PWM 通道5生成的 PWM 波形(5A -浅蓝色、5B -深蓝色)。 占空 比是一致的、且死区时间介于5A 和5B 之间(如预期的那样)。

我尝试注释掉 InitEPwm1Examples()函数的以下部分:
//高电平有效互补 PWM -设置死区
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm1Regs.DBRED.ALL = 5;
EPwm1Regs.DBFED.ALL = 5;
EPwm1_DB_DIRECTION = DB_UP;
//中断,我们将在其中更改死区
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_3rd;//在第三个事件发生时生成 INT
并观察到信号1B 和2B 现在可以正常工作(它们在所有时间段内都具有一致的占空比)。 但是、将本节注释掉意味着信号 A 和 B 之间不再有死区时间
如果有人可以为我研究这个问题并建议我解决这个问题的方法、我会非常感激?