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

📄 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 cap[100];
float caap;
int	  cap_i = 0;
float sum = 0, avg = 0;
#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));	
}  


void  CALCULATE (void)                                  //Ua,Ia需要5次谐波的采用FFT,其它简化
{                   
       
        
        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(14.46279, *( 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(14.53279, *( 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(14.73351, *( 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(14.53279, *( 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 ;
        //linerAdjust(33.5597933, *( JDInputsAdd+off_UA));
        if (*(JDInputsAdd+off_UA) < 0.7458271)
        {
        	linerAdjust(33.5597933, *( JDInputsAdd+off_UA));
        }
        else
        {
        	linerAdjust(33.6597933, *( JDInputsAdd+off_UA));
        }
        *( 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;
        //linerAdjust(14.53279, *( JDInputsAdd+off_UB));
        if (*(JDInputsAdd+off_UB) < 0.7458271)
        {
        	linerAdjust(33.5597933, *( JDInputsAdd+off_UB);
        }
        else
        {
        	linerAdjust(33.6597933, *( JDInputsAdd+off_UB));
        }
        *( 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;  
        //linerAdjust(14.53279, *( JDInputsAdd+off_UC));
          if (*(JDInputsAdd+off_UC) < 0.7458271)
        {
        	linerAdjust(33.5597933, *( JDInputsAdd+off_UC));
        }
        else
        {
        	linerAdjust(33.6597933, *( JDInputsAdd+off_UC));
        }
        *( 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(14.46279, *( 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(14.46279, *( JDInputsAdd+off_I2));
     
   	#ifdef PER_TEST 
        {
        	
        	sum +=cap[cap_i%100] = *( JDInputsAdd+off_UA);
        	avg = sum / (cap_i+1);
        	cap_i++;
        }
   	#endif
        readIndex += READ_INDEX_INCREASE;  
}

⌨️ 快捷键说明

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