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.

[参考译文] TMS320F280041:50Hz 频率的 PWM 死区

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1488954/tms320f280041-pwm-deadband-of-50hz-frequency

器件型号:TMS320F280041

工具/软件:

尊敬的专家:

我的客户 使用单相逆变器、一个电桥为50Hz、另一个为20kHz。 他们希望在检测到 AC (50Hz)零点时实现电平反向添加死区。 其当前的方法是在交流电达到零点时关闭上部和下部器件一个 PWM 周期(50us)、然后进行切换。 但是、交流波形会在零点引起抖动、客户想问是否有解决方案、在上下器件之间切换时是否可以自动添加死区? 由于频率为50Hz、TBPRD 寄存器将会溢出、因此它们可以使用 AQCSFRC 来实现 PWM。 我将代码和波形附加在此处。

#define EPWM_FREQ_VALUE (1000000000)// 100MHz
#define INV_EPWMP_FREQ (20e3)//单位:kHz
#define INV_EPWM_PRID_VALUE (uint16_t)(EPWM_FREQ_VALUE /(INV_EPWMP_FREQ * 2))

//初始化 EPWM1模块函数配置
void Init_EPWM1_handle (void)

EPwm1Regs.TBPRD = INV_EPWM_PRID_VALUE;// PWM 频率
EPwm1Regs.CMPA.bit.CMPA = INV_EPWM_PRID_VALUE - 20;//最初设置占空比200ns
EPwm1Regs.CMPA.bit.CMPAHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展
EPwm1Regs.CMPB.bit.CMPB = 20;//初始值为200ns
EPwm1Regs.CMPB.bit.CMPBHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展

EPwm1Regs.TBCTR = 0;
EPwm1Regs.TBPHS.bit.TBPHS = 0;

EPwm1Regs.TBCTL.ALL = 0;
EPwm1Regs.TBCTL.BIT.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.BIT.CTRMODE = TB_COUNT_UPdown;
EPwm1Regs.TBCTL.BIT.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.BIT.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.BIT.FREE_SOFT = mPWM_DEBUG_STOP;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.BIT.SWFSYNC = 1;
EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm1Regs.TBCTL.BIT.PHSEN = TB_DISABLE;

EPwm1Regs.CMPCTL.all = 0;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

EPwm1Regs.AQCTLA.bit.cad = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQCLEAR;
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBD = AQCLEAR;
EPwm1Regs.AQCSFRC.bit.CSFA = 1;
EPwm1Regs.AQCSFRC.bit.CSFB = 1;

EPwm1Regs.DBCTL.bit.IN_MODE = 1;
EPwm1Regs.DBCTL.BIT.DEDB_MODE = 0;
EPwm1Regs.DBCTL.BIT.POLSEL = 0;
EPwm1Regs.DBCTL.BIT.OUT_MODE =0;
EPwm1Regs.DBRED.bit.DBRED = 0;
EPwm1Regs.DBFED.bit.DBFED = 0;
EPwm1Regs.DBCTL.BIT.OUTSWAP =0;

//初始化 ISR()
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETPS.bit.INTPRD = ET_1st;
EPwm1Regs.ETCLR.bit.INT = 1;
EPwm1Regs.ETSEL.bit.intEn = 0;
}

//初始化 EPWM2模块函数配置
void Init_EPWM2_handle (void)

EPwm2Regs.TBPRD = INV_EPWM_PRID_VALUE;// PWM 频率
EPwm2Regs.CMPA.bit.CMPA = INV_EPWM_PRID_VALUE - 20;//最初设置200ns
EPwm2Regs.CMPA.bit.CMPAHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展
EPwm2Regs.CMPB.bit.CMPB = 20;//初始设置200ns
EPwm2Regs.CMPB.bit.CMPBHR = 0x0000;//0x7F00;//初始化 HRPWM 扩展

EPwm2Regs.TBCTR = 0;
EPwm2Regs.TBPHS.bit.TBPHS = 0;

