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.

TMS320F28027: 两相FPC闭环控制时,PWM波形异常

Part Number: TMS320F28027

项目中使用了ePWM1和 ePWM2的PWMA 来控制两相PFC, 脉冲频率200KHz,  相位相差180度。有启用高分辨率模式。两相PFC在闭环控制时有两个问题。

1.有极窄的脉冲产生。窄脉冲位于两个正常脉冲的中间。为何有此信号?

2.比较器有输出跳闸信号时,脉冲的下降沿为何不陡跷?下降沿的旁边有时还有尖脉冲,这又是为什么呢?

初始化代码如下:

PWM_setCounterMode(pwm, PWM_CounterMode_UpDown); // Count up
PWM_setPeriod(pwm, EPWM_PFC_TIMER_TBPRD); // Set timer period
PWM_disableCounterLoad(pwm); // Disable phase loading
PWM_setCount(pwm, 0x0000); // Clear counter
PWM_setPhase(pwm, EPWM_PFC_TIMER_TBPRD>>1);//A相超前 B相滞后 //pwm == myPwm1 ? 0 : EPWM_PFC_TIMER_TBPRD
PWM_setPhaseDir(pwm,pwm == myPwm1 ? PWM_PhaseDir_CountUp : PWM_PhaseDir_CountDown);
PWM_setSyncMode(pwm, PWM_SyncMode_EPWMxSYNC);
PWM_enableHrPhaseSync(pwm); //得放在PWM_setSyncMode的后面
PWM_enableCounterLoad(pwm);

PWM_setHighSpeedClkDiv(pwm, PWM_HspClkDiv_by_1);
PWM_setClkDiv(pwm, PWM_ClkDiv_by_1);
PWM_setRunMode(myPwm1, PWM_RunMode_FreeRun);

PWM_setShadowMode_CmpA(pwm, PWM_ShadowMode_Shadow);
PWM_setShadowMode_CmpB(pwm, PWM_ShadowMode_Shadow);
PWM_setLoadMode_CmpA(pwm, PWM_LoadMode_Zero);
PWM_setLoadMode_CmpB(pwm, PWM_LoadMode_Zero);

PWM_setCmpA(pwm, EPWM_PFC_TIMER_TBPRD); // Set compare A value
PWM_setCmpB(pwm, EPWM_PFC_TIMER_TBPRD); // Set Compare B value
PWM_setCmpAHr(pwm, 0);

PWM_setActionQual_Zero_PwmA(pwm, PWM_ActionQual_Clear);
PWM_setActionQual_Zero_PwmB(pwm, PWM_ActionQual_Clear);
PWM_setActionQual_CntUp_CmpA_PwmA(pwm, PWM_ActionQual_Set);
PWM_setActionQual_CntUp_CmpB_PwmB(pwm, PWM_ActionQual_Set);
PWM_setActionQual_CntDown_CmpA_PwmA(pwm, PWM_ActionQual_Clear);
PWM_setActionQual_CntDown_CmpB_PwmB(pwm, PWM_ActionQual_Clear);

 PWM_setHrEdgeMode(pwm, PWM_HrEdgeMode_Falling);
 PWM_setHrControlMode(pwm, PWM_HrControlMode_Duty);
 PWM_setHrShadowMode(pwm, PWM_HrShadowMode_CTR_EQ_0);//

PWM_DigitalCompare_InputSel_e ein = pwm == myPwm1 ? \
PWM_DigitalCompare_InputSel_COMP1OUT : PWM_DigitalCompare_InputSel_COMP2OUT;
PWM_setDigitalCompareInput(pwm, PWM_DigitalCompare_A_High, ein);
PWM_setDigitalCompareInput(pwm, PWM_DigitalCompare_A_Low, ein);
PWM_setTripZoneDCEventSelect_DCAEVT1(pwm, PWM_TripZoneDCEventSel_DCxHH_DCxLX);
PWM_setDigitalCompareAEvent1(pwm, false, true, false, false);
PWM_enableTripZoneSrc(pwm, PWM_TripZoneSrc_CycleByCycle_CmpA);

//DCBEVT1 用于强制跳闸 PWM_TripZoneSrc_OneShot_CmpB
PWM_setDigitalCompareInput(pwm, PWM_DigitalCompare_B_High, ein);
PWM_setDigitalCompareInput(pwm, PWM_DigitalCompare_B_Low, ein);
PWM_setTripZoneDCEventSelect_DCBEVT1(pwm, PWM_TripZoneDCEventSel_DCxHH_DCxLX);
PWM_setDigitalCompareAEvent2(pwm, false, true);
PWM_enableTripZoneSrc(pwm, PWM_TripZoneSrc_CycleByCycle_CmpB);

PWM_setTripZoneState_TZA(pwm, PWM_TripZoneState_EPWM_Low);
PWM_setTripZoneState_TZB(pwm, PWM_TripZoneState_EPWM_Low);

