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

📄 start.c

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

extern int sina[180];
extern unsigned int sector;	
extern bool updown;	
extern int cnt;	
extern int cnt2spdadj;
extern int ktemp;
extern int ktempmax;
extern int k;				
extern double numf;				
extern double numfmax;
extern double numn;						
extern int num;
static unsigned int numtemp;					/* just for calculate */
extern bool clzloop;
extern bool tabset;
extern int cnt2tabstop;
extern bool tabstop;
extern int table[360];
extern int theta;
extern int Vbus;
extern int ktempchg;
extern int isalfa;														
extern int isbeta;								
extern int isalfae;							
extern int isbetae;	
extern int Ia;			
extern int Ib;	
extern int alfa;
extern int vsalfa;							
extern int vsbeta;
extern int ualfa;								/* Q6 */
extern int ubeta;								/* Q6 */	
extern int esalfa;								/* Q6 alfa axis back EMF */
extern int esbeta;								/* Q6 beta axis back EMF */
extern int zalfa;								/* Q6 alfa axis sliding control */
extern int zbeta;								/* Q6 beta axis sliding control */
extern int a;
extern int gujun;
extern int numtt;
extern int k1;
extern int thetae1;	
extern int aa,ab,ac,ad,e;


void Start(void)
{	
 	int temp16;						
	int temp17;						
	long int temp32;
 	unsigned int t1;							/* time for vector start */
	unsigned int t2;							/* time for vector end */
	unsigned int large;							/* large  pwmvalue */	
	unsigned int middle;						/* middle pwmvalue */
 	unsigned int small;							/* small  pwmvalue */
 	int temp=28378;								/* Q14 represent 1.732 */

/* calculat the length of vector start(t1) and vector end(t2) in each sector */
	temp32=(L_mult(temp,sina[90-numtemp]))>>16;	/* Q14 */
	temp16=(int)temp32-(sina[numtemp]>>1);		/* Q14 */
	temp17=800;
	temp32=(L_mult(temp16,temp17))>>11;			/* Q4 */
	temp16=(int)temp32;							/* Q4 */							
	temp32=(L_mult(temp16,k))>>20;				/* Q16>>21,if Q15>>20  k=temp32=Q0 origin>>19(for k=Q14) */
	t1=(unsigned int)(temp32);
	
	temp32=(L_mult(sina[numtemp],temp17))>>11;	/* Q4 */
	temp16=(int)temp32;							/* Q4 */							
	temp32=(L_mult(temp16,k))>>20;				/* Q16>>21,if Q15>>20 k=Q16 temp32=Q0 origin>>19(for k=Q14) */
	t2=(unsigned int)(temp32);

/* calculate each pwmvalue */
	large=t1+t2;
	if((sector==1) || (sector==3) || (sector==5))
	middle=t2;
	else
	middle=t1;
	small=0;

/* set pwmvalue to each channel according to the sector information */	
	switch(sector)
  		{
		case(1):                    			/* ABC: order from large to small */
			{
			setReg16(PWM_PWMVAL0, large);
			setReg16(PWM_PWMVAL2, middle);
			setReg16(PWM_PWMVAL4, small);
			PWM_Load();
			break;
			}
    	case(2):                    			/* BAC */
			{
			setReg16(PWM_PWMVAL0, middle);
			setReg16(PWM_PWMVAL2, large);
			setReg16(PWM_PWMVAL4, small);
			PWM_Load();
			break;
			}
		case(3):                    			/* BCA */
			{	
			setReg16(PWM_PWMVAL0, small);
			setReg16(PWM_PWMVAL2, large);
			setReg16(PWM_PWMVAL4, middle);
			PWM_Load();	
			break;
			}
   		case(4):                    			/* CBA */
			{
			setReg16(PWM_PWMVAL0, small);
			setReg16(PWM_PWMVAL2, middle);
			setReg16(PWM_PWMVAL4, large);	
			PWM_Load();
			break;
			}
   		case(5):                    			/* CAB */
			{
			setReg16(PWM_PWMVAL0, middle);
			setReg16(PWM_PWMVAL2, small);
			setReg16(PWM_PWMVAL4, large);	
			PWM_Load();
			break;
			}
   		case(6):                    			/* ACB */
			{
			setReg16(PWM_PWMVAL0, large);
			setReg16(PWM_PWMVAL2, small);
			setReg16(PWM_PWMVAL4, middle);
			PWM_Load();	
			break;
			}
  		}

/* change adjust frequency,rotate direction,speed */
  	if(cnt>=cnt2spdadj)
  	{
  	cnt=0;
  	switch(updown)
		{
		case(0):
			{  		
			if(ktemp>-ktempmax)								
			ktemp-=ktempchg;
			if(numf>-numfmax)	
			numf-=0.0028; 					// 0.0014
			break;
			}
		case(1):
			{  		
			if(ktemp<ktempmax)			
			ktemp+=ktempchg;
			if(numf<numfmax)	
			numf+=0.0028; 					// 0.0014
			break;
			}		
		}
	k=ktemp;								// Q15 
	if(ktemp<0)
	k=-ktemp;								// Q15 
  	}

/* change the run status */  	
	cnt++;
	
	if(clzloop==0)
	{
	numn+=numf;

/* set the numn between 0 and 360 */		
	if(numn>=360)	numn-=360;		
	else if(numn<0)	numn+=360;	
	num=(int)(numn);
	}
	else
	{
		k=k1;
		num=thetae1;	
	}
		
/* set the table */
	if((tabset==1) && (tabstop==0))
	{
	table[num]=gujun;
	cnt2tabstop++;	
	}

/* count to stop setting the table */
	if(cnt2tabstop>=360)
	{
	tabstop=1;
	cnt2tabstop=360;	
	}
	
/* determine the sector */									
	if(num<=60)	
	{
		sector=1;	numtemp=(unsigned int)(num);	
	}
    
	else if(num<=120)
	{
		sector=2;	numtemp=(unsigned int)(num)-60;	
	}
	
	else if(num<=180)
	{
		sector=3;	numtemp=(unsigned int)(num)-120;	
	}
	
	else if(num<=240)
	{
		sector=4;	numtemp=(unsigned int)(num)-180;	
	}
	
	else if(num<=300)
	{
		sector=5;	numtemp=(unsigned int)(num)-240;	
	}
	
	else
	{
		sector=6;	numtemp=(unsigned int)(num)-300;	
	}		
}

⌨️ 快捷键说明

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