发布网友 发布时间:2022-06-28 06:54
共1个回答
热心网友 时间:2023-10-08 20:00
void svpwm(float *ptr)
{
int A,B,C,N;
double X,Y,Z,Tx,Ty,T0,T1,Tm,Th;
if(usbeta>0)A=1;
else A=0;
if((1.732051*usalfa-usbeta)>0)B=1;
else B=0;
if((1.732051*usalfa-usbeta)>0)C=1;
else C=0;
N=A+2*B+4*C;//计算扇区
X=1.732051*usbeta*Ts/udc;
Y=(0.8660*usbeta+1.5*usalfa)*Ts/udc;
Z=(-0.8660*usbeta+1.5*usalfa)*Ts/udc;
swith(N)//各扇区工作时间
{
case 1:Tx=Y;Ty=-Z;break;
case 2:Tx=-X;Ty=Y;break;
case 3:Tx=Z;Ty=X;break;
case 4:Tx=-Z;Ty=-X;break;
case 5:Tx=X;Ty=-Y;break;
default:Tx=-Y;Ty=Z;
}
if((Tx+Ty)>Ts)
{
Tx=Tx*Ts/(Tx+Ty);
Ty=Ty*Ts/(Tx+Ty);
}
T0=(Ts-(Tx+Ty))/4;
T1=(Ts+Tx-Ty)/4;
Tm=(Ts-Tx+Ty)/4;
Th=(Ts+Tx+Ty)/4;
swith(N)//比较寄存器赋值
{
case 1:*ptr=Tm;*(ptr+1)=T0;*(ptr+2)=Th;break;
case 2:*ptr=T0;*(ptr+1)=Th;*(ptr+2)=Tm;break;
case 3:*ptr=T0;*(ptr+1)=T1;*(ptr+2)=Th;break;
case 4:*ptr=Th;*(ptr+1)=Tm;*(ptr+2)=T0;break;
case 5:*ptr=Th;*(ptr+1)=T0;*(ptr+2)=T1;break;
default:*ptr=T1;*(ptr+1)=Th;*(ptr+2)=T0;break;
}
}