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

📄 main.c

📁 实验室做的SVC无功补偿项目
💻 C
字号:

#include "DSP28_Device.h"
#include "fft.h"
#include "math.h"

#define N   128
#pragma DATA_SECTION(ipcb, "FFTipcb");
#pragma DATA_SECTION(mag, "FFTmag");
CFFT32  fft=CFFT32_128P_DEFAULTS; 
long ipcb[2*N];
long mag[N];

Uint16 m=0,n=0,trigflag=0;
 
int i=0,k=0,zhy=0,countad=0,nzh=0,bb=0; 
int temp2,temp3,temp4;
double P=0,Q=0,pf=0,pf1=0,f=50,q=0,Qtemp1=0,S=0,Qtemp2=0;
double t=0,trigarf=0,oldtrig=0,newtrig=0;
double Va[256],Ia[256],va=0,ia=0,Vac[256],Iac[256];
double arf=0,temp=0,detQ=0,arfva=0,arfia=0;
const double tcrq[46]={-5147.6387,-4918.9476,-4690.8134,-4463.7902,-4238.4268,\
-4015.2637,-3794.8308,-3577.6449,-3364.2067,-3154.9988,-2950.483,-2751.0985,\
-2557.2593,-2369.3525,-2187.7363,-2012.7381,-1844.6533,-1683.7434,-1530.235,\
-1384.3187,-1246.1481,-1115.8391,-993.4692,-879.0772,-772.6632,-674.1883,\
-583.5749,-500.7073,-425.4317,-357.5577,-296.8586,-243.0728,-195.9051,-155.0279,\
-120.0832,-90.6837,-66.4156,-46.8396,-31.4938,-19.8958,-11.5447,-5.9239,-2.5034,\
-0.7427,-0.0929,0};
const double Qd=0,qd=0;//qd的值需根据负载变化计算确定,表示是否需要补偿的尺度;Qd表示连续两次计算的无功差值,决定是否需要重新计算触发角;
double zero_kCAP3,zero_kCAP4,zero_kCAP6;
double yy=0;
double arfcount=0,quotient=0;
void counttrig()//角度计算
{
   pf1=0.8;//用户指定的功率因数
   detQ=0;//实验时设定值
   detQ=Q;//需要补偿的无功量
   for(i=0;i<=46;i++)
   {
   if (detQ>tcrq[i])
   {
   temp=tcrq[i];
   t=i;
   }
   else
   {
   temp=tcrq[i-1];
   t=i-1;
   break;
   }
   }
   trigarf=(90+2*t);
   
   trigflag=1;
}


void FFT(double b[])
{
  fft.ipcbptr=ipcb;
  fft.magptr=mag;  
  fft.init(&fft);  
  for(i=0;i<128;i++)
    {
  ipcb[i]=(long)(b[i])<<12;
    }
  CFFT32_brev1(ipcb,ipcb,N);
  fft.izero(&fft); 
  fft.calc(&fft);
  fft.mag(&fft); 
  
}
                
double countyouxiaozhi(double a[])
{
    temp=0;
    for(i=0;i<256;i++)
    {
    temp=a[i]*a[i]+temp;
    }
    temp=temp/256;
    temp=sqrt(temp);
    return temp;
    }

interrupt void ad(void);
interrupt void CAPINT3(void);
interrupt void CAPINT4(void);
interrupt void CAPINT6(void);
interrupt void T2CINT(void);
interrupt void T3CINT(void);
interrupt void T4CINT(void);


