Other Parts Discussed in Thread: UCD3138
你好,我这边主电路根据UCD3138PFCEVM-026的电路拓扑结构改变而来,去掉了EMI滤波电路,并将采样电路中的采样比值更改了,控制器由UCD3138改为DSP28335进行PFC双环PI控制。目前进行单相Boost PFC进行测试,参数:低压测试时输入20VAC,设定输出50VDC,负载100欧,开关频率为100kHz的双环程序。采样比例:输入电压硬件上采用比例为5.1k/605.1k,电感电流采样比例为499/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; }