⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bldc_1_sinusoidal.c

📁 用C语言编写的S函数源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                    Vsg = Vs-(eb+ec)/2;
                    Vag = Vsg + ea;
      	        	Vbg = Vcg = Vs;
      	        }
      	        else //pwm freewheeling over
      	        {
      	        	Vab = ea-eb;
      	        	Vac = ea-ec;
      	        	Vbc = eb-ec;
                    Vcg = Vs;
      	        	Vsg = Vs - ec;
      	        	Vbg = Vsg + eb;
                    Vag = Vsg + ea;
      	        }
      	}
      }	goto d_end;
    }

   /*stator voltage vector 2*/
   if((S5==1)&&(S4==1))
    {  commu_flag = 1;
      if(pwm==1)//pwm on mode
      {
    	if(ib>=delta)  //commutation freewheeling
    	{
    		Vab = 0;    
    		Vbc = (-1)*Vs;
            Vag = Vbg = 0;    
    		Vcg = Vs;
            Vsg = (Vs-ea-eb-ec)/3;
    	}
    	else   //commutation freewheeling over
    	{
    		Vab = (-0.5)*(2*eb-ea-ec+Vs);
    		Vbc = 0.5*(2*eb-ea-ec-Vs);
            Vag = 0;
            Vcg = Vs;
    		Vsg = (Vs-ea-ec)/2;
            Vbg = Vsg+eb;
    	}
    	Vac = (-1)*Vs;
      }
      else  //pwm off mode
      {
      	if(ib>=delta)  //commutation freewheeling
      	{
      		if((-1)*ia>=delta)//pwm freewheeling
      		{
      			Vac = 0;
      			Vab = Vs;
      			Vbc = (-1)*Vab;
      		}
      		else //pwm freewheeling over
      		{
      			Vab = 0.5*(Vs+2*ea-eb-ec);
      			Vac = 0.5*(2*ea-Vs-eb-ec);
      			Vbc = (-1)*Vs;
      		}
            Vag =Vcg = Vs;
            Vbg = 0;
      	    Vsg = (2*Vs-ea-ec-eb)/3;
      	}
      	
      	else //commutation freewheeling over
      	{
      	        if(ic>=delta)  //pwm freewheeling
      	        {
      	        	Vab = (-0.5)*(2*eb-ea-ec);
      	        	Vbc = (-1)*Vab;
      	        	Vac = 0;
                  	Vag = Vcg = Vs;
      	        	Vsg = (2*Vs-ea-ec)/2;
      	        	Vbg = Vsg+eb;
      	        }
      	        else //pwm freewheeling over
      	        {
      	        	Vab = ea-eb;
      	        	Vac = ea-ec;
      	        	Vbc = eb-ec;
                  	Vcg = Vs;
      	        	Vsg = Vs-ec;
      	        	Vbg = Vsg+eb;
                    Vag = Vsg+ea;
      	        }
      	}
      }	goto d_end;
    }
   /*stator voltage vector 3*/
   if((S3==1)&&(S4==1))
    {  commu_flag = 1;
      if(pwm==1)//pwm on mode
      {
    	if((-1)*ic>=delta&&(Vsg+ec)<Vs)  //commutation freewheeling
    	{
    		Vac = (-1)*Vs;
    		Vbc = 0;
            Vcg = Vs;
            Vag = 0;
    		Vbg = Vs;
            Vsg = (2*Vs-ea-eb-ec)/3;
    	}
    	else   //commutation freewheeling over
    	{
    		Vac = (-0.5)*(2*ec-ea-eb+Vs);
    		Vbc = 0.5*(Vs-2*ec+ea+eb);
            Vsg = (Vs-ea-eb)/2;
            Vcg = Vsg+ec;
            Vag = 0;
            Vbg = Vs;
    	}
    	Vab = (-1)*Vs;
      }
      else  //pwm off mode
      {
      	if((-1)*ic>=delta&&(Vsg+ec)<Vs)  //commutation freewheeling
      	{
      		if((-1)*ia>=delta)//pwm freewheeling
      		{
      			Vac = Vbc = Vab = 0;
                Vag = Vbg = Vcg = Vs;
                Vsg = (3*Vs-ea-eb-ec)/3;
      		}
      		else //pwm freewheeling over
      		{
      			Vac = (2*ea-eb-ec)/2;
      			Vbc = 0;
      			Vab = Vac;
       			Vbg = Vcg = Vs;
      			Vsg = Vs-(eb+ec)/2;
                Vag = Vsg+ea;
      		}
      	}
      	
      	else //commutation freewheeling over
      	{
      	        if(ib>=delta)  //pwm freewheeling
      	        {
      	        	Vac = Vbc = (-0.5)*(2*ec-ea-eb);
      	        	Vab = 0;
                  	Vsg = Vs-(eb+ea)/2;
                    Vcg = Vsg + ec;
      	        	Vag = Vbg = Vs;
      	        }
      	        else //pwm freewheeling over
      	        {
      	        	Vab = ea-eb;
      	        	Vac = ea-ec;
      	        	Vbc = eb-ec;
                    Vbg = Vs;
      	        	Vsg = Vs - eb;
      	        	Vag = Vsg + ea;
                    Vcg = Vsg + ec;
      	        }
      	}
      }	goto d_end;
    }
   /*stator voltage vector 4*/
   if((S3==1)&&(S2==1))
    {  commu_flag = 1;
      if(pwm==1)//pwm on mode
      {
    	if(ia>=delta)  //commutation freewheeling
    	{
    		Vac = 0;    
    		Vab = (-1)*Vs;
            Vag = Vcg = 0;    
    		Vbg = Vs;
            Vsg = (Vs-ea-eb-ec)/3;	
    	}
    	else   //commutation freewheeling over
    	{
    		Vac = 0.5*(Vs+2*ea-eb-ec);
    		Vab = 0.5*(2*ea-Vs-eb-ec);
            Vcg = 0;
            Vbg = Vs;
    		Vsg = (Vs-eb-ec)/2;
            Vag = Vsg+ea;
    	}
    	Vbc = Vs;
      }
      else  //pwm off mode
      {
      	if(ia>=delta)  //commutation freewheeling
      	{
      		if((-1)*ic>=delta)//pwm freewheeling
      		{
      			 Vbc = 0;
      			 Vac = (-1)*Vs;
      			 Vab = Vac;
      		     Vbg =Vcg = Vs;
                 Vag = 0;
      			 Vsg = (2*Vs-ea-ec-eb)/3;                
      		}
      		else //pwm freewheeling over
      		{
      			Vac = (-0.5)*(Vs+2*ec-ea-eb);
      			Vbc = 0.5*(Vs-2*ec+ea+eb);
      			Vab = (-1)*Vs;
                Vag = 0;
      			Vbg = Vs;
      			Vcg = Vs;
                Vsg = 2*Vs/3 - (ea+eb+ec)/3;
      		}
      	}
      	
      	else //commutation freewheeling over
      	{
      	        if(ib>=delta)  //pwm freewheeling
      	        {
      	        	Vac = (2*ea-eb-ec)/2;
      	        	Vab = Vac;
      	        	Vbc = 0;
                    Vcg = Vbg = Vs;
      	        	Vsg = (2*Vs-eb-ec)/2;
      	        	Vag = Vsg+ea;
      	        }
      	        else //pwm freewheeling over
      	        {
      	        	Vab = ea-eb;
      	        	Vac = ea-ec;
      	        	Vbc = eb-ec;
                    Vbg = Vs;
      	        	Vsg = Vs-eb;
      	        	Vag = Vsg+ea;
                    Vbg = Vsg+eb;
      	        }
      	}
      }	goto d_end;
    }
   /*stator voltage vector 5*/
   if((S1==1)&&(S2==1))
    {  
      if(pwm==1)//pwm on mode
      {
    	if((ia+ic)>=delta&&(Vsg+eb)<Vs)  //commutation freewheeling
    	{   flag = 10;
    		Vbc = Vs;
    		Vab = 0;
            Vbg = Vs;
            Vcg = 0;
    		Vag = Vs;
            Vsg = (2*Vs-ea-eb-ec)/3;
    	}
    	else   //commutation freewheeling over
    	{   commu_flag = 0;
            flag = 20;
    		Vbc = (-1)*0.5*(2*eb+Vs-ea-ec);
    		Vab = 0.5*(Vs-2*eb+ea+ec);
            Vsg = (Vs-ec-ea)/2;
            Vbg = Vsg+eb;
            Vcg = 0;
            Vag = Vs;
    	}
    	Vac = Vs;
      }
      else  //pwm off mode
      {
      	if((-1)*ib>=delta&&(Vsg+eb)<Vs)  //commutation freewheeling
      	{  
      		if((-1)*ic>=delta)//pwm freewheeling
      		{   flag = 30;
      			Vab = Vac = Vbc = 0;
                Vag = Vbg = Vcg = Vs;
                Vsg = (3*Vs-ea-eb-ec)/3;
      		}
      		else //pwm freewheeling over
      		{   flag = 40;
      			Vbc = (-0.5)*(2*ec-ea-eb);
      			Vab = 0;
      			Vac = Vbc;
                Vag = Vbg = Vs;
      			Vsg = Vs-(ea+eb)/2;
                Vcg = Vsg+ec;
      		}
      	}
      	
      	else //commutation freewheeling over
      	{
      	   /*     if((-1)*ic>=delta)  //pwm freewheeling
      	        {*/
      	        	Vab = 0.5*(ea+ec)-eb;
      	        	Vbc = eb-0.5*(ea+ec);
      	        	Vac = 0;
                    flag = 100;
                    Vsg = Vs-(ea+ec)/2;
                    Vbg = Vsg + eb;
      	        	Vag = Vcg = Vs;
      	        //}
      	  /*      else //pwm freewheeling over
      	        {
      	        	Vab = ea-eb;
      	        	Vac = ea-ec;
      	        	Vbc = eb-ec;
                    Vag = Vs;
      	        	Vsg = Vs - ea;
      	        	Vbg = Vsg + eb;
                    Vcg = Vsg + ec;
      	        }*/
      	}
      }	goto d_end;
    }
   /*stator voltage vector 6*/
   if((S1==1)&&(S6==1))
    { commu_flag = 1;
      if(pwm==1)//pwm on mode
      {
    	if(ic>=delta)  //commutation freewheeling
    	{
    		Vbc = 0;    
    		Vac = Vs;
            Vcg = Vbg = 0;    
    		Vag = Vs;
            Vsg = (Vs-ea-eb-ec)/3;
    	}
    	else   //commutation freewheeling over
    	{
    		Vbc = (-1)*0.5*(2*ec+Vs-ea-eb);
    		Vac = 0.5*(Vs+ea+eb-2*ec);
            Vbg = 0;
            Vag = Vs;
    		Vsg = (Vs-ea-eb)/2;
            Vcg = Vsg+ec;
    	}
    	Vab = Vs;
      }
      else  //pwm off mode
      {
      	if(ic>=delta)  //commutation freewheeling
      	{
      		if((-1)*ib>=delta)//pwm freewheeling
      		{
      			Vab = 0;
      			Vbc = Vs;
      			Vac = Vbc;
                Vag =Vbg = Vs;
                Vcg = 0;
      			Vsg = (2*Vs-ea-ec-eb)/3;
      		}
      		else //pwm freewheeling over
      		{
      			Vbc = 0.5*(Vs+2*eb-ea-ec);
      			Vab = 0.5*(Vs-2*eb+ea+ec);
      			Vac = Vs;
                Vcg = 0;
      			Vag = Vs;
                Vsg = 0.5*(Vs-ea-ec);
                Vbg = 0.5*(Vs+2*eb-ea-ec);
      		}
      	}
      	
      	else //commutation freewheeling over
      	{
      	  /*      if((-1)*ib>=delta)  //pwm freewheeling
      	        {*/
      	        	Vbc = 0.5*(ea+eb)-ec;
      	        	Vac = Vbc;
      	        	Vab = 0;
                    Vag = Vbg = Vs;
      	        	Vsg = (2*Vs-ea-eb)/2;
      	        	Vcg = Vsg+ec;
      	   /*     }
      	        else //pwm freewheeling over
      	        {
      	        	Vab = ea-eb;
      	        	Vac = ea-ec;
      	        	Vbc = eb-ec;
                    Vag = Vs;
      	        	Vsg = Vs-ea;
      	        	Vbg = Vsg+eb;
                    Vcg = Vsg+ec;
      	        }*/
      	}
      }	goto d_end;
    }
    /*end of line to line voltage determination*/
   d_end:
   VAB = Vab;
   VAC = Vac;
   VBC = Vbc;
   /*system state-space function*/
   dx[0]=(Vab-R[0]*x[0]-(ea-eb))/(L[0]-M[0]);  //iab
   dx[1]=(Vac-R[0]*x[1]-(ea-ec))/(L[0]-M[0]);  //iac
   dx[2]=(Vbc-R[0]*x[2]-(eb-ec))/(L[0]-M[0]);  //ibc
   dx[3]=P[0]*(y0[0]-Tl)/J[0];  //electrical speed
   dx[4]=x[3];//rotor electrical angle
}
 
 
 
/* Function: mdlTerminate =====================================================
 * Abstract:
 *    No termination needed, but we are required to have this routine.
 */
static void mdlTerminate(SimStruct *S)
{
    
}

#ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */
#include "simulink.c"      /* MEX-file interface mechanism */
#else
#include "cg_sfun.h"       /* Code generation registration function */
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -