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

📄 main.c

📁 DSP2407的外置AD加DSP的M15伪码快速捕获程序,可下载,烧写,可运行
💻 C
字号:
/*Main.c*/ 
/*AD采样基本程序,并带有排队滤波函数
  采样结果的精度与稳定性与基准源和信号源有关
  请在项目开发的时候选择稳定的电压基准源*/
#include "global.c" 
#include "math.h" 
//#include "ioports.h" 
ioport unsigned port1000;
void SystemInit();
void Timer1Init(); 
void KickDog();  
//void SPI_Init(); 
//void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA);
void AD_Sample(); 
//void Que();
void mrelfft(float xr[],float xi[],int n,int isign) ;
void fft(),ifft();
int numled0=200,N,r,k;   
unsigned int t0=0,i=0,a,b;   
unsigned int RESULT_0=0;  
//int  AD0[2000],AD_0,lo[512];
//signed int RESULT_0=0;  
float  AD0[256],AD_0,rpn[256],ipn[256],rdatain[256],idatain[256],product[256];
 float data2_real[256],  data2_imag[256];
unsigned int AD_FLAG=0;
float AD_SIG0=0.0,AD_SIG8=0.0,j;  

int sin1[32]={
 0,     -980,    -1951,   -2903,   -3827,   -4714,
 -5556, -6344,   -7071,   -7730,   -8315,   -8819,
 -9239, -9569,   -9808,   -9952,   -10000,  -9952,
 -9808, -9569,   -9239,   -8819,   -8315,   -7730,
 -7071, -6344,   -5556,   -4714,   -3827,   -2903,
 -1951, -980  
 };

int cos1[32]={
10000,   9952,   9808,   9569,   9239,   8819,   
 8315,   7730,   7071,   6344,   5556,   4714,
 3827,   2903,   1951,   980,    0,      -980,   
 -1951,  -2903,  -3827,  -4714,  -5556,  -6344,
 -7071,  -7730,  -8315,  -8819,  -9239,  -9569,
 -9808,  -9952
 }; 

void main(void)
{  N=64;r=6;
   
   SystemInit();         		//系统初始化
    k=0xf590;//0xf590
     j=1;     
   for(i=0;i<4*15;i++)//input signal
     {
      if((i%4)==0)
       { if((k&0x8000)>0)
            {
             j=1000;
            }
         else
            {j=-1000;
            }
           k<<=1;
       } 
      rpn[i]=j*cos(3.1415926*2*i*3/4);
      ipn[i]=0;
     } 
 for(i=60;i<64;i++)
        {      
      rpn[i]=0;
      ipn[i]=0;
     } 
      
   
  for(i=0;i<60;i++)
        {
         rdatain[i]=1*rpn[i];
         idatain[i]=0;
        }
   for(i=60;i<64;i++)
        {
         rdatain[i]=0;
         idatain[i]=0;
        }      

   fft(); //Lo fft
 for(i=0;i<64;i++)
        {
         rpn[i]=data2_real[i];
         ipn[i]=data2_imag[i];
        }  
        
  for( i=0; i<64; i++ )
        {
       product[i]=sqrt(data2_real[i]*data2_real[i]+data2_imag[i]*data2_imag[i]); 
        }
     product[0]=0;  
  for(i=0;i<300;i++)
   {AD0[i]=0;
   }
   MCRA=MCRA & 0xC0FF; 	    	//IOPB0-6设为IO口模式
   PBDATDIR=0xFFC2;   	    	//所有LED=0 
   PBDATDIR=PBDATDIR |0x003D;  	//所有LED=1   
 //  SPI_Init(); 
 //  DA_OUT(0,0,192);            	//2.475V,Voltage范围0-255对应0-3.3V
 //  DA_OUT(1,0,128);           	//1.65V,Voltage范围0-255对应0-3.3V
//   DA_OUT(2,0,192);            	//2.475V,Voltage范围0-255对应0-3.3V
//   DA_OUT(3,0,128);           	//1.65V,Voltage范围0-255对应0-3.3V
  i=0;
     
 //  Timer1Init();          		//定时器初始化
 //  asm(" CLRC INTM ");
   //EINT;
  // DINT;
  ///////////////////////////////////
    ADCTRL1=0x4000;			/* ADC模块复位 reset*/
     asm(" NOP	");
     ADCTRL1=0x0020;         /* 自由运行,启动/停止模式,双排序器工作模式 3*/
  //  ADCTRL1 =0x0060;         /* 自由运行,cont,双排序器工作模式 3*/
    MAXCONV=0x0000;          //max  channal number
    CHSELSEQ1=0x0000;       //第0通道
    ADCTRL2=0x4000;         //复位使排序器指针指向CONV00
    ADCTRL2=0x2000;			/* 启动ADC转换 */
   
   while(1)
   { // 	 PADATDIR=PADATDIR & 0xFFFE;    //IOPA0=0;LED灭  
	  //   PADATDIR=PADATDIR |0x0101;     //IOPA0=1;LED亮  
//	 i=port1000;      //=0x1000;
      if(i>60)
      { 
        for(i=0;i<60;i++)//input data
        {
         rdatain[i]=100*AD0[i];//+1000*cos(3.1415926*2*i*3.1/4);
         idatain[i]=0;
        }
  for(i=60;i<64;i++)
        {
         rdatain[i]=0;
         idatain[i]=0;
        }
   
   fft();//input signal FFT
     
     for(i=55;i<64;i++)
        {
         //data2_real[i]=0;//LOw pass
        // data2_imag[i]=0;
         
        }    
         data2_real[0]=0;//Heigh pass
         data2_imag[0]=0;
        
 
      for( i=0; i<64; i++ )
        {
       product[i]=sqrt(data2_real[i]*data2_real[i]+data2_imag[i]*data2_imag[i]);  // power
        }
      
   for( i=0; i<60; i++ )       // correlation X3(w)={[X1(w)]*}X2(w)
    {                               // X1(w)= rmxulielevel[i]+ (j)(imxulielevel[i]);
                                 // X2(w)= rdatain[i]+ idatain[i]
     rdatain[i]= data2_real[i]*rpn[i]+ data2_imag[i]*ipn[i];  //
     idatain[i]=data2_imag[i]*rpn[i]-data2_real[i]*ipn[i];    //
    }
  for(i=60;i<64;i++)
        {
         rdatain[i]=0;
         idatain[i]=0;
        }
    ifft();//FFT-1 
   for( i=0; i<60; i++ )
      {
product[i]=sqrt(data2_real[i]*data2_real[i]+data2_imag[i]*data2_imag[i])/50;  // power
       
       }    

     
      for(i=0;i<60;i++)//input data
        {rdatain[i]=0;
         idatain[i]=0;
         AD0[i]=0;
        if(product[i]>560)//550
        {
        
         product[i]=0;
          i=0;
         }
        } 
       i=0;  
    } 
      	 	
      AD_Sample();
	AD0[i++]=RESULT_0;
//	T1CNT=0;
	EVAIFRA=0x80; 
      
   }
   
}

