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

📄 dataprocessing.c

📁 在采样的基础上实现数码管显示和利用TI公司的FFT算法进行运算
💻 C
字号:
#include  "2407.h"
#include  "AD.h"
#include "fft.h"
#include "qmath.h"
#include "spwm.h"
#pragma DATA_SECTION(ipcb,"FFTipcb")

int ipcb[TWON*2];
int Magpcb[TWON];
int MagAndPhase[TotalChanel][MaxHamanic*2]; // 幅值和相位
int Valnue[TotalChanel];                     //有效值
FFT128C fft=FFT128C_DEFAULTS;

int DataInit()
{
   int i,*pData=MagAndPhase[0];
   for(i=0;i<TotalChanel*MaxHamanic*2;i++)
      *(pData++)=0;
      
   pData=AD_DATA_Y;
   for(i=0;i<N;i++)
      *(pData++)=qsinlt(i*1024);
}


int DataProc()              //数据处理FFT变换
{
  
  int i,sum,temp;
  long Phasetemp;
  int *PMagpcb,*PMagAndPhase;
  sum=0;		
  fft.ipcbptr=ipcb;
  fft.magptr=Magpcb;
	
  fft.init();

  for(i=0;i<TWON;i++)
		ipcb[i]=AD_DATA_Y[i];
		
  resave(ipcb,ipcb,TWON);	
  fft.izero(&fft);
  fft.calc(&fft);
  fft.mag(&fft);

  PMagpcb=Magpcb;
  PMagAndPhase=MagAndPhase[0];
  for(i=0;i<21;i++)
  {
     temp=*PMagpcb;   //Q14
     sum+=temp;
     temp=qsqrt((long)temp<<18)>>1;   //Q7--->Q15 first <<2<<7
     temp*=2; 
     *PMagAndPhase=temp;
     PMagpcb++;
     PMagAndPhase++;
     if ( temp<2 ) 
     {
        *PMagAndPhase=0; 
        PMagAndPhase++;
        continue;
      } 
                     
      temp=ipcb[i*2];       //实部  
      if  (temp==0)  
      {
         if (ipcb[i*2+1]>0)
             *PMagAndPhase=16384 ;                 //90+90,最大360----1,Q15 
         else
         if  (ipcb[i*2+1]>=0)  
             *PMagAndPhase=0 ;                //-90+90 0
            
       }  
       else
       {        
          Phasetemp=qinv1(temp);  //16.16
          Phasetemp=(Phasetemp>>16)*ipcb[i*2+1];   //16.16
          Phasetemp=qatan(Phasetemp);  //Q15
          Phasetemp>>1;           //0.5倍,PI到2PI
        
          if (ipcb[i*2]<0)               
               Phasetemp-=8192 ;                //-180+90
           else
                   Phasetemp+=8192 ; 
           *PMagAndPhase=Phasetemp; 
           PMagAndPhase++;
        }

	}
    
    sum=qsqrt((long)sum<<18)>>1;   //有效值
    sum=(long)sum*46430>>15;                          //46430,根号2
    Valnue[0]=sum; 
     
    //赋值处理,应该有限幅处理
    //相位
    if(spwm_moudle.ControlMode==CloseControl)         //闭环控制
    {
       spwm_moudle.Angle[0]=MagAndPhase[0][7]+16384;        //3次
       spwm_moudle.Angle[1]=MagAndPhase[0][11]+16384;        //5次
       spwm_moudle.Angle[2]=MagAndPhase[0][15]+16384;        //7次  
       
       spwm_moudle.Ample[0]=PID_Control_Amgple(MagAndPhase[0][6]);  //3
       spwm_moudle.Ample[1]=PID_Control_Amgple(MagAndPhase[0][10]); //5
       spwm_moudle.Ample[2]=PID_Control_Amgple(MagAndPhase[0][14]); //7
     
       calc_save_pwm();
     
     }      
     
     
  return 0;
}

void calc_save_pwm()
{
   int i;
   int *PWMbuf,*PWMData;
       
   spwm_calc(&spwm_moudle);
   
   PWMbuf=PWM_Buf;
   PWMData=PWM_Pulse;
   for(i=0;i<384;i++)
     *(PWMData++)=*(PWMbuf++);
   return;
}

int PID_Control_Amgple(int InputCur)  //输入为电流Q15,输出为调制度Q15
{
   int  Vout;
   asm("  SETC OVM  ");                         //设置溢出保护
   Vout=(long)InputCur*spwm_moudle.Kp>>15;   //Q15*Q15---->Q15
   Vout=(long)Vout*MaxCur*MaxP>>15;            //Q15--->Q0
   if(Vout>MaxHamanicVout)
       Vout=MaxHamanic; 
   if(Vout<MinHamanicVout)                           //输出限幅
       Vout=MinHamanicVout; 
   Vout=Vout*spwm_moudle.VoutToMaudleK;  //调制度Q0*Q15--->Q15 //溢出保护
   asm("  CLRC OVM  "); 
   return 0;
   
   
}

⌨️ 快捷键说明

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