大家好、我一侧的主电路根据 UCD3138PFCEVM-026的电路拓扑进行了更改、EMI 滤波器电路被移除、采样电路中的采样率被更改、控制器从 UCD3138更改为 DSP28335以进行 PFC 双环路 PI 控制。 目前、使用以下参数对单相升压 PFC 进行测试:低压测试期间的20V 交流输入、设置输出50VDC、负载100欧姆、100kHz 双环路程序的开关频率。 采样率:输入电压硬件的比率为5.1k/605.1k、电感电流的采样率为49/1200、输出电压的采样率为2.4k/402.4k。 过程:设置两个 PWM、其中 PWM1周期为100kHz、触发 ADC 进行采样(所有变量在开关周期中取一个点)、ADC 触发中断、中断函数运行双环控制程序。 测试期间、PWM 占空比为0或为电流环路设置的最大值、其中紫色为输入电流、浅蓝色为驱动信号波形、深蓝色为输入电压波形。 问题可能出在哪呢?

void main()
{
InitSysCtrl();
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK;
EDIS;
DINT;
InitEPwm1Gpio();
InitEPwm2Gpio();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ADCINT = &adc_isr;
EDIS;
InitAdc();
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
IER |= M_INT1; // Enable CPU Interrupt 1
EINT;// Enable Global interrupt INTM
ERTM;// Enable Global realtime interrupt DBGM
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;
EDIS;
InitADC();
InitEPwm1Example();
InitEPwm2Example();
Disable_boost_PWM();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
for (;;)
{
}
}
void InitEPwm1Example()
{
EPwm1Regs.TBPRD = 750;
EPwm1Regs.TBPHS.half.TBPHS = 0x00;
EPwm1Regs.TBCTR = 0x0000;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm1Regs.TBCTL.bit.HSPCLKDIV =0x00;
EPwm1Regs.TBCTL.bit.CLKDIV = 0x00;
EPwm1Regs.DBCTL.bit.IN_MODE =0;
EPwm1Regs.DBCTL.bit.POLSEL =2;
EPwm1Regs.DBCTL.bit.OUT_MODE =3;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPA.half.CMPA = 750;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EALLOW;
// What do we want the TZ1 and TZ2 to do?
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
// Enable TZ interrupt
EPwm1Regs.TZEINT.bit.OST = 1;
EDIS;
//(Q:用于触发ADC转换)
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = 2;
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
}
void InitEPwm2Example()
{
EPwm2Regs.TBPRD = 750;
EPwm2Regs.TBPHS.half.TBPHS = 0x00;
EPwm2Regs.TBCTR = 0x0000;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN ;
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm2Regs.TBCTL.bit.HSPCLKDIV =0x00;
EPwm2Regs.TBCTL.bit.CLKDIV = 0x00;
EPwm2Regs.DBCTL.bit.IN_MODE =0;
EPwm2Regs.DBCTL.bit.POLSEL =2;
EPwm2Regs.DBCTL.bit.OUT_MODE =3;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPA.half.CMPA = GD_EPWM1_CAMPA1;
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EALLOW;
// What do we want the TZ1 and TZ2 to do?
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
// Enable TZ interrupt
EPwm2Regs.TZEINT.bit.OST = 1;
EDIS;
}
void InitADC()
{
AdcRegs.ADCTRL1.bit.CPS = 1;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 0;
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x4;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x02;
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x03;
AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x04;
AdcRegs.ADCCHSELSEQ1.bit.CONV03=0x05;
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;
}
interrupt void adc_isr()
{
while(AdcRegs.ADCST.bit.INT_SEQ1==0) {}
Value_Detection();
Enable_boost_PWM();
rectify_vac();
handle_voltage_loop();
calculate_current_target_shunt();
current_PIcontrol();
GD_EPWM1_CAMPA1=(int) (750.0 * Current_Output1);
EPwm2Regs.CMPA.half.CMPA = GD_EPWM1_CAMPA1;
EPwm1Regs.ETCLR.bit.SOCA = 1;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
return;
}
void Value_Detection()
{
SampleTable0 = ( (AdcRegs.ADCRESULT0)>>4); //Vl
SampleTable1 = ( (AdcRegs.ADCRESULT1)>>4); //VN
SampleTable2 = ( (AdcRegs.ADCRESULT2)>>4); //IL
SampleTable3 = ( (AdcRegs.ADCRESULT3)>>4); //VO
value_temp1 = SampleTable0 *(2017.0/23205.0) ;
Sample_vl = value_temp1 ;
value_temp2 = SampleTable1 *(2017.0/23205.0) ;
Sample_vn = value_temp2 ;
value_temp3 = SampleTable2 *(80.0/45409.0);
Sample_il = value_temp3 ;
value_temp4 = SampleTable3 *(503.0/4095.0);
Sample_vo = value_temp4 ;
}
void rectify_vac ()
{
if (Sample_vl > Sample_vn )
{
Vin_raw = Sample_vl - Sample_vn;
Vin_positive = 1.0;
}
else //cycle for neutral
{
Vin_raw = Sample_vn - Sample_vl;
Vin_positive = 0.0;
}
Vin_sum = Vin_raw + Vin_sum - (Vin_sum * 0.25);
Vin_filtered = Vin_sum * 0.25;
Vin_squared = (Vin_filtered * Vin_filtered);
}
void handle_voltage_loop()
{
Current_i_target_average = proportional_integral(50.0 - Sample_vo);
}
float proportional_integral(float voltage_Error)
{
Voltage_Error = voltage_Error;
Voltage_Output1=0.01 *(Voltage_Error-Voltage_Error11) + 1.0 * Voltage_Error ;
Voltage_Output = Voltage_Output + Voltage_Output1 ;
if ( Voltage_Output > 1.4 )
{
Voltage_Output = 1.4;
}
else if ( Voltage_Output <= 0.0 )
{
Voltage_Output =0.0;
}
Voltage_Error11 = Voltage_Error ;
return Voltage_Output;
}
void calculate_current_target_shunt()
{
Current_i_target_sensed = (( Current_i_target_average * Vin_filtered )/20.0);
if(Current_i_target_sensed > 2.0)
{
Current_i_target_sensed = 2.0 ;
}
else if(Current_i_target_sensed < 0.0)
{
Current_i_target_sensed = 0.0 ;
}
}
void current_PIcontrol()
{
Current_Error1 = Current_i_target_sensed - Sample_il ;
Current_Output11 = 1.5 *( Current_Error1-Current_Error11) + 600.0 * Current_Error1;//KP=1.5,KI=600
Current_Output1 = Current_Output1 + Current_Output11 ;
if ( Current_Output1 > 0.9 )
{
Current_Output1=0.9 ;
}
else if( Current_Output1 <=0.0 )
{
Current_Output1=0.0 ;
}
Current_Error11 = Current_Error1 ;
}
void Disable_boost_PWM()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
EDIS;
GpioDataRegs.GPACLEAR.bit.GPIO2=1;
GpioDataRegs.GPACLEAR.bit.GPIO3=1;
}
void Enable_boost_PWM()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
EDIS;
}