大家好、是否可以通过任何方法在 PWM 死区时间期间打开/关闭 GPIO 信号? 我使用了 TI DSP 28335的 EPWM 事件触发器、但它似乎运行不正常。 你们对此有什么经验吗? 非常感谢。

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.
大家好、是否可以通过任何方法在 PWM 死区时间期间打开/关闭 GPIO 信号? 我使用了 TI DSP 28335的 EPWM 事件触发器、但它似乎运行不正常。 你们对此有什么经验吗? 非常感谢。

当然、假设我有两个 PWM 模块:4A、B 和5A、B、以及一个 GPIO 信号、以确定两者协同工作还是一个工作。 例如、如果 GPIO 信号为低电平、则 PWM 模块4和5都工作、如果 GPIO 信号为高电平、则只有 PWM 模块4工作。 GPIO 信号基于读取的 ADC 值。
这是 PWM4的设置、
void PWM4_SET (void){
// Time_Base (TB)
EPwm4Regs.TBSTS.all = 0;
EPwm4Regs.TBPHS.half.TBPHS = 0;
EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm4Regs.TBCTR = 0;
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm4Regs.TBCTL.bit.PRDLD = TB_immediate;
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
//EPwm1Regs.TBCTL.bit.SWFSYNC = 0;
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//COMP 测试点
EPwm4Regs.TBPRD = TBPRD;
EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_LD_DISABLE;
EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_LD_DISABLE;
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_immediate;
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;
EPwm4Regs.CMPA.half.CMPA = TBPRD/2;
EPwm4Regs.CMPB = TBPRD;
EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm4Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm4Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE;
EPwm4Regs.DBCTL.bit.POLSEL = DBA_RED_DBB_FED;
EPwm4Regs.DBRED = TBPRD/2;
EPwm4Regs.DBFED = TBPRD/2;
//跳闸区域(TZ)
EPwm4Regs.TZSEL.ALL = 1;
EPwm4Regs.TZCTL.ALL = 0;
EPwm4Regs.TZEINT.ALL = 0;
EPwm4Regs.TZFLG.all = 0;
EPwm4Regs.TZFRC.all = 0;
EPwm4Regs.ETSEL.ALL = 0;
EPwm4Regs.ETFLG.all = 0;
EPwm4Regs.ETCLR.all = 0;
EPwm4Regs.ETFRC.all = 0;
//PWM4的 ET
EPwm4Regs.ETSEL.bit.inten = 1;
EPwm4Regs.ETPS.bit.INTPRD = 1;
EPwm4Regs.ETSEL.bit.INTSEL = 1;
EPwm4Regs.PCCTL.ALL = 0;
}
这是用于打开或关闭 GPIO 信号的代码、我使用 PWM4的事件触发器来关闭 GPIO 信号。
void Mode_SW (void){
if (IADC > 1.66 &&操作=3){
EPwm4Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_Group3;
}
否则为(IADC < 1.59 &&操作=1){
运行= 3;
}
否则{
运行=运行;
}
}
这是 ET 中断子例程:
中断失效 SW_ET_ISR (void){
if (EPwm4Regs.ETFLG.bit.INT == 1){
运行= 1;
OperationGate();
}
否则{
EPwm4Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_Group3;
}
}
这是我从输入滤波器获得的

尊敬的 Allison:
我的工程是使用频率控制方法来控制系统、因此我使用了 TBPRD 更新开关频率。 我有两种工作模式("1"和"3")需要根据 ADC 值"IPCA"进行切换。
模式1 (IADC > 1.66):GPIO 26为低电平、所有 PWM 4A、4B、5A、5B 均工作。
模式3 (IADC < 1.59):GPIO 26为高电平、PWM 4A、4B 工作、但 PWM 5A、5B 关闭。 (通过设置 DBRED 和 DBFED = TBPRD/2 +1)
我想在 PWM 4A、4B 的死区时间周期切换模式、因此通过设置 CTRU=CMPB 使用了 PWM4的事件触发中断。
(我的 PWM 设置用于时基计数模式)
我的问题是 GPIO26信号在死区时间期间或 PWM 信号的特定边沿上未变为低电平。 随附的图片是 从模式3 到模式1的转换。
此致 
尊敬的 Allison:
GPIO 输出未遵循我尝试设置的内容。 我怀疑我在 ET ISR 子例程中放了如此多的内容。 GPIO 切换需要与死区时间完全同步、因为它用于控制需要在 PWM4死区时间内关断的电源开关。
正如您提到的、"使用 ISR 也会在事件触发器和 GPIO 切换之间引入一些预期的延迟"。 是否有办法解决这个问题?
顺便说一下、我使用 EPwmxRegs.TBPRD = TBPRD (x=4、5)来控制 EPwm4、EPwm5的频率。 如果我想在 GPIO 为高电平时关闭 EPwm5、在 GPIO 为低电平时将其重新打开。 要做到这一点、最好的方法是什么? 目前、我将 DBRED 和 DBFED 设置为大于 EPwm5的占空比的值、以关闭 EPwm5。
此致、
尊敬的 Trung:
消除延迟的最佳方法是避免完全利用 ISR、否则这里始终会引入一些固有延迟。
如果要在 GPIO 切换为低电平时同步 EPWM5关闭、可以使用第三个 ePWM 模块作为 GPIO。 第三个 ePWM 可以 有一个动作限定符、它配置在您 定义"模式1"和"模式3"的同一位置。 对于模式3、您可以 将 动作限定符配置为发生在 CTR = 0时、以将 EPWM 设置 为高电平、然后对于模式1 、您可以将动作限定符配置为发生在与其他 EPWM 相同的 CMPA 上、以将其设置为低电平。 这样、您的 EPWM5和 GPIO/ePWM 模式更改将同步。 如果您有进一步的疑问、请在此处告诉我。
此致、
艾里森