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.

[参考译文] TMS320F28375D:PFC 运行中的过零电流尖峰

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1018484/tms320f28375d-zero-crossing-current-spike-in-pfc-operation

器件型号:TMS320F28375D
主题中讨论的其他器件: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 (绿色):交流电流

如果您需要更多信息、请告诉我。

谢谢你。

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

    Lewis、

    我真的没有太多建议、这些问题很难调试、需要大量深入的审查和实验。  

    如果反馈路径受到噪声的影响、则很难说出您的控制器将如何对所述噪声做出反应。 这可能会导致不安全的情况、从而导致 FET 损坏。 在开始调试整个系统之前、建立和测试您的保护方案非常重要。

    至于仿真断开:您是否使用 TI 硬件评估此解决方案? 对于 controlCARD、我们发现需要移除仿真器和器件接地层之间的电容器。(电路板顶部附近的真正大电容器。) TMDSCNCD280049C 上的 C26:A。

    此致、
    Cody  

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

    尊敬的 Cody Watkins。

    首先感谢您的回复。

    我不使用 TI 硬件、我正在开发自己的硬件。

    如果您能查看是否提供技术建议、我将不胜感激。

    "正启动占空比"

    软启动实现。

    出现的第一个占空比宽度非常窄。
    但是、会出现电流尖峰。

    电流尖峰也会在第二个占空比中出现。
    是什么导致了这种情况的发生?
    电感器的容量是否很大?
    电感器为150导通 EE Core。
    它是内部寄生电容的影响吗?

    你有什么期望吗?

    如果您可以参考问题中随附的波形、我将不胜感激。

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

    正确、这通常部分是由于寄生电容造成的。 本文介绍了几种可能导致电流尖峰的情况。  https://www.ti.com/lit/slyt650 

    此致、
    Cody

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

    感谢您的回复。
    我已经阅读了该链接中的文档。
    如果是寄生电容、有没有办法解决它?

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

    除了软启动和选择具有小栅极电容的器件之外、我不知道该问题的任何其他解决方法。

    不过,在这方面可能有一些学术文章。

    此致、
    Cody