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.

28035软启动问题

您好 我想问您个F28035的程序问题,一个程序来实现移相全桥变换器的软启动功能,软起动程序写在了EPWM中断里,软起动程序是这样的:让移相全桥超前管与滞后管共同导通时间一点点增加的过程中,让PI调节也同时参与运算,由于刚开始时PI的输出大于软启动的输出,这个时候软启动起作用,当PI输出小与软启动输出后,PI开始进行调节输出电压,使输出电压问题。

interrupt void epwm3_isr(void)
{

if(ss_flag == 1)
{
if(ss_count<=25600)
{

Ue2=0;

ss_count++;
temp1=(long)((ss_count)>>7);

U1= AdcResult.ADCRESULT7; //U1电压, A7通道采U1
//pi程序
Ureal=_IQ(U1);
Uref=_IQ(U_Ref); //140v缩放为1.07,对应数字量为1335
Ue1=Uref-Ureal;
Ue2+=Ue1; //两者的误差
Up=_IQmpy(UKp,Ue1);
Ui=_IQmpy(UKi,Ue2);
Uo1=Up+Ui;
temp3=(long)((Uo1)>>16); //调制波得到数据

if(temp1>=temp3)
{
temp1=temp3;
ss_count=25602;
}

EPwm6Regs.CMPA.half.CMPA =300-temp1;
EPwm6Regs.CMPB=temp1;

}

我想问一下为什么每进一次都让误差累加值设为零呢?这样的方式模拟了UCC3895的软起动了吗

  • 这个程序是你自己写的,还是参考哪里的?或者是TI提供的(如果是,请说明出处)?

    问题:Ue2=0;标红处的if语句的后括号在哪里?

    我对你的问题的理解是:

    在软启阶段,每次都按照temp1的结果进行EPWM的调节,Ue2并不参与控制,所以每次都清零重新计算。

    在PI调节阶段,需要得到这个误差的累加和进行比较,从而计算出temp3以实现PI调节,所以不会被清零。

    注意,进入PI调节阶段,ss_count会等于25602,所以那个条件语句不会被执行。

    我并不清楚UCC是如何实现软启动的。

  • 你好,这个程序是别人写的,现在这段控制移相全桥软起动的程序(加粗的那一部分)我不太明白。标红处的if语句的后括号在最后,我忘了写了。下面是完整的主函数与中断函数。现在软起动的大致思想是:电源开始运行时,PI调节器的输出比较大,并且随着输出电压的逐渐增大而逐渐减小,ss-count累加使超前管与滞后管共同导通占空比从从零一点点增大的,因此,刚开始时SS-COUNT部分起作用,在pi调节器输出与SS-COUNT输出相等以后,pi调节开始起作用,来调节输出电压。我想问一下,为什么要让Ue2=0呢?是不是为了使PI调节器的输出逐渐下降而这样设置的呢?如果不让Ue2=0,则在SS-COUNT使共同导通占空比一点点增加的过程中,PI调节器的输出不会下降,而是一直在饱和值.我说的对吗?

    void main(void)
    {

    //Copy InitFlash function code and Flash setup code to RAM
    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd,&RamfuncsRunStart);
    //This function must reside in RAM
    InitFlash();

    InitSysCtrl();
    DINT;000; // 禁止 CPU 中断

    IFR = 0x0000; //清除 CPU 中断标志
    InitPieVectTable(); // 初始化 中断向量表

    EALLOW;
    PieVectTable.EPWM3_INT = &epwm3_isr;//&表示取地址,此句表示设置EPWM3_INT中断服务程序的入口地址为epwm1_isr
    EDIS;

    / Enable Global realtime interrupt DBGM

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//停止每个已使能EPWM模块内的时基时钟(TBCLK)(默认状态)。
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // Enable Clock to the ADC
    AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Comparator shares the internal BG reference of the ADC, must be powered even if ADC is unused
    SysCtrlRegs.PCLKCR3.bit.COMP2ENCLK = 1; // Enable clock to the Comparator 1 block
    SysCtrlRegs.PCLKCR3.bit.COMP3ENCLK = 1; // Enable clock to the Comparator 2 block

    // For this example, init the ADC

    Init_Adc();
    delay();
    Init_EPwm3();
    Init_EPwm6();

    ing:

    GpioDataRegs.GPADAT.bit.GPIO17 = 0;
    DELAY_US(10L);
    GpioDataRegs.GPADAT.bit.GPIO18 = 0;

    Ue0=0,Ue1=0,Ue2=0,Uref=0,Up=0,Ui=0,Uo0=0,Uo1=0,Uo2=0,Ureal=0;
    count=0;

    0;
    PI_flag=0;
    EPwm6Regs.CMPA.half.CMPA =0;GPBDAT.bit.GPIO34 == 1)

    goto Restart_Begining;
    }
    }

    }

    interrupt void epwm3_isr(void)
    {

    if(ss_flag == 1)
    {
    if(ss_count<=25600)
    {
    Ue2=0;

    EPwm6Regs.CMPA.half.CMPA =300-temp1;
    EPwm6Regs.CMPB=temp1;

  • 这个不是芯片的问题,算法也不是TI提供的。

    我想你最好还是跟原作者确认,我的认识已经在之前回复了,但也不一定是正确的。

    可能你可以试着对比看一下,有和没有清零的代码,测试结果有什么不同?