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

📄 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;
int SinTable[FFT_SIZE/2], sin_b[FFT_SIZE], cos_b[FFT_SIZE], sin_b_5[FFT_SIZE], cos_b_5[FFT_SIZE];

unsigned long ChannelA;
unsigned long ChannelB;
unsigned long ChannelC;
unsigned long ChannelD;/* 存AD采样的四个通道值     */

struct _DATA_AD2DSP DATA_CALCULATE[DATA_CALCULATE_SIZE];/*存采样后的值*/
TSampleInputs DATA_DSP2CPU;


#ifdef PER_TEST
int cap[100];
int cap_i = 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 int *tempAdd;
        register float tempA;
        register float tempB;
        register float tempC,tempD,tempE,tempF;
        
        register float tempSin;
        register float tempCos;

	  int pOut[FFT_SIZE*2];
		
		ReadAD( ) ;

//        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 = &DATA_CALCULATE[index].Ua;
        
                
               
                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 */
              
               
               
               
        }
        
        
        
        
        
        *( JDInputsAdd+off_IA_Real) = tempA = pOut[0];
        *( JDInputsAdd+off_IA_Imag) = tempB = pOut[1];
        *( JDInputsAdd+off_IA) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
        linerAdjust(0.03384524, 0.7749741508, 21.8085234322, -0.0021816135, *( 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(0.0163960189, 0.7047940106, 21.64926757, -0.00105438392, *( 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(0.0617891915, 0.7223773071, 21.9106379364, -0.0038924769, *( 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;
      
      
        *( 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(0.0045405839, -0.1000368677, 23.2626541159, 0.0193734706, *( 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(-0.0084763785, 0.0264693961, 22.7935839842, -0.1200517272, *( 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)) *D_HALF_SIZE;
        linerAdjust(0.0125296299, -0.1629001930, 23.4579313316, 0.1578952797, *( 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 ;
         tempF = (pOut[3] + pOut[5])*0.5;
       *( JDInputsAdd+off_I1_Real) = tempA = pOut[0] - tempE + tempC;
        *( JDInputsAdd+off_I1_Imag )= tempB = pOut[1]- tempF + tempD;
        *( JDInputsAdd+off_I1) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
       
        *( JDInputsAdd+off_I2_Real) = tempA = pOut[0] - tempE - tempC;
        *( JDInputsAdd+off_I2_Imag )= tempB = pOut[1]- tempF - tempD;
        *( JDInputsAdd+off_I2) = (sqrt(tempA * tempA + tempB * tempB)) *D_HALF_SIZE;
       
       
    
}



BOOL JudgeDATA( void )                                   //读写指针判断是否丢数
{ 
	
        if( (readIndex - writeIndex > READ_INDEX_INCREASE) \
       	 || ((readIndex - writeIndex) <=  (int)(READ_INDEX_INCREASE - FFT_SIZE))) /* 读指针领先写指针超过3或读指针回零并加过而写指针在末端则等待*/ 
        {					        
        	   if (readIndex >= DATA_CALCULATE_SIZE)      
                {
                    readIndex = readIndex - DATA_CALCULATE_SIZE;
                }                                                           
                return FALSE;
        }
        /* 读指针领先写指针则返回1 */     
        if (readIndex - writeIndex == READ_INDEX_INCREASE)
        {
                /*  如果写指针到MidAddress,则减66将其复位 */ 
                if (readIndex >= DATA_CALCULATE_SIZE)      
                {
                    readIndex = readIndex - DATA_CALCULATE_SIZE;
                }
                return (TRUE);
        }
        else
        {    
                /* 读指针领先写指针少于READ_INDEX_INCREASE则系统出错,返回0 */
                if (readIndex - writeIndex < READ_INDEX_INCREASE)
                {
                	     readIndex = writeIndex + (READ_INDEX_INCREASE<<1);
                        return (FALSE);
                }
        }
}

void  ReadAD( void )                                   /* 根据BUSY进入中断       */                                                
{
	
	// *(RP)PORTE_DATA |= 0x80 ;       //pull high
          Read7865( );                                            /* 4路AD数据读出到原始数组*/
         
             //*(RP)PORTE_DATA |= 0x80 ;       //pull high
                  DATA_AD2DSP.U0 = CONVERT(ChannelA) ;
                  DATA_AD2DSP.I0 = CONVERT(ChannelB) ;
                  DATA_AD2DSP.Ux = CONVERT(ChannelC) ;
                  DATA_AD2DSP.Ix = CONVERT(ChannelD) ;
                                          /* FSX0/DX0输出10,SEL01    */ 
            
             //*(RP)PORTE_DATA &= ~0x80 ;       //pull low   
                  DATA_AD2DSP.Ia = CONVERT(ChannelA) ;
                  DATA_AD2DSP.Ib = CONVERT(ChannelB) ;
                  DATA_AD2DSP.Ic = CONVERT(ChannelC) ;
                  DATA_AD2DSP.Ubp = CONVERT(ChannelD) ;
              
             
      //  memcpy(&DATA_CALCULATE[writeIndex].Ua, &DATA_AD2DSP, sizeof(DATA_AD2DSP)); /* 采集16通道同步输出     */ 
                  
             /*     if (writeIndex >= DATA_CALCULATE_SIZE)
                  {
                  		writeIndex = (writeIndex + WRITE_INDEX_INCREASE) - DATA_CALCULATE_SIZE;    
                  	}
                  	else
                  	{
                  		writeIndex = (writeIndex + WRITE_INDEX_INCREASE);
                  	}     
             
             
      //   *(RP)PORTE_DATA &= ~0x80 ;       //pull low  */
}





void Read7865( void )                                   /* 根据BUSY进入中断       */
{       
        int i = 0;  
        ChannelA = 1;                          /* 读取VIN1               */
        i=0;
        ChannelB = 3123;                          /* 读取VIN2               */        
        i=0;
        ChannelC = 21;                          /* 读取VIN3               */        
        i=0;
        ChannelD = 32;                          /* 读取VIN4               */        
        i=0;
}

// #if 0
  // float CONVERT(unsigned int input)                                /* 14bitAD转为浮点数      */
 /*{
        if(input & 0x00002000)
        {
                input &= 0x00003fff;
                input = 0x00003fff - input;
                return (0.0 - input*LSB - LSB);
        }
        else
        {
                input &= 0x00003fff;
                return (input*LSB);
        }
}  */




void  TEST (void)                                  //Ua,Ia需要5次谐波的采用FFT,其它简化
{                   
        register int i ;
        
        for(i=0;i<100000;i++);
        }
      

⌨️ 快捷键说明

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