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
Yale Li:
Hi zhou yi,
您参考的是TI的哪个设计?
,
zhou yi:
参考的是Two Phase Interleaved PFC Kit
,
Yale Li:
Hi zhou yi,
请问您使用的是官方的套件还是自己做的PCBA?您的程序在demo的基础上做了哪些修改?
以及您的测试条件。这些波形是单独测试C2000器件得到的还是连接套件后测得的?
—
谢谢
,
zhou yi:
在别人已经量产的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,LTSKIP_GT: MOVL ACC,@XAR0 LSL ACC,#16 ; MOV ACC,@XAR0<<16 B SKIP_CMPA,UNCSKIP_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 口上测试得到。
,
Yale Li:
Hi zhou yi,
我询问相关工程师后回复您。
TI中文支持网

