//启动 read(I0); //读取I0 read(U0); //读取U0 read(Wn-1); //读取Wn-1 //子过程1:由W-1和I0,U0计算t¬0+tr时刻(B点)电流Ir和电压Ur if(W-1>T-tr) //判断t¬0时刻(B点)的开关状态 { //导通,则W-1=T(具体原因见后) //A,A1',A2'前面已经计算得到 A1=I0/A-A2'*U0; A2=-I0/A+A1'*U0; //计算t¬0+tr时刻(B点)电流Ir和电压Ur //Ep1,Ep2,Cpe1,Cpe2前面已经计算得到 Ur=A1*Ep1+A2*Ep2; Ir=Cpe1*A1+Cpe2*A2 } else { //关闭 //计算t¬0+tr时刻(B点)电流Ir和电压Ur //Etr前面已经计算得到 Ur=U0; Ir=I0*Etr; } //子过程1结束 read(I1); //读取本周期结束时刻电流预设值I1 //子过程2:由Ir和Ur以及I1计算本周期输出脉冲宽度Wn //由Ir, Ur和预置常量P1, P2, A, A1', A2'计算A1, A2 A1=Ir/A-A2'*Ur; A2=-Ir/A+A1'*Ur; //计算二阶近似方程的中间变量 C1=Cp13*A1+Cp23*A2; C2=Cp12*A1+Cp22*A2; C3=Cp11*A1+Cp21*A2; D1=I1*Tao1; D2=I1*Tao2; D3=I1*Tao3; a=C1-D1; b=C2-D2; c=C3-D3; //求解a*x^2+b*x+c=0,只取根x1 x1=(-b+sqrt(b*b-4*a*c))/(2*a); //最小、最大脉宽控制 if(x1T08) Wn=T; else Wn=x1; outputPWM(Wn); //27次乘除运算,另有一次开方运算,视精度要求也许3~4次乘除 //所以,总计乘除法运算量在30次左右。