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

📄 ad.c

📁 基于dsp2812的1024点快速傅里叶变换FFT
💻 C
字号:
#include "DSP281x_Device.h"  
#include "math.h"

#pragma DATA_SECTION(jg,"fftout") 
void ConfigureGpio(void);
void InitSystem(void);
interrupt void adc_isr(void); 
volatile unsigned int* controll_dram_d0 = (volatile unsigned int *) 0x002D00;

int adcInput0[1024];
unsigned int adcCount=0;

int L,Na,Nb,H,T;
int u,v,k=0;
int Pm,Qm,ID,Iw;
long Tempx,Tempy;
long T1,T2;
int jg[1024];
long x1[1024];
long x2[1024];
int W1[512]={1023,1022,1022,1022,1022,1022,1022,1022,1021,1021,1021,1020,1020,1019,1019,1018,1018,1017,1016,1016,1015,1014,1013,1012,1011,1010,1010,1008,1007,1006,1005,1004,1003,1002,1000,999,998,996,995,993,992,990,989,987,985,984,982,980,978,977,975,973,971,969,967,965,963,961,958,956,954,952,949,947,945,942,940,937,935,932,930,927,924,922,919,916,913,910,908,905,902,899,896,893,890,886,883,880,877,874,870,867,864,860,857,854,850,847,843,839,836,832,829,825,821,817,814,810,806,802,798,794,790,786,782,778,774,770,766,762,757,753,749,745,740,736,732,727,723,718,714,709,705,700,696,691,687,682,677,672,668,663,658,653,648,644,639,634,629,624,619,614,609,604,599,594,589,583,578,573,568,563,557,552,547,541,536,531,525,520,515,509,504,498,493,487,482,476,471,465,459,454,448,443,437,431,426,420,414,408,403,397,391,385,379,374,368,362,356,350,344,338,332,326,320,314,308,302,296,290,284,278,272,266,260,254,248,242,236,230,224,218,211,205,199,193,187,181,174,168,162,156,150,143,137,131,125,118,112,106,100,94,87,81,75,68,62,56,50,43,37,31,25,18,12,6,0,-6,-12,-18,-25,-31,-37,-43,-50,-56,-62,-68,-75,-81,-87,-94,-100,-106,-112,-118,-125,-131,-137,-143,-150,-156,-162,-168,-174,-181,-187,-193,-199,-205,-211,-218,-224,-230,-236,-242,-248,-254,-260,-266,-272,-278,-284,-290,-296,-302,-308,-314,-320,-326,-332,-338,-344,-350,-356,-362,-368,-374,-379,-385,-391,-397,-403,-408,-414,-420,-426,-431,-437,-443,-448,-454,-459,-465,-471,-476,-482,-487,-493,-498,-504,-509,-515,-520,-525,-531,-536,-541,-547,-552,-557,-563,-568,-573,-578,-583,-589,-594,-599,-604,-609,-614,-619,-624,-629,-634,-639,-644,-648,-653,-658,-663,-668,-672,-677,-682,-687,-691,-696,-700,-705,-709,-714,-718,-723,-727,-732,-736,-740,-745,-749,-753,-757,-762,-766,-770,-774,-778,-782,-786,-790,-794,-798,-802,-806,-810,-814,-817,-821,-825,-829,-832,-836,-839,-843,-847,-850,
-854,-857,-860,-864,-867,-870,-874,-877,-880,-883,-886,-890,-893,-896,-899,-902,-905,-908,-910,-913,-916,-919,-922,-924,-927,-930,-932,-935,-937,-940,-942,-945,-947,-949,-952,-954,-956,-958,-961,-963,-965,-967,-969,-971,-973,-975,-977,-978,-980,-982,-984,-985,-987,-989,-990,-992,-993,-995,-996,-998,-999,-1000,-1002,-1003,-1004,-1005,-1006,-1007,-1008,-1010,-1010,-1011,-1012,-1013,-1014,-1015,-1016,-1016,-1017,-1018,-1018,-1019,-1019,-1020,-1020,-1021,-1021,-1021,-1022,-1022,-1022,-1022,-1022,-1022,-1022};
int W2[512]={0,-6,-12,-18,-25,-31,-37,-43,-50,-56,-62,-68,-75,-81,-87,-94,-100,-106,-112,-118,-125,-131,-137,-143,-150,-156,-162,-168,-174,-181,-187,-193,-199,-205,-211,-218,-224,-230,-236,-242,-248,-254,-260,-266,-272,-278,-284,-290,-296,-302,-308,-314,-320,-326,-332,-338,-344,-350,-356,-362,-368,-374,-379,-385,-391,-397,-403,-408,-414,-420,-426,-431,-437,-443,-448,-454,-459,-465,-471,-476,-482,-487,-493,-498,-504,-509,-515,-520,-525,-531,-536,-541,-547,-552,-557,-563,-568,-573,-578,-583,-589,-594,-599,-604,-609,-614,-619,-624,-629,-634,-639,-644,-648,-653,-658,-663,-668,-672,-677,-682,-687,-691,-696,-700,-705,-709,-714,-718,-723,-727,-732,-736,-740,-745,-749,-753,-757,-762,-766,-770,-774,-778,-782,-786,-790,-794,-798,-802,-806,-810,-814,-817,-821,-825,-829,-832,-836,-839,-843,-847,-850,-854,-857,-860,-864,-867,-870,-874,-877,-880,-883,-886,-890,-893,-896,-899,-902,-905,-908,-910,-913,-916,-919,-922,-924,-927,-930,-932,-935,-937,-940,-942,-945,-947,-949,-952,-954,-956,-958,-961,-963,-965,-967,-969,-971,-973,-975,-977,-978,-980,-982,-984,-985,-987,-989,-990,-992,-993,-995,-996,-998,-999,-1000,-1002,-1003,-1004,-1005,-1006,-1007,-1008,-1010,-1010,-1011,-1012,-1013,-1014,-1015,-1016,-1016,-1017,-1018,-1018,-1019,-1019,-1020,-1020,-1021,-1021,-1021,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1022,-1021,-1021,-1021,-1020,-1020,-1019,-1019,-1018,-1018,-1017,-1016,-1016,-1015,-1014,-1013,-1012,-1011,-1010,-1010,-1008,-1007,-1006,-1005,-1004,-1003,-1002,-1000,-999,-998,-996,-995,-993,-992,-990,-989,-987,-985,-984,-982,-980,-978,-977,-975,-973,-971,-969,-967,-965,-963,-961,-958,-956,-954,-952,-949,-947,-945,-942,-940,
-937,-935,-932,-930,-927,-924,-922,-919,-916,-913,-910,-908,-905,-902,-899,-896,-893,-890,-886,-883,-880,-877,-874,-870,-867,-864,-860,-857,-854,-850,-847,-843,-839,-836,-832,-829,-825,-821,-817,-814,-810,-806,-802,-798,-794,-790,-786,-782,-778,-774,-770,-766,-762,-757,-753,-749,-745,-740,-736,-732,-727,-723,-718,-714,-709,-705,-700,-696,-691,-687,-682,-677,-672,-668,-663,-658,-653,-648,-644,-639,-634,-629,-624,-619,-614,-609,-604,-599,-594,-589,-583,-578,-573,-568,-563,-557,-552,-547,-541,-536,-531,-525,-520,-515,-509,-504,-498,-493,-487,-482,-476,-471,-465,-459,-454,-448,-443,-437,-431,-426,-420,-414,-408,-403,-397,-391,-385,-379,-374,-368,-362,-356,-350,-344,-338,-332,-326,-320,-314,-308,-302,-296,-290,-284,-278,-272,-266,-260,-254,-248,-242,-236,-230,-224,-218,-211,-205,-199,-193,-187,-181,-174,-168,-162,-156,-150,-143,-137,-131,-125,-118,-112,-106,-100,-94,-87,-81,-75,-68,-62,-56,-50,-43,-37,-31,-25,-18,-12,-6};       

