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.

[参考译文] UCD3138:UCD3138PFCEVM-026:在 UCD3138PFCEVM-026中的控制器从 UCD 更改为 DSP28335后电路测试中出现问题

Guru**** 2540720 points
Other Parts Discussed in Thread: UCD3138, UCD3138PFCEVM-026

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1159863/ucd3138-ucd3138pfcevm-026-problems-in-circuit-testing-after-the-controller-in-ucd3138pfcevm-026-was-changed-from-ucd-to-dsp28335

器件型号:UCD3138

大家好、我一侧的主电路根据 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;
}

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

    您好!

    UCD3138PFCEVM-026只能与 UCD3138系列控制器配合使用。 它仅用于演示由 UCD3138而不是 DSP28335控制的 PFC 电路。
    如果您对 DSP28335感兴趣、可以提交一个包含 C2000的 EVM 板、该板演示了 PFC。 另一个选项是使用 C2000头文件创建新线程。 这样、C2000专家就可以在线为您提供支持。

    谢谢  

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

    使用 C2000系列控制器 TMS320F28335228335进行编程和实验、主电路硬件是自行设计的、只需参考 UCD3138PFCEVM-026的电路即可。

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

    小西奥索

    DSP28335控制器似乎存在一些问题。  请开始另一个线程、寻求 C2000团队(DSP28335)的支持以获得更好的支持。

    此致、

    徐美