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

📄 main.c

📁 DSP2407的外置AD0820家DSP测试程序,可下载,烧写,可运行
💻 C
字号:
/*Main.c*/ //05.02 F=40MHZ,INT+AD
/*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,j,m=1;   
unsigned int RESULT_0=0;  
//int  AD0[2000],AD_0,lo[512];
//signed int RESULT_0=0;  
float  AD0[64],AD_0,rdatain[64],idatain[64],product[64],product1[64];
 float data2_real[64],  data2_imag[64];
unsigned int AD_FLAG=0;
float AD_SIG0=0.0,AD_SIG8=0.0;  

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();         		//系统初始化
   MCRC=0x0000;               //E\F port set
   PFDATDIR=0x0101;     	//IOPA0=1;READ=1 
 
  // 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 =0x02040;         /* 自由运行,cont,双排序器工作模式 3*/
    MAXCONV=0x0000;          //max  channal number
    CHSELSEQ1=0x0000;       //第0通道
    ADCTRL2=0x4000;         //复位使排序器指针指向CONV00
    ADCTRL2=0x2000;			/* 启动ADC转换 */
 k=10;
 //  while(1)
 //  { AD_Sample();
 //  }
      for( a=0; a<64; a++ )
           {
      
          product1[a]=0;
            }
   while(1)
   { // 	 PADATDIR=PADATDIR & 0xFFFE;    //IOPA0=0;LED灭  
	  //   PADATDIR=PADATDIR |0x0101;     //IOPA0=1;LED亮  
//	 i=port1000;      //=0x1000;
   
    PFDATDIR=PFDATDIR & 0x0100;    	//IOPF0=0;LED灭  
		for(j=0;j<1;j++);
  //	asm(" NOP	");	 
	
    AD0[i++] =( PEDATDIR & 0x00ff); //input f=1570HZ
    PFDATDIR=PFDATDIR |0x0101;     	//IOPB0=1;LED亮
      if(i>64)
      { //	asm(" SETC	INTM ");	/* 关闭总中断 */
        for(a=0;a<64;a++)//input data
        {
         rdatain[a]=1*AD0[a]-125;//+1000*cos(3.1415926*2*i*3.1/4);
        // rdatain[a]=1000*cos(3.1415926*2*i/64);
         idatain[a]=0;
        }
 
   
        fft();//input signal FFT
     
          for( a=0; a<64; a++ )
           {
          product[a]=1*sqrt(data2_real[a]*data2_real[a]+data2_imag[a]*data2_imag[a]);  // power
          product1[a]+= product[a];
            }
             for( a=0; a<64; a++ )
           {
           product[a]= product1[a]/m;
            }
          m++;
         product[0]= 0;
          product1[0]= 0;
      //	T1PR+=k;		//12300
      	b=T1PR;
      	if( product[2]>60)
        	{
      	 a=0; 
      	   }
      	       a=0;  
       i=0;
      //  asm(" CLRC INTM ");
     } 
   }
   
}

void AD_Sample()
{ // PADATDIR=PADATDIR & 0xFFFb;    //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);		/*等待转换完成 */
   
   for(a=0;a<99;a++);//best=59
   // RESULT_0=RESULT0>>6; 
   AD0[i++]=RESULT0>>6;
  //   PADATDIR=PADATDIR |0x0404;     //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中断服务程序*/
{//PADATDIR=PADATDIR & 0xFFFb;    //IOPA0=0;LED灭 
 //PADATDIR=PADATDIR |0x0404;     //IOPA0=1;LED亮 
   PFDATDIR=PFDATDIR & 0x0100;    	//IOPF0=0;LED灭  
			for(j=0;j<2;j++);	 
    AD0[i++] =( PEDATDIR & 0x00ff); 
           //	for(j=0;j<10;j++);	 
    PFDATDIR=PFDATDIR |0x0101;     	//IOPB0=1;LED亮
   // AD0[i++]=RESULT0>>6;
	EVAIFRA=0x80; 
	if(i>100)
	{i=0;}
	asm(" CLRC	INTM ");    //open int
	
}  

void SystemInit() 
{  
 
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
//	SCSR1=0x87FE;         	/* 系统时钟CLKOUT=20*1=20M *///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=400;		//12100--12230	
  //   T1PR=60240;		//59000--60240	
  //T1PR=2510;		//59000--60240  //osc=20M,f=120hz
  //T1PR=2510*12;		//59000--60240  //osc=20M,f=10hz

	T1CNT=0;                  //clear T1
//	T1CON=0x144E;           //增模式, TPS系数40M/16=2.5M,T1使能
   T1CON=0x104E;           //增模式, TPS系数40M/1=40M,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 + -