void main(void)
{
   
	InitSysCtrl();

	DINT;
	IER = 0x0000;
	IFR = 0x0000;

	InitPieCtrl();


	InitPieVectTable();	
	EvaRegs.EVAIFRC.bit.CAP3INT=1;
    EvaRegs.EVAIMRC.bit.CAP3INT=1;
    EvbRegs.EVBIFRC.bit.CAP4INT=1;
    EvbRegs.EVBIMRC.bit.CAP4INT=1;
    EvbRegs.EVBIFRC.bit.CAP6INT=1;
    EvbRegs.EVBIMRC.bit.CAP6INT=1;
    EvaRegs.EVAIFRB.bit.T2CINT= 1;
    EvaRegs.EVAIMRB.bit.T2CINT= 1;
    EvbRegs.EVBIFRA.bit.T3CINT= 1;
    EvbRegs.EVBIMRA.bit.T3CINT= 1;
    EvbRegs.EVBIFRB.bit.T4CINT= 1;
    EvbRegs.EVBIMRB.bit.T4CINT= 1;
    
    
    PieCtrl.PIEIER3.bit.INTx2=1;
    PieCtrl.PIEIER3.bit.INTx7=1;
    PieCtrl.PIEIER4.bit.INTx5=1;
    PieCtrl.PIEIER5.bit.INTx2=1;
    PieCtrl.PIEIER5.bit.INTx5=1;
    PieCtrl.PIEIER5.bit.INTx6=1;
    
	EALLOW;	// This is needed to write to EALLOW protected registers
	PieVectTable.ADCINT=&ad;
	PieVectTable.CAPINT6=&CAPINT6;
    PieVectTable.CAPINT3=&CAPINT3;
    PieVectTable.CAPINT4=&CAPINT4;
    PieVectTable.T2CINT  = &T2CINT;
    PieVectTable.T2CINT  = &T3CINT;
    PieVectTable.T2CINT  = &T4CINT;
    
	EDIS;   // This is needed to disable write to EALLOW protected registers
	 
    InitGpio();
    InitEv();
    InitAdc();
     EvaRegs.COMCONA.bit.FCOMPOE=1;//使能PWM1-6
     
    //PieCtrl.PIEIER3.bit.INTx7=0;
    IER|=(M_INT1|M_INT3|M_INT4|M_INT5); //cpu级中断允许
	//KickDog();
    // Enable global Interrupts and higher priority real-time debug events:
	
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
   
 	
	while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
		{			

			AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;

		}
		
  

    for(;;)
    {  
    for(n=0;n<=200;n++)
      {
      for(m=0;m<=30000;m++)
      {}
      }   
    if (countad>=256)
    {
    countad=0;
    for(i=0;i<=255;i++)
    {
    Vac[i]=Va[i];
    Iac[i]=Ia[i];
    }
    va=countyouxiaozhi(Vac);
    ia=countyouxiaozhi(Iac);
    P=0;
    for(i=0;i<256;i++)
    {
    P=Vac[i]*Iac[i]+P;
    }
    P=P/256;
    S=va*ia;
    pf=P/S;
    Q=sqrt(S*S-P*P);
    FFT(Vac);
   arfva=atan2(ipcb[2],ipcb[3])*180/3.1415926;
   if(arfva<0)
   arfva=360+arfva;
   FFT(Iac);          
   arfia=atan2(ipcb[2],ipcb[3])*180/3.1415926;
   if(arfia<0)
   arfia=360+arfia;
   arf=arfia-arfva;
   if(arf<-180)
   arf=arf+360;
   if(arf>180)
   arf=arf-360;
   if(arf>0)
  { Q=Q;
   pf=pf;}
   else
   {Q=0-Q;
   pf=0-pf;}
   }
   //if(abs(Q-Qtemp1)>3000)
   //{trigflag=0;
   //Qtemp1=Q;}
   
    if(Q<0&trigflag==1)
    {
    trigarf-=1;
        }
   if(Q>0&trigflag==1)
    {
    if(0.94<pf<=0.97)
    {trigarf+=0.5;
     }
     if(0<pf<=0.94)
     {trigarf+=2;
     }
  
       }
    if(trigflag==0)
   {
    counttrig();
        }
    
    if(trigarf<=90)
    trigarf=90;
    yy=4687/180.0*trigarf;
    arfcount=(long)yy;
    
     
         
    
     }

}

interrupt void CAPINT3(void)
{
   nzh+=1;
   EvaRegs.T2CON.bit.TENABLE=1;//使用定时器操作
    EvaRegs.T2CNT=0;
    EvaRegs.T2CMPR = arfcount;
    
  
    EvaRegs.CAPFIFOA.bit.CAP3FIFO=1;
    EvaRegs.EVAIFRC.bit.CAP3INT=1;
    PieCtrl.PIEACK.all=0x0004;
    EINT;                       //开全局中断
    return;
}

interrupt void T2CINT(void)
{  
   temp2=EvaRegs.T2CNT;
   bb+=2;
   
   EINT;
   
   if(GpioDataRegs.GPADAT.bit.GPIOA6==0)
    {
     
     GpioDataRegs.GPADAT.bit.GPIOA0= 0;//PWM1输出低
     while(EvaRegs.T2CNT<temp+5);
     GpioDataRegs.GPADAT.bit.GPIOA0= 1;//PWM1输出高
    }
   else
    {
     GpioDataRegs.GPADAT.bit.GPIOA1= 0;//PWM2输出低
     while(EvaRegs.T2CNT<temp+5);
     GpioDataRegs.GPADAT.bit.GPIOA1= 1;//PWM2输出高
     
    }
    EvaRegs.T2CON.bit.TENABLE=0;
    //EvaRegs.T1CMPR=0xFFFF;
    EvaRegs.EVAIMRB.bit.T2CINT=1;
    EvaRegs.EVAIFRB.bit.T2CINT=1;
    PieCtrl.PIEACK.all=0x0004;
    
    EINT; 
    return;
     
}

