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

📄 fix_dsp.c

📁 基于c的电动机保护程序
💻 C
字号:
#include <math.h>
#include <string.h>
#include "Fix_DSP.h"
#include "MOTOType.h"
//#include "bspGarfield/inc/hardware_reg.h"
#include "Applications/inlcudes/hardware_reg.h"





int readIndex = READ_INDEX_INCREASE;
int writeIndex = 0;
float SinTable[FFT_SIZE/2], sin_b[FFT_SIZE], cos_b[FFT_SIZE], sin_b_5[FFT_SIZE], cos_b_5[FFT_SIZE];
Data_In	datalist[DATA_CALCULATE_SIZE];
//struct _DATA_AD2DSP DATA_CALCULATE[DATA_CALCULATE_SIZE];/*存采样后的值*/
//TSampleInputs DATA_DSP2CPU;

//#define	PER_TEST

#ifdef PER_TEST
float cap1[100];
float cap2[100];
float cap3[100];
int	  cap_i = 0;
float sum1 = 0, sum2=0, sum3 = 0,avg1 = 0,avg2,avg3;
#endif

void  InitCalculate (void)
{
        
        
        
        
        int i;
        float theta = 2 * PI / FFT_SIZE;
		int quartsize = FFT_SIZE / 4;

        for (i=0; i<quartsize; i++)                     /* fill sin table in memory */
        { 
                /*SinTable[1 + (2 * i)] = sin(i * theta) * FIX_POINT + 0.5;
                SinTable[2 * i] = cos(i * theta) * FIX_POINT + 0.5;*/
                SinTable[1 + (2 * i)] = sin(i * theta);
                SinTable[2 * i] = cos(i * theta);
        }

        for (i=0; i<FFT_SIZE; i++)
        {
              /*  sin_b[i] = sin(i * theta) * FIX_POINT + 0.5;
                cos_b[i] = cos(i * theta) * FIX_POINT + 0.5;
                sin_b_5[i] = sin(i * theta * 5) * FIX_POINT + 0.5;
                cos_b_5[i] = cos(i * theta * 5) * FIX_POINT + 0.5; */
                sin_b[i] = sin(i * theta);
                cos_b[i] = cos(i * theta);
                sin_b_5[i] = sin(i * theta * 5);
                cos_b_5[i] = cos(i * theta * 5);
                
        }
        //memset(DATA_CALCULATE, 1, sizeof(DATA_CALCULATE));	
}  



float yxjtest[100];
float yxjtest1[100];
float yxjtest2[100];
float yxjtest3[100];
float yxjtest4[100];
float yxjtest5[100];
int  yxjtestcal = 0;



int diandu_int = 0;
int diandu_float_to_int = 0;

