今天看了@技術(shù)宅 的SVPWM文章 于是一時(shí)興起
看著這個(gè)東西:
http://wenku.baidu.com/link?url=0q05AB-vk1S_442Gb8ooY02doxwctGeEuKfFTAZGPhB5ioekgwfM-CpwyTALO9ueOjlcE_Rz2u3X11hcAvOu-SXhxuZHlmlbVlrfvXBrQnu
寫了一段SVPWM仿真程序 文章講的很清楚 大體院里窩都理解 如果能跟著進(jìn)行推導(dǎo)一邊應(yīng)該更能加深理解

下面素窩的程序 還沒有優(yōu)化過 很多浮點(diǎn)數(shù)運(yùn)算 單片機(jī)可能跑不起來的說:
/*
* SVPWM program
* By Rikka0_0
* 2014.4.47
*/
http://wenku.baidu.com/link?url=0q05AB-vk1S_442Gb8ooY02doxwctGeEuKfFTAZGPhB5ioekgwfM-CpwyTALO9ueOjlcE_Rz2u3X11hcAvOu-SXhxuZHlmlbVlrfvXBrQnu
寫了一段SVPWM仿真程序 文章講的很清楚 大體院里窩都理解 如果能跟著進(jìn)行推導(dǎo)一邊應(yīng)該更能加深理解

下面素窩的程序 還沒有優(yōu)化過 很多浮點(diǎn)數(shù)運(yùn)算 單片機(jī)可能跑不起來的說:
/*
* SVPWM program
* By Rikka0_0
* 2014.4.47
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdlib.h>
#include <math.h>
#define PWM_MAX_COUNT 100
void svpwm(double Umax,double Vdc,double angle,double* u,double* v,double* w){
double Ua,Ub;
double Usalfa,Usbeta;
char sector;
double X,Y,Z;
double t1,t2;
double ta,tb,tc;
double p1,p2,p3;
Ua=sin(angle);
Ub=sin(angle-M_PI*2/3);
//Clarke
Usalfa=Ua;
Usbeta=(2*Ub+Ua)*0.57735026918963; //3^(-1/3)=0.57735026918963
sector=0;
if(Usbeta>0)
sector+=1;
if(-Usbeta+1.732*Usalfa>0)
sector+=2;
if(Usbeta+1.732*Usalfa<0)
sector+=4;
double Ua,Ub;
double Usalfa,Usbeta;
char sector;
double X,Y,Z;
double t1,t2;
double ta,tb,tc;
double p1,p2,p3;
Ua=sin(angle);
Ub=sin(angle-M_PI*2/3);
//Clarke
Usalfa=Ua;
Usbeta=(2*Ub+Ua)*0.57735026918963; //3^(-1/3)=0.57735026918963
sector=0;
if(Usbeta>0)
sector+=1;
if(-Usbeta+1.732*Usalfa>0)
sector+=2;
if(Usbeta+1.732*Usalfa<0)
sector+=4;
X=1.732*Usbeta*PWM_MAX_COUNT;
Y=(1.732*Usbeta+3*Usalfa)*PWM_MAX_COUNT/2;
Z=(1.732*Usbeta-3*Usalfa)*PWM_MAX_COUNT/2;
switch(sector){
case 1:t1=Z;t2=Y;break;
case 2:t1=Y;t2=-X;break;
case 3:t1=-Z;t2=X;break;
case 4:t1=-X;t2=Z;break;
case 5:t1=X;t2=-Y;break;
case 6:t1=-Y;t2=-Z;break;
}
t1=t1*Umax/Vdc;
t2=t2*Umax/Vdc;
if(t1+t2>PWM_MAX_COUNT){
t1=PWM_MAX_COUNT*t1/(t1+t2);
t2=PWM_MAX_COUNT*t2/(t1+t2);
}
case 1:t1=Z;t2=Y;break;
case 2:t1=Y;t2=-X;break;
case 3:t1=-Z;t2=X;break;
case 4:t1=-X;t2=Z;break;
case 5:t1=X;t2=-Y;break;
case 6:t1=-Y;t2=-Z;break;
}
t1=t1*Umax/Vdc;
t2=t2*Umax/Vdc;
if(t1+t2>PWM_MAX_COUNT){
t1=PWM_MAX_COUNT*t1/(t1+t2);
t2=PWM_MAX_COUNT*t2/(t1+t2);
}
ta=(PWM_MAX_COUNT-t1-t2)/2;
tb=ta+t1;
tc=tb+t2;
switch(sector){
case 1:*u=tb;*v=ta;*w=tc;break;
case 2:*u=ta;*v=tc;*w=tb;break;
case 3:*u=ta;*v=tb;*w=tc;break;
case 4:*u=tc;*v=tb;*w=ta;break;
case 5:*u=tc;*v=ta;*w=tb;break;
case 6:*u=tb;*v=tc;*w=ta;break;
}
}
int main (){
double angle=0;
double u,v,w;
while(angle<4*M_PI){
svpwm(310,550,angle,&u,&v,&w);
printf("%d,%d,%d\n",(int)u,(int)v,(int)w);
angle+=2*M_PI*0.01;
}
system("Pause");
}