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.
您好 我想问您个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提供的。
我想你最好还是跟原作者确认,我的认识已经在之前回复了,但也不一定是正确的。
可能你可以试着对比看一下,有和没有清零的代码,测试结果有什么不同?