主题中讨论的其他器件:TMDSCNCD280049C
早上好。
我目前正在使用 F28375D 实施 PFC。
我试图抑制过零点处的电流尖峰。
参考文献如下。
ttplpfc_F28004x 固件。
2.请参阅"如何降低图腾柱 PFC 交流过零时的电流尖峰"
https://www.ti.com/lit/slyt650
该电路如下所示。
它类似于上述文档的"图3"。
电感器:25mH
交流电压:220VAC 单相
输出电压:390Vdc
输出功率:30W
6、开关:DMN60H3D5SK3 (Q1、Q2、Q3、Q4)
开关频率:50kHz
死区时间:500ns
过零处理程序如下所示。 (指 ttplpfc_F28004x 固件)
static inline void grid_pwm_update(float32 invDuty) { volatile int16 softDeadBand; volatile Uint16 db_tmp; switch(zcp.zc_position) { case zc_normalOperation: //Negative to Positive Zero-Crossing // if((grid_invSine < GRID_PWM_PZC2) && (grid_invSinePrev < 0)) if((grid_invSine >= 0) && (grid_invSinePrev < 0)) { zcp.zc_position = zc_positiveZeroCrossing1; invDuty = 0.004f; EPwm8Regs.DBCTL.bit.OUT_MODE = DBCTL_OUT_MODE_DIRECT; EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_LOW; EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_LOW; EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_PERIOD; EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_PERIOD; grid_pfc_gi.i10 = 0; grid_pfc_gi.i6 = 1; grid_curr_ref_prev = 0.00f; } //Positive to Negativ Zero-Crossing // else if((grid_invSine > GRID_PWM_NZC2) && (grid_invSinePrev > 0)) else if((grid_invSine <= 0) && (grid_invSinePrev > 0)) { zcp.zc_position = zc_negativeZeroCrossing1; invDuty = 0.004f; EPwm8Regs.DBCTL.bit.OUT_MODE = DBCTL_OUT_MODE_DIRECT; EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_LOW; EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_LOW; EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_PERIOD; EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_PERIOD; grid_pfc_gi.i10 = 0; grid_pfc_gi.i6 = 1; grid_curr_ref_prev = 0.00f; } break; /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Positive Cycle ///////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// case zc_positiveZeroCrossing1: // grid_pwm_slew++; // EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_PERIOD; // EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_PERIOD; // invDuty = 0.004f; invDuty = 0.004f; if(grid_invSine >= 0) { zcp.zc_position = zc_positiveZeroCrossing2; // grid_pwm_softstart = 0.0f; } break; case zc_positiveZeroCrossing2: // grid_pwm_slew++; invDuty = 0.004f; if(grid_invSine > GRID_PWM_PZC2) { zcp.zc_position = zc_positiveZeroCrossing3; grid_pwm_slew = CLR; grid_pwm_softstart = CLR; EPwm7Regs.DBCTL.bit.OUTSWAP = DBCTL_OUTSWAP_APATH_A_BPATH_B; //Swap하지 않음 grid_pfc_gi.i10 = 0; grid_pfc_gi.i6 = 1; grid_pfc_gi.Ki = 0; } break; case zc_positiveZeroCrossing3: grid_pwm_slew++; if(fabsf(invDuty) < 0.02f) { if(invDuty > 0) invDuty = 0.02f; else invDuty = -0.02f; } /* if(fabsf(invDuty) < 0.004f) { if(invDuty > 0) invDuty = 0.004f; else invDuty = -0.004f; } */ grid_pwm_softstart = grid_pwm_softstart + GRID_PWM_SOFT_GAIN; softDeadBand = GRID_PWM_PERIOD - grid_pwm_softstart; db_tmp = GRID_PWM_DB; if(softDeadBand < db_tmp) softDeadBand = GRID_PWM_DB; EPwm7Regs.DBFED.bit.DBFED = softDeadBand; // if((grid_pwm_slew > 3) && (grid_invSine > 0)) if((grid_pwm_slew > GRID_PWM_SOFT_COUNT) && (grid_invSine > 0)) { grid_pfc_gi.i10 = 0; grid_pfc_gi.i6 = 1; grid_pfc_gi.Ki = GRID_PFC_GI_PI_KI; zcp.zc_position = zc_positiveHalf; EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_DB; EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_DB; EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_LOW; EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_HIGH; grid_pwm_slew = CLR; } break; case zc_positiveHalf: // grid_pwm_slew++; // EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_LOW; // EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_HIGH; // EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_DB; if((grid_invSine < GRID_PWM_NZC1) || (grid_invSine <= 0)) { zcp.zc_position = zc_negativeZeroCrossing1; invDuty = 0.004f; EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_LOW; EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_LOW; EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_PERIOD; EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_PERIOD; } break; /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Negative Cycle ///////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// case zc_negativeZeroCrossing1: // grid_pwm_slew++; // EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_PERIOD; // EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_PERIOD; // invDuty = 0.004f; invDuty = 0.004f; if(grid_invSine <= 0) { zcp.zc_position = zc_negativeZeroCrossing2; } break; case zc_negativeZeroCrossing2: // grid_pwm_slew++; invDuty = 0.004f; if(grid_invSine < GRID_PWM_NZC2) { zcp.zc_position = zc_negativeZeroCrossing3; grid_pwm_slew = CLR; grid_pwm_softstart = CLR; EPwm7Regs.DBCTL.bit.OUTSWAP = DBCTL_OUTSWAP_APATH_B_BPATH_A; //OutA, OutB Swap grid_pfc_gi.i10 = 0; grid_pfc_gi.i6 = 1; grid_pfc_gi.Ki = 0; } break; case zc_negativeZeroCrossing3: grid_pwm_slew++; if(fabsf(invDuty) < 0.004f) { if(invDuty > 0) invDuty = 0.004f; else invDuty = -0.004f; } grid_pwm_softstart = grid_pwm_softstart + GRID_PWM_SOFT_GAIN; // grid_pwm_softstart = grid_pwm_softstart + 200; softDeadBand = GRID_PWM_PERIOD - grid_pwm_softstart; db_tmp = GRID_PWM_DB; if(softDeadBand < db_tmp) softDeadBand = GRID_PWM_DB; EPwm7Regs.DBFED.bit.DBFED = softDeadBand; if((grid_pwm_slew > GRID_PWM_SOFT_COUNT) && (grid_invSine < 0)) { grid_pfc_gi.i10 = 0; grid_pfc_gi.i6 = 1; grid_pfc_gi.Ki = GRID_PFC_GI_PI_KI; zcp.zc_position = zc_negativeHalf; EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_DB; EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_DB; EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_HIGH; EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_LOW; grid_pwm_slew = CLR; } break; case zc_negativeHalf: // grid_pwm_slew++; // EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_HIGH; // EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_LOW; // EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_DB; if((grid_invSine > GRID_PWM_PZC1) || (grid_invSine >= 0)) { zcp.zc_position = zc_positiveZeroCrossing1; invDuty = 0.004f; EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_LOW; EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_LOW; EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_PERIOD; EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_PERIOD; } break; case zc_defaultState: invDuty = 0.01f; EPwm8Regs.DBCTL.bit.OUT_MODE = 0; EPwm8Regs.AQCSFRC.bit.CSFA = AQCSFRC_OUT_LOW; EPwm8Regs.AQCSFRC.bit.CSFB = AQCSFRC_OUT_LOW; EPwm7Regs.DBRED.bit.DBRED = GRID_PWM_PERIOD; EPwm7Regs.DBFED.bit.DBFED = GRID_PWM_PERIOD; EPwm7Regs.AQCTLA.bit.CAU = TBCTR_CMP_OUTPUT_LOW; EPwm7Regs.AQCTLA.bit.CAD = TBCTR_CMP_OUTPUT_TOGGLE; EPwm7Regs.AQCTLA.bit.ZRO = TBCTR_CMP_OUTPUT_HIGH; computeDF22_NotchFltrCoeff(&grid_notch1, (float32)(GRID_PWM_FREQ), (float32)(grid_freq_now*2.0) , 0.25f, 0.00001f); computeDF22_NotchFltrCoeff(&grid_notch2, (float32)(GRID_PWM_FREQ), (float32)(grid_freq_now*2.0) , 0.25f, 0.00001f); if(Device_Operation == START) { zcp.zc_position = zc_normalOperation; grid_close_loop = START; grid_close_loop_first_time = SET; } break; default: zcp.zc_position = zc_defaultState; } invDuty = (float32)EPwm7Regs.TBPRD * fabsf(invDuty); if(invDuty == EPwm7Regs.TBPRD) { invDuty = invDuty - 1; } EPwm7Regs.CMPA.bit.CMPA = invDuty; }
随附的波形是 AC150V 输入和320Vdc 输出的波形。
AC180V 或更高电压、390Vdc 输出使 Spike 更大并断开仿真器。
并发生由 SDFM 连接的 AMC1304M25DW 故障。(用于交流电压测量)
此外、FET 将损坏。
您有什么建议吗?
下面是其当前状态的波形。
基本 配置
2. 50kHz Vgs 波形
C1 (黄色):Q3 Vgs // C3 (蓝色):Q4 Vgs
C2 (紫色):交流电压 // C4 (绿色):交流电流
3.线路频率波形
C1 (黄色):Q1 Vgs // C3 (蓝色):Q2 Vgs
C2 (紫色):交流电压 // C4 (绿色):交流电流
VDS 波形
C1 (黄色):Q3 Vds // C3 (蓝色):Q4 Vds
C2 (紫色):交流电压 // C4 (绿色):交流电流
如果您需要更多信息、请告诉我。
谢谢你。