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

📄 svpwm.c

📁 用freescale公司的DSP56F8013芯片实现的PMSM的SVPWM 驱动
💻 C
字号:
#include "Cpu.h"
#include "Events.h"
#include "Svpwm.h"

extern int ualfa;									/* Q6 */
extern int ubeta;									/* Q6 */
extern int tana[180];
extern int thetatemp1;
extern int thetae1;	
extern int sina[180];			
extern int cosa[180];
extern int k1;										/* Q16 */
extern int Vbus;									/* Q6 */
extern int gujun;
extern bool clzloop;

void Svpwm(void)
{
	Frac16 tempf1;
	Frac16 tempf2;
	Frac16 tempf3;
	int quad;
 	int n1;
	int n2;	
	int temp=28378;									/* Q14 represent 1.732 */
	int temp16;
	int temp17;
	long int temp32;	
 	long int temp33;
 	long int temp34;




	tempf2=ubeta;
  	tempf1=ualfa;
  
  if(tempf2>0)										/* 0 to 180 degree */
  {
  	if(tempf1>0)									/* 0 to 90 degree */
  	{
  		if(tempf1>tempf2)							/* 0  to 45 degree */  								
  			quad=1;									/* 45 to 90 degree */
  		else
   			quad=2;
  	} 							
  	else											/* 90 to 180 degree */
   	{
   		tempf1=-tempf1;
  		if(tempf1>tempf2) 										 																		
  			quad=4;									/* 135 to 180 degree */				
  	else
   			quad=3;									/* 90  to 135 degree */
  	} 
  } 
   
  else 												/* 180 to 360 degree */										 
  {
  	tempf2=-tempf2;											
    if(tempf1>0)									/* 270 to 360 degree */
  	{
  		if(tempf1>tempf2)  								
  			quad=8;									/* 315 to 360 degree */				
  		else
   			quad=7;									/* 270 to 360 degree */
  	} 							
  	else
   	{
   		tempf1=-tempf1;								/* 180 to 270 degree */
  		if(tempf1>tempf2)  								
  			quad=5;									/* 180 to 225 degree */				
  		else
   			quad=6;									/* 225 to 270 degree */
  	} 	
  }

/* To calculate the tan(theta) */
  if(tempf1<tempf2)
  tempf3=div_s(tempf1,tempf2);						/* cotangent value */
  
  else
  tempf3=div_s(tempf2,tempf1);						/* tangent value */


  if(tempf3<tana[23])
  n1=0;
  else 
  n1=1;
  
  thetatemp1=0;
  for(thetatemp1=0;thetatemp1<23;thetatemp1++)
  {
  if(tempf3>(tana[22*n1+thetatemp1]))
  n2=thetatemp1;	
  else 
  break;
  }
     
  thetae1=23*n1+n2;									/* calculate the rotor position (0 to 45) */
  switch(quad)
  {
  	case(1):                    		
	{
 		thetae1=thetae1;
	}break;
	case(2):                    		
	{
 		thetae1=90-thetae1;
	}break;
	case(3):                    		
	{
 		thetae1=90+thetae1;
	}break;
	case(4):                    		
	{
 		thetae1=180-thetae1;
	}break;
	case(5):                    		
	{
 		thetae1=180+thetae1;
	}break;
	case(6):                    		
	{
 		thetae1=270-thetae1;
	}break;
	case(7):                    		
	{
 		thetae1=270+thetae1;
	}break;
	case(8):                    		
	{
 		thetae1=360-thetae1;
	}break;
  }
  
  	if((thetae1>=0) && (thetae1<180)) 
  	{
    temp32=(L_mult(ualfa,cosa[thetae1]))>>16;							/* Q6 */
  	temp33=(L_mult(ubeta,sina[thetae1]))>>16;							/* Q6 */  		
  	}

  	
	else
	{
    temp32=-(L_mult(ualfa,cosa[thetae1-180]))>>16;						/* Q6 */
  	temp33=-(L_mult(ubeta,sina[thetae1-180]))>>16;						/* Q6 */								
	}
  	
  	temp16=(int)(temp32+temp33);										/* Q6 */
  	
  	temp34=(L_mult(temp16,temp))>>15;									/* Q6 */
  	temp17=(int)(temp34);
  	
  	k1=div_s(temp17,Vbus);												/* Q15 */
  	if(k1>5380)
  	k1=5380;
}

























⌨️ 快捷键说明

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