void  CALCULATE (void)                                  //Ua,Ia需要5次谐波的采用FFT,其它简化
{                   
       
        /*************************电度******************************/
	
	static double  power_total= 0;
	float power1 = 0;
	float power2 = 0;
	float power3 = 0;
	static double diandu = 0 ;
	
	static float diandu_float = 0;
	static int diandu_flag = 0;
	static long power_temp = 0;
	/*--------------------------------------------------------*/
	
        register int i, index;
        register float *tempAdd;
        register float tempA;
        register float tempB;
        register float tempC,tempD,tempE,tempF;
        
        register float tempSin;
        register float tempCos;

	  	float pOut[FFT_SIZE*2];


//        DATA_CALCULATE = DATA_CALCULATE_ReadAddress;

        /* 其他值简化计算 */
        tempAdd= pOut;                                  /* 代替原pOut清0 */ 
        for(i = 0; i < FFT_SIZE; i++)
        {
                *tempAdd = 0;
                tempAdd++;
        }
//      for(i=0;i<64;i++) pOut[i] = 0;

        for(i=0; i<FFT_SIZE; i++)
        {
                index = i + readIndex;
                if(index >= DATA_CALCULATE_SIZE) index -= DATA_CALCULATE_SIZE;
                
                tempSin = sin_b[i];
                tempCos = cos_b[i];
               	tempAdd = &datalist[index].IA;
        
                
#if 1               
                pOut[0] += FIX_MUL((*(tempAdd + IA_Offset)), tempSin, Q11);          /* IA */
                pOut[1] += FIX_MUL((*(tempAdd + IA_Offset)), tempCos, Q11);          /* IA */
                pOut[2] += FIX_MUL((*(tempAdd + IB_Offset)), tempSin, Q11);         /* IB */
                pOut[3] += FIX_MUL((*(tempAdd + IB_Offset)), tempCos, Q11);         /* IB */
                pOut[4] += FIX_MUL((*(tempAdd + IC_Offset)), tempSin, Q11);         /* IC */
                pOut[5] += FIX_MUL((*(tempAdd + IC_Offset)), tempCos, Q11);         /* IC */
                pOut[6] += FIX_MUL((*(tempAdd + I0_Offset)), tempSin, Q11);         /* I0 */
                pOut[7] += FIX_MUL((*(tempAdd + I0_Offset)), tempCos, Q11);         /* I0 */
                pOut[8] += FIX_MUL((*(tempAdd + Ua_Offset)), tempSin, Q11);         /* Ua */
                pOut[9] += FIX_MUL((*(tempAdd + Ua_Offset)), tempCos, Q11);         /* Ua */
                pOut[10] += FIX_MUL((*(tempAdd + Ub_Offset)), tempSin, Q11);          /* Ub */
                pOut[11] += FIX_MUL((*(tempAdd + Ub_Offset)), tempCos, Q11);          /* Ub */
                pOut[12] += FIX_MUL((*(tempAdd + Uc_Offset)), tempSin, Q11);          /* Uc */
                pOut[13] += FIX_MUL((*(tempAdd + Uc_Offset)), tempCos, Q11);          /* Uc */     
#endif
        }
        
        *( JDInputsAdd+off_IA_Real) = tempA = pOut[0];
        *( JDInputsAdd+off_IA_Imag) = tempB = pOut[1];
        //cap[cap_i%100] = *( JDInputsAdd+off_IA) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
        *( JDInputsAdd+off_IA) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
       
        linerAdjust(IA_linerAdjust, *( JDInputsAdd+off_IA));
      /*  if ((*( JDInputsAdd+off_IA)>30.5)&& (*( JDInputsAdd+off_IA)<38.0))
        {
        	 linerAdjust(1.063, *( JDInputsAdd+off_IA));
        }
        else if (*( JDInputsAdd+off_IA) >38.1)
        {
        	  linerAdjust(1.13, *( JDInputsAdd+off_IA));
        }*/
        *( JDInputsAdd+off_IA_Phase) = atan(tempB / tempA);
       
       
       
       
        phaseConvert(tempA, tempB, *( JDInputsAdd+off_IA_Phase));                                
     
     
        
        
        
        
        
        *( JDInputsAdd+off_IB_Real) = tempA = pOut[2];
        *( JDInputsAdd+off_IB_Imag) = tempB = pOut[3];
        *( JDInputsAdd+off_IB) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
       linerAdjust(IB_linerAdjust, *( JDInputsAdd+off_IB));
        /*if ((*( JDInputsAdd+off_IB)>30.5)&& (*( JDInputsAdd+off_IB)<38.0))
        {
        	 linerAdjust(1.063, *( JDInputsAdd+off_IB));
        }
        else if (*( JDInputsAdd+off_IB) >38.1)
        {
        	  linerAdjust(1.13, *( JDInputsAdd+off_IB));
        }*/
        
        *( JDInputsAdd+off_IB_Phase) = atan(tempB / tempA);
       phaseConvert(tempA, tempB, *( JDInputsAdd+off_IB_Phase));

        
        *( JDInputsAdd+off_IC_Real) = tempA = pOut[4];
        *( JDInputsAdd+off_IC_Imag )= tempB = pOut[5];
        *( JDInputsAdd+off_IC) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
       linerAdjust(IC_linerAdjust, *( JDInputsAdd+off_IC));
        /*if ((*( JDInputsAdd+off_IC)>30.5)&& (*( JDInputsAdd+off_IC)<38.0))
        {
        	 linerAdjust(1.063, *( JDInputsAdd+off_IC));
        }
        else if (*( JDInputsAdd+off_IC) >38.1)
        {
        	  linerAdjust(1.13, *( JDInputsAdd+off_IC));
        }*/
        *( JDInputsAdd+off_IC_Phase) = atan(tempB / tempA);
        phaseConvert(tempA, tempB, *( JDInputsAdd+off_IC_Phase));
        
         *( JDInputsAdd+off_I0_Real) = tempA = pOut[6];
        *( JDInputsAdd+off_I0_Imag )= tempB = pOut[7];
        *( JDInputsAdd+off_I0) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
        linerAdjust(I0_linerAdjust, *( JDInputsAdd+off_I0));
      
        *( JDInputsAdd+off_UA_Real) = tempA = pOut[8];
        *( JDInputsAdd+off_UA_Imag) = tempB = pOut[9];
        *( JDInputsAdd+off_UA) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE ;
        #ifdef temppt
        linerAdjust(285, *( JDInputsAdd+off_UA));
        #else
       if (*(JDInputsAdd+off_UA) < 0.7458271)
        {
        	linerAdjust(UA_linerAdjust_I, *( JDInputsAdd+off_UA));
        	//linerAdjust(10.3448275862, *( JDInputsAdd+off_UA));
        }
        else
        {
        	linerAdjust(UA_linerAdjust_II, *( JDInputsAdd+off_UA));
        }
        #endif
        
        
        *( JDInputsAdd+off_UA_Phase) = atan(tempB / tempA);
        phaseConvert(tempA, tempB, *( JDInputsAdd+off_UA_Phase));
               
        *( JDInputsAdd+off_UB_Real) = tempA = pOut[10];
        *( JDInputsAdd+off_UB_Imag) = tempB = pOut[11];
        *( JDInputsAdd+off_UB )= (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
         #ifdef temppt
        linerAdjust(287.3, *( JDInputsAdd+off_UB));
        #else
        if (*(JDInputsAdd+off_UB) < 0.7458271)
        {
        	linerAdjust(UB_linerAdjust_I, *( JDInputsAdd+off_UB));
        }
        else
        {
        	linerAdjust(UB_linerAdjust_II, *( JDInputsAdd+off_UB));
        }
        #endif
        *( JDInputsAdd+off_UB_Phase) = atan(tempB / tempA);
        phaseConvert(tempA, tempB, *( JDInputsAdd+off_UB_Phase));
        
       
        *( JDInputsAdd+off_UC_Real) = tempA = pOut[12];
        *( JDInputsAdd+off_UC_Imag )= tempB = pOut[13];
        *( JDInputsAdd+off_UC) = (sqrt(tempA * tempA + tempB * tempB)) / 10.0;  
       #ifdef temppt
        linerAdjust(289, *( JDInputsAdd+off_UC));
        #else
        if (*(JDInputsAdd+off_UC) < 0.7458271)
        {
        	linerAdjust(UC_linerAdjust_I, *( JDInputsAdd+off_UC));
        }
        else
        {
        	linerAdjust(UC_linerAdjust_II, *( JDInputsAdd+off_UC));
        }
        #endif
        *( JDInputsAdd+off_UC_Phase) = atan(tempB / tempA);
        phaseConvert(tempA, tempB, *( JDInputsAdd+off_UC_Phase));
        
        tempC = (pOut[5] - pOut[3])*0.866025404;
        tempD =  (pOut[2] - pOut[4])*0.866025404;
        tempE = (pOut[2] + pOut[4])*0.5 ;   //B c 实部
        tempF = (pOut[3] + pOut[5])*0.5;   //B C 虚部
       
       *( JDInputsAdd+off_I1_Real) = tempA = (pOut[0] - tempE + tempC)*0.33333333;
        *( JDInputsAdd+off_I1_Imag )= tempB = (pOut[1]- tempF + tempD)*0.33333333;
        *( JDInputsAdd+off_I1) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
        linerAdjust(I1_linerAdjust, *( JDInputsAdd+off_I1));
       
        *( JDInputsAdd+off_I2_Real) = tempA =( pOut[0] - tempE - tempC)*0.33333333;
        *( JDInputsAdd+off_I2_Imag )= tempB = (pOut[1]- tempF - tempD)*0.33333333;
        *( JDInputsAdd+off_I2) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE; 
   	  linerAdjust(I2_linerAdjust, *( JDInputsAdd+off_I2));
     
   	#ifdef PER_TEST 
        {/*
        	if( (*( JDInputsAdd+off_IA_Phase) - *( JDInputsAdd+off_IC_Phase)  )  >  0.00000001)
        	{
        		sum +=cap[cap_i%100] =  *( JDInputsAdd+off_IA_Phase) - *( JDInputsAdd+off_IC_Phase) ; 
        		avg = sum / (cap_i+1);
        		cap_i++;
        	}
        	else
        	{
        		sum +=cap[cap_i%100] =  *( JDInputsAdd+off_IA_Phase) - *( JDInputsAdd+off_IC_Phase)+2*PI ; 
        		avg = sum / (cap_i+1);
        		cap_i++;
        	}
        	  */
        sum1 +=cap1[cap_i%100] =  *( JDInputsAdd+off_UA)  ; 
        avg1 = sum1 / (cap_i+1);
        sum2 +=cap2[cap_i%100] =  *( JDInputsAdd+off_UB)  ; 
        avg2= sum2 / (cap_i+1);
        sum3 +=cap3[cap_i%100] =  *( JDInputsAdd+off_UC)  ; 
        avg3 = sum3 / (cap_i+1);
        		cap_i++;
        }
   	#endif
   	
   	 *( JDInputsAdd+off_IA) *= SystemSetting.CT;
   	 *( JDInputsAdd+off_IB) *= SystemSetting.CT;
   	 *( JDInputsAdd+off_IC) *= SystemSetting.CT;
   	 *( JDInputsAdd+off_I1) *= SystemSetting.CT;
   	 *( JDInputsAdd+off_I2) *= SystemSetting.CT;
   	 
        readIndex += READ_INDEX_INCREASE;  
      
    /******************电流相位貌似超前于电压,需要处理*************/  
      if(*( JDInputsAdd+off_IA_Phase) > PI)
      {
      	*( JDInputsAdd+off_IA_Phase) -= PI; 
      }
      else
      {
      	*( JDInputsAdd+off_IA_Phase) += PI;
      }
      
    
      if(*( JDInputsAdd+off_IB_Phase) > PI)
      {
      	*( JDInputsAdd+off_IB_Phase) -= PI; 
      }
      else
      {
      	*( JDInputsAdd+off_IB_Phase) += PI;
      }
     
      if(*( JDInputsAdd+off_IC_Phase) > PI)
      {
      	*( JDInputsAdd+off_IC_Phase) -= PI; 
      }
      else
      {
      	*( JDInputsAdd+off_IC_Phase) += PI;
      }
      
      
    
    
    /*************************功率*******************/	
	
	
	//Pa_temp += (data_in.IA-data_in.VREF) *( data_in.Ua - data_in.VREF);	
	
	

/*-----------------------------------------------------------*/
	
	
	
	
	
	//*( JDInputsAdd+off_IA)=10;
	//*( JDInputsAdd+off_UA)= 6000;
	/*
	*( JDInputsAdd+off_IB)=10;
	*( JDInputsAdd+off_UB)= 2200;
	*( JDInputsAdd+off_IC)=100;
	*( JDInputsAdd+off_UC)= 1200;
	*/
	
	
	if(diandu_flag == 0)
	{	
		
		//power_total += (*( JDInputsAdd+off_IA)**( JDInputsAdd+off_UA)+ *( JDInputsAdd+off_IB)**( JDInputsAdd+off_UB)+ *( JDInputsAdd+off_IC)**( JDInputsAdd+off_UC))*0.4;
	
		
		
		if( (power1 = *( JDInputsAdd+off_IA)**( JDInputsAdd+off_UA))<0)
		{
		 	power1 = 0;
		}
		
		if( (power2 = *( JDInputsAdd+off_IB)**( JDInputsAdd+off_UB))<0)
		{
		 	power2 = 0;
		}
		
		if( (power2 = *( JDInputsAdd+off_IC)**( JDInputsAdd+off_UC))<0)
		{
		 	power2 = 0;
		}
		power_total += (power1+power2+power3)*0.4;
		
		
	}
	
	diandu_flag++;
	
	diandu = power_total*0.001;
	diandu *= 0.001;
	diandu*= 0.2777777778;
	
	diandu_flag %= 100;
	
	diandu_int = diandu;
	diandu_float = diandu-diandu_int;
	diandu_float_to_int = diandu_float*10;
	
    
    
    
    
    
     // yxjtest[1] =  cos(3.1415926/3);
       yxjtest[yxjtestcal] =  *( JDInputsAdd+off_UA_Phase)*57.29577951 ;
      NOP();
      
      NOP();
      yxjtest1[yxjtestcal] =  *( JDInputsAdd+off_UB_Phase)*57.29577951 ;
      
      yxjtest2[yxjtestcal] = *( JDInputsAdd+off_UC_Phase)*57.29577951 ;
      yxjtest3[yxjtestcal] = *( JDInputsAdd+off_IA_Phase)*57.29577951 ;
      yxjtest4[yxjtestcal] = *( JDInputsAdd+off_IB_Phase)*57.29577951 ;
      yxjtest5[yxjtestcal] = *( JDInputsAdd+off_IC_Phase)*57.29577951 ;
     
      
      
      yxjtest2[yxjtestcal] = cos( *( JDInputsAdd+off_UA_Phase) - *( JDInputsAdd+off_IA_Phase)) ;
     
      NOP();
      yxjtestcal++;
      NOP();
      yxjtestcal %= 100;
       
        
     
       
        
}

⌨️ 快捷键说明

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