value=sin(1.57)*2+cos(0.5)*2;//147 cpu cycles
ESTOP0;
value=cos(0.5);// 70 cpu cycles
ESTOP0;//software breakpoint
value=2*value+3;// 5 cpu cycles
ESTOP0;
value=value*0.5;// 3 cpu cycles
ESTOP0;
value=value/2;//155 cpu cycles===1us
ESTOP0;由此可以看出来,在计算除法的时候尽量把除法化为乘法计算,乘法比除法速度快的太多了。
下面是psim仿真SVPWM的时候用c BLOCK写的程序,实现的SVPWM功能。
//输入和输出变量说明
//x1----alpha
//x2----beta
//x3----Vdc 母线电压
//x4----Ts Tpwm pwm周期
//y1----扇区号
//y2----tcm1
//y3----tcm2
//y4----tcm3
//----------------------------------------------------扇区判断
float u1,u2,u3;//扇区判断中间变量
unsigned char A,B,C,N;//扇区判断中间变量
float x,y,z;//PWM波中间变量
float tx,ty;//PWM波中间变量
float txx,tyy;
float ta,tb,tc;//PWM波中间变量
//float tcm1,tcm2,tcm3;//PWM波中间变量
u1=x2;
u2=0.866*x1-0.5*x2;
u3=-0.866*x1-0.5*x2;
if(u1>0)
A=1;
else
A=0;
if(u2>0)
B=1;
else
B=0;
if(u3>0)
C=1;
else
C=0;
N=4*C+2*B+A;
switch(N)
{
case 1:N=2;break;
case 2:N=6;break;
case 3:N=1;break;
case 4:N=4;break;
case 5:N=3;break;
case 6:N=5;break;
}
y1=N;//输出扇区号码
switch(N)
{
case 1:tx=z;ty=x;break;
case 2:tx=-z;ty=y;break;
case 3:tx=x;ty=-y;break;
case 4:tx=-x;ty=-z;break;
case 5:tx=-y;ty=z;break;
case 6:tx=y;ty=-x;break;
}
if((tx+ty)>x4||(tx+ty)==x4)
{
txx=tx*x4/(tx+ty); //第四次除法
tyy=ty*x4/(tx+ty); //第五次除法
tx=txx;
ty=tyy;
}
switch(N)
{
case 1:y2=ta;y3=tb;y4=tc;break;
case 2:y2=tb;y3=ta;y4=tc;break;
case 3:y2=tc;y3=ta;y4=tb;break;
case 4:y2=tc;y3=tb;y4=ta;break;
case 5:y2=tb;y3=tc;y4=ta;break;
case 6:y2=ta;y3=tc;y4=tb;break;
}