void AD_Sample()
{ // PADATDIR=PADATDIR & 0xFFFE;    //IOPA0=0;LED灭  
	   
  // ADCTRL1=0x4000;			/* ADC模块复位 reset*/
 //   asm(" NOP	");
 //   ADCTRL1=0x0020;         /* 自由运行,启动/停止模式,双排序器工作模式 3*/
   //  ADCTRL1 =0x0060;         /* cont,*/
    
  //  MAXCONV=0x0000;          //max  channal number
  //  CHSELSEQ1=0x0000;       //第0通道
    ADCTRL2=0x4000;         //复位使排序器指针指向CONV00
    ADCTRL2=0x2000;			/* 启动ADC转换 */
   while( (ADCTRL2&0x1000)==0x1000);		/*等待转换完成 */
    asm(" NOP ");
    asm(" NOP "); 
     asm(" NOP ");
    asm(" NOP "); 
     asm(" NOP ");
    asm(" NOP "); 
     asm(" NOP ");
    asm(" NOP "); 
     asm(" NOP ");
    asm(" NOP "); 
     asm(" NOP ");
   /////////////////////   
   asm(" NOP ");
  
   for(a=0;a<59;a++);//best=59
    RESULT_0=RESULT0>>6; 
//     PADATDIR=PADATDIR |0x0101;     //IOPA0=1;LED亮 



  //  MAXCONV=0x0000;         //第8通道          
 //   CHSELSEQ3=0x0008;
 //   ADCTRL2=0x0040;
 //   ADCTRL2=0x0020;
 //   while( (ADCTRL2&0x0010)==0x0010);  
 //   asm(" NOP ");
 //   asm(" NOP ");
  //  RESULT_8=RESULT8//>>6;   
  //    RESULT_0=RESULT8>>6;    
}

void c_int2()               /*定时器1中断服务程序*/
{

 /*   if(PIVR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	T1CNT=0; 
	t0++;
	numled0--;
	if(numled0==0)
	{
		numled0=200;
		if((PBDATDIR & 0x0001)==0x0001) 
			PBDATDIR=PBDATDIR & 0xFFFE;    	//IOPB0=0;LED灭  
		else
			PBDATDIR=PBDATDIR |0x0101;     	//IOPB0=1;LED亮 
	}
	if((AD_FLAG==0)&((t0%100)==0))     //定时AD采样
	{  
	    AD_FLAG=1;
	}*/
	AD_Sample();
	AD0[i++]=RESULT_0;
	T1CNT=0;
	EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   
	
}  

