专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

SVPWM算法的Dev C++仿真

作者:佚名   来源:本站原创   点击数:  更新时间:2014年04月27日   【字体:

  今天看了@技术宅 的SVPWM文章 于是一时兴起

看着这个东西:
http://wenku.baidu.com/link?url=0q05AB-vk1S_442Gb8ooY02doxwctGeEuKfFTAZGPhB5ioekgwfM-CpwyTALO9ueOjlcE_Rz2u3X11hcAvOu-SXhxuZHlmlbVlrfvXBrQnu
写了一段SVPWM仿真程序 文章讲的很清楚 大体院里窝都理解 如果能跟着进行推导一边应该更能加深理解



下面素窝的程序 还没有优化过 很多浮点数运算 单片机可能跑不起来的说:
/*
*    SVPWM program
*    By Rikka0_0
*    2014.4.47
*/
#include <stdio.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;
 
        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);
        }
       
        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");
}
关闭窗口

相关文章