EPwm2Regs.TBCTL.ALL = 0;
EPwm2Regs.TBCTL.BIT.PRDLD = TB_SHADOW;//设置立即加载
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm2Regs.TBCTL.BIT.HSPCLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.BIT.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.FREE_SOFT = mPWM_DEBUG_STOP;//contu
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;//TB_SYNC_DISABLE;
EPwm2Regs.TBCTL.bit.SWFSYNC = 1;//软件触发一次性 syncon
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;同步后进行//con up
EPwm2Regs.TBCTL.BIT.PHSEN = TB_DISABLE;

EPwm2Regs.CMPCTL.all = 0;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm2Regs.AQCTLA.bit.cad = AQCLEAR;
EPwm2Regs.AQCTLB.bit.CBU = AQCLEAR;
EPwm2Regs.AQCTLB.bit.CBD = AQ_SET;
EPwm2Regs.AQCSFRC.bit.CSFA = 1;
EPwm2Regs.AQCSFRC.bit.CSFB = 1;

EPwm2Regs.DBCTL.bit.IN_MODE = 1;
EPwm2Regs.DBCTL.BIT.DEDB_MODE = 0;
EPwm2Regs.DBCTL.BIT.POLSEL = 0;
EPwm2Regs.DBCTL.BIT.OUT_MODE =0;
EPwm2Regs.DBRED.bit.DBRED = 0;
EPwm2Regs.DBFED.bit.DBFED = 0;
EPwm2Regs.DBCTL.BITS.OUTSWAP =0;
}

void INV_SPWM_Handle (void)

开关(Phase_Sin)

情况0x10://ZeroCross = 0 Vac_Phase_Count

EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY - DCAControl_FOC.PFC_DUTY_DT;
EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//ePWM1_A 低电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//ePWM1_B 低电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
Case 0x11://USB Vac_Phase_Count = 0 ~ 200

EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FOC.PFC_PERIOD - DCAControl_FOC.PFC_DUTY - DCAControl_FOC.PFC_DUTY_DT;

EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//ePWM1_A 低电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceHigh;//ePWM1_B 高电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
案例0x20://ZeroCross = 200 Vac_Phase_Count

EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_DUTY + DCAControl_FOC.PFC_DUTY_DT;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FC.PFC_DUTY;

EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//ePWM1_A 低电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//ePWM1_B 低电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
案例0x21 :// Vac_Phase_Count = 200 ~ 400

EPwm2Regs.CMPA.bit.CMPA = DCAControl_FOC.PFC_DUTY + DCAControl_FOC.PFC_DUTY_DT;
EPwm2Regs.CMPB.bit.CMPB = DCAControl_FC.PFC_DUTY;

EPwm1Regs.AQCSFRC.bit.CSFA = eForceHigh;//ePWM1_A 高电平
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//ePWM1_B 低电平
EPwm2Regs.AQCSFRC.bit.CSFA = eNoForce;//ePWM2释放
EPwm2Regs.AQCSFRC.bit.CSFB = eNoForce;//ePWM2释放
休息;
}
默认值:

EPwm1Regs.AQCSFRC.bit.CSFA = eForceLow;//1
EPwm1Regs.AQCSFRC.bit.CSFB = eForceLow;//1
EPwm2Regs.AQCSFRC.bit.CSFA = eForceLow;//1
EPwm2Regs.AQCSFRC.bit.CSFB = eForceLow;//1
休息;
}
}
}

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

    您好:

    我将在几天内查看和答复。

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

    您好、Angela、

    1. 您能帮助我们了解哪个示波器通道代表了哪个信号吗?
    2. 波形中的抖动是哪一项、我们需要消除?
    3. 您还能分享过零时放大的 PWM 波形和我们希望实现的预期波形

    此致、Pawan

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

    尊敬的 Pawan:

    在第一个图中、绿色和蓝色波形是 PWM1A 和 PWM1B。  在第二个图中、橙色和蓝色波形是 PWM1A 和 PWM1B。 您可以在图1中看到死区为50us (ISR 为20kHz)。 他们希望降低到20us。

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

    您好、Angela、

    客户是否考虑使用 PLL (锁相环)生成50Hz 交流正弦波?   您可以使用 SPLL 库将上部和下部器件的切换与交流波形同步。 PLL 可以生成一个锁相至交流波形的信号、该信号可用于控制上部和下部器件的切换。

    然后、您可以使用 ZCD 方法检测交流波形的零点并添加所需的死区。