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;
}
一个32位乘法
cpu运算需要2079个CPU周期 2079*6.67ns=13866.93ns=13.86us
FPU运算需要75个CPU周期 75*6.67ns=500.25ns=0.5us
FPU运算一个浮点的sin函数 73*6.67=486.91ns=0.486us (sin函数无法输出180°到360°的负值)
FPU运算一个浮点的sin函数 71*6.67=473.57ns=0.473us
71这个数字是有浮动的。
相差两位数啊!
需要加载 头文件 math.h 库文件使用 rts2800_fpu32.lib
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;//输出扇区号码
x=1.414*x2*x4/x3; //一次除法
y=(x1+0.5774*x2)*1.2247*x4/x3; //第二次除法
z=(x1-0.5774*x2)*1.2447*x4/x3; //第三次除法
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;
}
ta=(x4-tx-ty)/4; //可以变除法为乘法
tb=ta+tx/2; //可以变除法为乘法
tc=tb+ty/2; //可以变除法为乘法
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;
}
可以看出SVPWM最多有5此除法,根据前面的分析,5次除法大约使用了5us的时间。
20khz的载波频率,Tpwm=50us。50-5=45us
45us/6.67ns=6746.6(CPU cycles)
因此在中断内部实现矢量控制还是很有可能的。
一周热门 更多>