void  main(void)
{
  // unsigned int LED[8]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080};
   
   
    InitSystem();            //初始化DSP内核寄存器
    //ConfigureGpio();         //对GPIO口进行配置
    InitPieCtrl();             //调用PIE控制单元初始化函数
    
    InitPieVectTable();         //  调用PIE向量表初始化函数
     InitAdc();                   //调用ADC模块的基本初始化函数
     
    EALLOW;
    PieVectTable.ADCINT=&adc_isr;    //重新设置PIE向量表中ADc的中断入口向量
    EDIS;
    
    PieCtrlRegs.PIEIER1.bit.INTx6=1;     //使能PIE中断分组1中的ADC中断
    
    IER=1;          //使能和ADC中断相连的CPU INT1中断
    
    EINT;           //使能全局中断位INTM
    ERTM;           // 使能全局实时调试中断DBGM
    
    
    //以下设置ADC模块
    AdcRegs.ADCTRL1.bit.SEQ_CASC=0;
    AdcRegs.ADCTRL1.bit.CONT_RUN=0;
    AdcRegs.ADCTRL1.bit.CPS=0;
    AdcRegs.ADCMAXCONV.all=0x0000;         //1个转换
    
    
    
    //将ADCINA0设置为SEQ1的第一个转换通道
    AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
    
    //将ADCINA0设置为SEQ1的第二个转换通道
    //AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x8;
    AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;       //使能EVA引起的中断
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;       
    AdcRegs.ADCTRL3.bit.ADCCLKPS=2;       //ADc模块的核心时钟频率=HSPCLK/4
    
    //以下配置EVA
    EvaRegs.GPTCONA.bit.TCMPOE=0;     //禁止比较输出
    
    
    //将通用定时器1的比较输出极性设置为强制低
    EvaRegs.GPTCONA.bit.T1PIN=0; 
    EvaRegs.GPTCONA.bit.T1TOADC=2;       //设置周期中断标志启动ADC
     
     
    
    EvaRegs.T1CON.bit.FREE=0;    //防真挂起时,定时器1立即停止工作
    EvaRegs.T1CON.bit.SOFT=0;
    EvaRegs.T1CON.bit.TMODE=2;   //连续增计数模式
    EvaRegs.T1CON.bit.TPS=7;     //设置定时器时钟频率为HSPCLK/128
    EvaRegs.T1CON.bit.TENABLE=1;     //允许定时器操作
    EvaRegs.T1CON.bit.TCLKS10=0;     //内部时钟
    EvaRegs.T1CON.bit.TCLD10=0;     //计数器为0时重载
    EvaRegs.T1CON.bit.TECMPR=0;     //禁止比较操作
                          
    
    EvaRegs.T1PR=580;       //定时器周期寄存器
    
    * controll_dram_d0=0;
       
    //for(adcCount=0;adcCount<1024;adcCount++)
    //adcInput0[adcCount]=0;
    
   // adcCount=0;
    while(1)
    {

      //GpioDataRegs.GPBDAT.all=LED[adcCount>>7];
     }
  }
    /*
   void ConfigureGpio(void)
   {
    EALLOW;
    GpioMuxRegs.GPAMUX.all = 0x0;    //将所有GPIO口的引脚配制成通用I/O口
    GpioMuxRegs.GPBMUX.all = 0x0;
    GpioMuxRegs.GPDMUX.all = 0x0;
    GpioMuxRegs.GPFMUX.all = 0x0;
    GpioMuxRegs.GPEMUX.all = 0x0;
    GpioMuxRegs.GPGMUX.all = 0x0;
    
    GpioMuxRegs.GPADIR.all = 0x0;
    GpioMuxRegs.GPBDIR.all = 0x00FF;
    
    GpioMuxRegs.GPDDIR.all = 0x0;
    GpioMuxRegs.GPEDIR.all = 0x0;
    GpioMuxRegs.GPFDIR.all = 0x0;
    GpioMuxRegs.GPGDIR.all = 0x0;
    
    GpioMuxRegs.GPAQUAL.all = 0x0;
    GpioMuxRegs.GPBQUAL.all = 0x0;
    GpioMuxRegs.GPDQUAL.all = 0x0;
    GpioMuxRegs.GPEQUAL.all = 0x0;
    EDIS;
    } 
    */
    void InitSystem(void)
    {
        EALLOW;
        SysCtrlRegs.WDCR=0x00E8;        //禁止看门狗模块
        SysCtrlRegs.PLLCR.bit.DIV=10;    //将CPU的PLL倍频系数设为5
        
        SysCtrlRegs.HISPCP.all=0x1;      //高速时钟的预定标器设置成除以2
        SysCtrlRegs.LOSPCP.all=0x2;      //低速时钟的预定标器设置成除以4
        
        
        //根据需要时能各种外设模块的时钟
        SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
        SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
        SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
        SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
        SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
        SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
        SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
        SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
        EDIS;
     }
       
       
     interrupt void adc_isr(void)
     {
     
        AdcRegs.ADCTRL2.bit.RST_SEQ1=1;  //复位SEQ1  
     AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除中断位INT SEQ1
     PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; //清除PIE1的中断响应位
        
     
          //将采样值送入循环采样数组中
     adcInput0[adcCount]=AdcRegs.ADCRESULT0>>4;
     //adcInput1[adcCount]=AdcRegs.ADCRESULT1>>4;
     adcInput0[adcCount]-=2047;   //转化为12位有符号数
     	x1[adcCount] =adcInput0[adcCount];
     //*OUT=adcInput0[adcCount];
     //实现数组的循环访问
     adcCount++;
     if(adcCount == 1023)
     {
               adcCount = 0;
				for (u=0;u<1024;u++)
                   x2[u]=0;
              H=1024;
              u=1;
              v=1;
           while(u<1024)
               { 
                if(u<v)
                    {
                     T=x1[v-1];
                     x1[v-1]=x1[u-1];
                     x1[u-1]=T;
                     }
                 k=512;
                 while(k< v)
                 {
                 v=v-k;
                 k=k/2;
                 }
               v=v+k;
               u=u+1; 
              }
              Na=1;
              for (L=1;L<=10;L++)
                {
                    H=H/2; 
                    Na=Na*2;
                    Nb=Na/2;
                    Pm=0;
                    Qm=0;
                    ID=0;
                    k=1024/Na;
                     for(u=0;u<k;u++) 
                         {

                        for(v=0;v<Nb;v++) 
                            {
                              Pm=ID+v;
                              Qm=Pm+Nb;
                              Iw=v*H ;

        Tempx=((x1[Qm]*W1[Iw]/1024)-(x2[Qm]*W2[Iw]/1024));
        Tempy=((x2[Qm]*W1[Iw]/1024)+(x1[Qm]*W2[Iw]/1024));
        T1=x1[Pm];
        T2=x2[Pm];
        x1[Pm]=(T1+Tempx);
        x2[Pm]=(T2+Tempy);
        x1[Qm]=(T1-Tempx);
        x2[Qm]=(T2-Tempy);
    }
ID=ID+Na;
}
}

for (u=0;u<1024;u++)
{
    x1[u]=x1[u]/256;
    x2[u]=x2[u]/256;
}

for(u=0;u<1024;u++)
    jg[u]=(sqrt(x1[u]*x1[u]+x2[u]*x2[u]))*64;
    
    //for(u=0;u<5000;u++);	
	
	* controll_dram_d0 = !(* controll_dram_d0);
		}
     
     
     //重新初始化ADC采样序列
     
     
    
     }
     
    
       

⌨️ 快捷键说明

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