interrupt void CAPINT4(void)
{
   nzh+=1;
   EvbRegs.T3CON.bit.TENABLE=1;//使用定时器操作
    EvbRegs.T3CNT=0;
    EvbRegs.T3CMPR = arfcount;
    
  
    EvbRegs.CAPFIFOB.bit.CAP4FIFO=1;
    EvbRegs.EVBIFRC.bit.CAP4INT=1;
    PieCtrl.PIEACK.all=0x0010;
    EINT;                       //开全局中断
    return;
}

interrupt void T3CINT(void)
{  
   temp3=EvbRegs.T3CNT;
   
   EINT;  
   if(GpioDataRegs.GPADAT.bit.GPIOA7==0)
    {
     
     GpioDataRegs.GPADAT.bit.GPIOA2= 0;//PWM1输出低
     while(EvbRegs.T3CNT<temp3+5);
     GpioDataRegs.GPADAT.bit.GPIOA2= 1;//PWM1输出高
    }
   else
    {
     GpioDataRegs.GPADAT.bit.GPIOA3= 0;//PWM2输出低
     while(EvbRegs.T3CNT<temp3+5);
     GpioDataRegs.GPADAT.bit.GPIOA3= 1;//PWM2输出高
     
    }
    EvbRegs.T3CON.bit.TENABLE=0;
    //EvaRegs.T1CMPR=0xFFFF;
    EvbRegs.EVBIMRA.bit.T3CINT=1;
    EvbRegs.EVBIFRA.bit.T3CINT=1;
    PieCtrl.PIEACK.all=0x0008;
    
    EINT; 
    return;
     
}
interrupt void CAPINT6(void)
{

   EvbRegs.T4CON.bit.TENABLE=1;//使用定时器操作
    EvbRegs.T4CNT=0;
    EvbRegs.T4CMPR = arfcount;
    
  
    EvbRegs.CAPFIFOB.bit.CAP6FIFO=1;
    EvbRegs.EVBIFRC.bit.CAP6INT=1;
    PieCtrl.PIEACK.all=0x0010;
    EINT;                       //开全局中断
    return;
}

interrupt void T4CINT(void)
{  
   temp4=EvbRegs.T4CNT;

   
   EINT;
   
   if(GpioDataRegs.GPBDAT.bit.GPIOB6==0)
    {
     
     GpioDataRegs.GPADAT.bit.GPIOA4= 0;//PWM1输出低
     while(EvbRegs.T4CNT<temp4+5);
     GpioDataRegs.GPADAT.bit.GPIOA4= 1;//PWM1输出高
    }
   else
    {
     GpioDataRegs.GPADAT.bit.GPIOA5= 0;//PWM2输出低
     while(EvbRegs.T4CNT<temp4+5);
     GpioDataRegs.GPADAT.bit.GPIOA5= 1;//PWM2输出高
     
    }
    EvbRegs.T4CON.bit.TENABLE=0;
    //EvaRegs.T1CMPR=0xFFFF;
    EvbRegs.EVBIMRB.bit.T4CINT=1;
    EvbRegs.EVBIFRB.bit.T4CINT=1;
    PieCtrl.PIEACK.all=0x0010;
    
    EINT; 
    return;
     
}

interrupt void ad(void)
{
	//ad采样子程序
    EINT;

	IFR=0x0000;
//	PieCtrl.PIEIFR1.all = 0;
	PieCtrl.PIEACK.all=5;
	
	countad++;
	
		
	Va[k]=(AdcRegs.RESULT0>>4)*3.0*401.0457/4095.00-569.4849;
	Ia[k]=(AdcRegs.RESULT1>>4)*3.0*21.026/4095.00-29.4364;
	//Ia[k]=(AdcRegs.RESULT1>>4);
	k++;
	
	
	if(k<256)
	{
	AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
	AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
	}
	else
	{
	k=0;
	PieCtrl.PIEIER3.bit.INTx7=1;
	AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
	AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
	}
	
	
	
		
	
}

⌨️ 快捷键说明

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