//设置触发信号(ADC转换)
PWM_setSocAPulseSrc(pwm, PWM_SocPulseSrc_CounterEqualPeriod);//PWM_SocPulseSrc_CounterEqualCmpAIncr
PWM_setSocAPeriod(pwm, PWM_SocPeriod_FirstEvent); //
PWM_enableSocAPulse(pwm); // Enable SOC on A group PWM_SocPulseSrc_CounterEqualZero

  • Hi zhou yi,

    您参考的是TI的哪个设计?

  • 参考的是Two Phase Interleaved PFC Kit

  • Hi zhou yi,

    请问您使用的是官方的套件还是自己做的PCBA?您的程序在demo的基础上做了哪些修改?

    以及您的测试条件。这些波形是单独测试C2000器件得到的还是连接套件后测得的?

    --

    谢谢

  • 在别人已经量产的PCB上测试的,自己写的程序,参考了Two Phase Interleaved PFC Kit的代码。

    目前测试是输入直流150V, 通过两线串口(I2C)设置PFCIcmd测试电流控制环路。

    为了提高分辨率,使能了HRPWM模式,PWMDRV_PFC2PhiL 部份的代码有更改。具体如下:

    PWMDRV_PFC2PHIL .macro n
    ;======================
    ;说明
    ;PWM工作在UpDowm模式
    ;计数器增大匹配时产生上升沿,计数器减小匹配时产生下降升沿
    ;Temp(Q32) = (Period(Q16) * Duty(Q24)
    ;CMPA = Period - Temp取整数部份
    ;使用HRPWM时,EdgeMode选择PWM_HrEdgeMode_Falling,下降沿后移(以180 ps步进),占空比变大
    ;CMPAHR = Temp取小数部份 * MEP_ScaleFactor * 2 (UpDowm模式,得乘以2)
    ;2023.02.15 为解决运算错误,改回在此处计算PWMDRV_PFC2PhiL_MEP * 2
    .ref _VpfcOut
    .ref _VpfcMax
    .ref _MEP_ScaleFactor
    ; MOVW DP,#_VpfcOut

    MOVW DP, #_PWMDRV_PFC2PhiL_Duty:n: ; load DP for net pointer
    MOVL XAR0, @_PWMDRV_PFC2PhiL_Duty:n: ; XAR0 = PWMDRV_PFC2PhiL_Duty = &PFCDuty
    ; MOVL XAR1, @_PWMDRV_PFC2PhiL_MEP:n: ; XAR1 = MEP_ScaleFactor * 2
    MOVL XT, @_PWMDRV_PFC2PhiL_Period:n: ; XT = Period (I16Q16)

    MOVW DP, #_MEP_ScaleFactor ; load DP for net pointer
    MOV ACC, @_MEP_ScaleFactor<<1 ;
    MOVL XAR1, ACC ; XAR1 = MEP_ScaleFactor * 2

    ; MOV 16位数据移动
    ; MOVL 32位数据移动
    MOVW DP, #_VpfcOut ; load DP for net pointer
    MOVL ACC,@_VpfcOut
    CMPL ACC,@_VpfcMax
    B SKIP_LT,LT
    SKIP_GT:
    MOVL ACC,@XAR0
    LSL ACC,#16
    ; MOV ACC,@XAR0<<16
    B SKIP_CMPA,UNC
    SKIP_LT:


    IMPYL P,XT,*XAR0 ; P = low 32−bits of (M32*X32)
    QMPYL ACC,XT,*XAR0 ; ACC = high 32−bits of (M32*X32)
    ; ACC:P = Period(Q16) * Duty(Q24) = I24Q40
    LSL64 ACC:P,#8 ; ACC:P(I16Q48) ACC(I16Q16)
    SUB @T,AH
    MOV AR3,T ; AR3 = Period - 整数部份(Period * Duty)

    MOVW AH, #0 ;
    MOVL XT,ACC ; XT = 小数部份
    IMPYL ACC,XT,@XAR1 ; ACC = low 32−bits of (M32*X32)
    ; IMPYL ACC,XT,*XAR1 ; ACC = low 32−bits of (M32*X32)
    ; ACC = MEP *2 * 小数部份 = Q0 * I16Q16 = I16Q16
    ASR64 ACC:P,#8
    ADD AL, #80H ; AL = MEP部份
    AND ACC, #0xFF00<<0
    MOV AH, @AR3

    SKIP_CMPA:
    MOVW DP, #_EPwm1Regs.CMPA
    MOVL @_EPwm1Regs.CMPA,ACC ; CMPA = Duty * Period
    MOVW DP, #_EPwm1Regs.CMPB
    MOV @_EPwm1Regs.CMPB,AH ; CMPB = Duty * Period
    MOVW DP, #_EPwm2Regs.CMPA
    MOVL @_EPwm2Regs.CMPA,ACC ; CMPA = Duty * Period
    .endm

    模拟输入(电流信号)和DAC比较输出到TZ模块,保护模式是CycleByCycle

    波形是直接在MCU IO 口上测试得到。

  • Hi zhou yi,

    我询问相关工程师后回复您。

  • Hi zhou yi,

    抱歉回复您晚了。

    2.比较器有输出跳闸信号时,脉冲的下降沿为何不陡跷?下降沿的旁边有时还有尖脉冲,这又是为什么呢?

    图片中的信号是什么?是CMPSS的输出吗?如果不是的话,它是什么信号?是CMPSS或PWM模块中的中间信号吗?如果是的话,您是通过xbar和GPIO得到这个信号的吗?

    1.有极窄的脉冲产生。窄脉冲位于两个正常脉冲的中间。为何有此信号?

    这很难解释,因为它与代码的细节有关。周期是否符合预期(意味着是否只有占空比不正确)?我们需要更多信息