void SystemInit() 
{  
 
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
//	SCSR1=0x87FE;         	/* 系统时钟CLKOUT=20*2=40M */PLL=1*clk
//	SCSR1=0x83FE;         	/* 系统时钟CLKOUT=20*2=40M */
    SCSR1=0x81FE;         	/* 系统时钟CLKOUT=6*4=40M */
	   						/* 打开ADC,EVA,EVB,CAN和SCI的时钟*/
	WDCR=0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
//	KickDog();    			/* 初始化看门狗 */  
    IFR=0xFFFF;				/* 清除中断标志 */
    IMR=0x0002;				/* 打开中断2*/      
    
}  

void Timer1Init()           
{ 

    EVAIMRA=0x0080;			//  定时器1周期中断使能 
    EVAIFRA=0xFFFF;			//  清除中断标志 
    GPTCONA=0x0000;
//	T1PR=2500;				//  定时器1初值,定时0.4us*2500=1ms 			
    T1PR=40;			
	T1CNT=0;                  //clear T1
//	T1CON=0x144E;           //增模式, TPS系数40M/16=2.5M,T1使能
   T1CON=0x144E;           //增模式, TPS系数20M/1=20M,T1使能
	
//	KickDog();    			/* 初始化看门狗 */ 
 				
} 


void KickDog()				/*踢除看门狗 */
{
	WDKEY=0x5555;
	WDKEY=0xAAAA;
}


void fft(void)
{
   int i,j,k,bfsize,NV2,NM1,a,b,c;
   float co_real,co_imag;
  
   for(i=0;i<N;i++)
   {
        
   data2_real[i]=rdatain[i];
    data2_imag[i]=idatain[i];
    }  
   
  
   for(k=0;k<r;k++)
   {
      for(j=0;j<1<<k;j++)
      {
         bfsize=1<<(r-k);
         for(i=0;i<bfsize/2;i++)
         {
            a=i+j*bfsize;
            b=a+bfsize/2;
            c=i*(1<<k);
            co_real=data2_real[a]-data2_real[b];
            co_imag=data2_imag[a]-data2_imag[b];

            data2_real[a]=(data2_real[a]+data2_real[b])/2;
            data2_imag[a]=(data2_imag[a]+data2_imag[b])/2;

            data2_real[b]=(co_real*cos1[c]-co_imag*sin1[c])/20000.0;
            data2_imag[b]=(co_real*sin1[c]+co_imag*cos1[c])/20000.0;
         }
      }
   }

   NV2=N/2;NM1=N-1;k=0;
   i=j=1;
   while(i<=NM1)
   {
      if(i<j)
      {
         co_real=data2_real[j-1];          co_imag=data2_imag[j-1];
         data2_real[j-1]=data2_real[i-1];  data2_imag[j-1]=data2_imag[i-1];
         data2_real[i-1]=co_real;          data2_imag[i-1]=co_imag;
      }
      k=NV2;
      while(k<j)
      {
         j-=k;
         k/=2;
      }
      j+=k;
      i++;
   }    

}

void ifft()  //IFFT
{int i,j,k,bfsize,NV2,NM1,a,b,c;
   float co_real,co_imag;
  
   for(i=0;i<N;i++)
     {     
   data2_real[i]=rdatain[i];
   data2_imag[i]=idatain[i];
     }  
   
     
   for(k=0;k<r;k++)  //butterfly  calculate
   {
      for(j=0;j<1<<k;j++)
      {
         bfsize=1<<(r-k);
         for(i=0;i<bfsize/2;i++)
         {
            a=i+j*bfsize;
            b=a+bfsize/2;
            c=i*(1<<k);
            co_real=data2_real[a]-data2_real[b];
            co_imag=data2_imag[a]-data2_imag[b];

            data2_real[a]=(data2_real[a]+data2_real[b])/2;
            data2_imag[a]=(data2_imag[a]+data2_imag[b])/2;
          
            data2_real[b]=(co_real*cos1[c]+co_imag*sin1[c])/20000.0;//ifft
            data2_imag[b]=(-co_real*sin1[c]+co_imag*cos1[c])/20000.0;
         }
      }
   }

   NV2=N/2;NM1=N-1;k=0;
   i=j=1;
   while(i<=NM1)  // bit invers
   {
      if(i<j)
      {
         co_real=data2_real[j-1];          co_imag=data2_imag[j-1];
         data2_real[j-1]=data2_real[i-1];  data2_imag[j-1]=data2_imag[i-1];
         data2_real[i-1]=co_real;          data2_imag[i-1]=co_imag;
      }
      k=NV2;
      while(k<j)
      {
         j-=k;
         k/=2;
      }
      j+=k;
      i++;
   }    
}

⌨️ 快捷键说明

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