ioport unsigned int *ADCCTL1=(unsigned int *)0x6800;
ioport unsigned int *ADCDATA1=(unsigned int *)0x6801;
ioport unsigned int *ADCCLKDIV1=(unsigned int *)0x6802;
ioport unsigned int *ADCCLKCTL1=(unsigned int *)0x6803;
#define ADCCTL (*ADCCTL1)
#define ADCDATA (*ADCDATA1)
#define ADCCLKDIV (*ADCCLKDIV1)
#define ADCCLKCTL (*ADCCLKCTL1)
#include "myapp.h"
#include "csedu.h"
#include "scancode.h"
#include <math.h>
#include <stdio.h>
#include <csl.h>
#include <csl_pll.h>
#include <csl_emif.h>
#include <csl_chip.h>
#define PI 3.1415926
#define SAMPLENUMBER 1024
#define FIRNUMBER 101
#define SAMPLEF 10000
#define comm 0
#define dat 1
#define LCD_DATA (*((unsigned int *)0x200006)) //数据端口
#define LCD_REG (*((unsigned int *)0x200003)) //LCD寄存器输出,包括LCD1602 LCD12864
//(LCD1206 LCD12864 数码管 UART公用数据端口)
#define USER_SW (*((unsigned int *)0x200005)) //UART寄存器
void interrupt tint( void );
void CLK_init( void );
void SDRAM_init( void );
void INTR_init( void );
void TIME_init(void);
void TMCR_Reset( void );
void SetDSPPLL(unsigned int uPLL);
void InitADC();
void wait( unsigned int cycles );
void EnableAPLL( );
void InitForFFT();
void MakeWave();
void FFT();
float FIR();
float fHn[FIRNUMBER]={
-0.00000,0.00000,0.00000,0.00000,0.00001,0.00003,0.00006,0.00010,0.00015,0.00022,
0.00030,0.00039,0.00050,0.00062,0.00074,0.00087,0.00099,0.00110,0.00119,0.00124,
0.00125,0.00119,0.00105,0.00082,0.00047,-0.00000,-0.00061,-0.00139,-0.00233,-0.00346,
-0.00476,-0.00625,-0.00792,-0.00977,-0.01176,-0.01390,-0.01616,-0.01850,-0.02090,-0.02331,
-0.02570,-0.02804,-0.03026,-0.03235,-0.03425,-0.03593,-0.03735,-0.03849,-0.03932,-0.03983,
0.95999,
-0.03983,-0.03932,-0.03849,-0.03735,-0.03593,-0.03425,-0.03235,-0.03026,-0.02804,-0.02570,
-0.02331,-0.02090,-0.01850,-0.01616,-0.01390,-0.01176,-0.00977,-0.00792,-0.00625,-0.00476,
-0.00346,-0.00233,-0.00139,-0.00061,-0.00000,0.00047,0.00082,0.00105,0.00119,0.00125,
0.00124,0.00119,0.00110,0.00099,0.00087,0.00074,0.00062,0.00050,0.00039,0.00030,
0.00022,0.00015,0.00010,0.00006,0.00003,0.00001,0.00000,0.00000,0.00000,-0.00000
};
float fOut[SAMPLENUMBER]={0.0};
float fXn[FIRNUMBER]={ 0.0 },fWaveR[SAMPLENUMBER]={ 0.0 },fWaveI[SAMPLENUMBER]={ 0.0 };
unsigned int nADC0[SAMPLENUMBER],nADC1[SAMPLENUMBER];
char buf1[32],buf2[32];
String s1,s2;
int w[SAMPLENUMBER]={ 0 };
float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER];
float fre0,fre1;
//lcd...
void Delaylcd(unsigned int nDelay);
void delaynum(unsigned int d_time);
void wr_lcd(unsigned char dat_comm, unsigned char content);
void lcd(char *s);
/*锁相环的设置*/
PLL_Config myConfig = {
0, 1, 12, 2
};
/*SDRAM的EMIF设置*/
EMIF_Config emiffig = {
0x221, 0xFFFF, 0x1fff, 0x00ff, 0x00ff, 0x1fff, 0x00ff, 0x00ff, 0x1FFF,
0xFFFF, 0x00FF, 0x1fff, 0x00ff, 0x00ff, 0x2911, 0x0410, 0x07FF, 0x0131
};
void delay(unsigned int d_time)
{
while(d_time--);
}
main()
{
float distance;
int i,j,max,maxi;
unsigned int uWork;
/*初始化CSL库*/
CSL_init();
/*EMIF为全EMIF接口*/
CHIP_RSET(XBSR,0x0a01);
/*设置系统的运行速度为144MHz*/
PLL_config(&myConfig);
/*初始化DSP的EMIF*/
EMIF_config(&emiffig);
//lcd
EnableAPLL();
InitADC();
PLL_Init(132);
printf ("\nTESTING...\n");
while(1)
{
int nOut=0;
//AD转换
for ( i=0;i<SAMPLENUMBER;i++ )
{
ADCCTL=0x8000; // 启动AD转换,通道0
do
{
uWork=ADCDATA;
} while ( uWork&0x8000 );
nADC0[i]=(uWork&0x0fff);
}
for ( i=0;i<SAMPLENUMBER;i++ )
{
ADCCTL=0x9000; // 启动AD转换,通道1
do
{
uWork=ADCDATA;
} while ( uWork&0x8000 );
nADC1[i]=uWork&0x0fff;
}
//FIR滤波
for(i=0;i<SAMPLENUMBER;i++)
{
for ( j=FIRNUMBER-1;j>0;j-- )
fXn[j]=fXn[j-1];
fXn[0]=nADC0[i];
fWaveR[i]=FIR();
fOut[nOut++]=fWaveR[i];
}
//FFT变换1,计算AD通道1中波形的频率
InitForFFT();
FFT(fWaveR,fWaveI);
max=w[0];
maxi=0;
//取峰值对应的横坐标I值
for(i=1;i<SAMPLENUMBER/2;i++)
if(max<w[i])
{
max = w[i];
maxi=i;
}
fre0=(float)maxi*37.27;//18.74_37.27为根据实验数据得出的系数
distance=(float)maxi*0.076;
printf("The fre0 is:%f Hz\tmaxi=%d\t",fre0,maxi);
printf("The distance is:%fm\n",distance);
snprintf(buf1,sizeof(buf1),"%f ",fre0); //将速度值转化为字符串
s1=buf1;
snprintf(buf2,sizeof(buf2),"%f ",distance); //将速度值转化为字符串
s2=buf2;
//发光二极管测试
wr_lcd(comm,0x30);//
wr_lcd(comm,0x01);////清屏
wr_lcd(comm,0x06);////整体显示开,游标开
wr_lcd(comm,0x0c);
wr_lcd(comm,0x80);////第一行第一个字节地址
lcd("频率:(HZ)");
wr_lcd(comm,0x90); ////第二行第一个字节地址
lcd(s1);
wr_lcd(comm,0x88); ////第三行第一个字节地址
lcd("距离(M ):");
wr_lcd (comm,0x98);////第四行第一个字节地址
lcd(s2);
asm( " nop");
}
}//end main()
float FIR()
{
int i;
float fSum;
fSum=0;
for ( i=0;i<FIRNUMBER;i++ )
{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER])
{
int x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,xx;
int i,j,k,b,p,L;
float TR,TI,temp;
/********** following code invert sequence ************/
for ( i=0;i<SAMPLENUMBER;i++ )
{
x0=x1=x2=x3=x4=x5=x6=x7=x8=x9=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;
x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;
x7=(i/128)&0x01; x8=(i/256)&0x01; x9=(i/512)&0x01;
xx=x0*512+x1*256+x2*128+x3*64+x4*32+x5*16+x6*8+x7*4+x8*2+x9;
dataI[xx]=dataR[i];
}
for ( i=0;i<SAMPLENUMBER;i++ )
{
dataR[i]=dataI[i]; dataI[i]=0;
}
/************** following code FFT *******************/
for ( L=1;L<=10;L++ )//更改L
{ /* for(1) */
b=1; i=L-1;
while ( i>0 )
{
b=b*2; i--;
} /* b= 2^(L-1) */
for ( j=0;j<=b-1;j++ ) /* for (2) */
{
p=1; i=10-L; //更改L
while ( i>0 ) /* p=pow(2,7-L)*j; */
{
p=p*2; i--;
}
p=p*j;
for ( k=j;k<SAMPLENUMBER;k=k+2*b ) /* for (3) */
{
TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
} /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for ( i=0;i<SAMPLENUMBER/2;i++ )
{
w[i]=floor(sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i])/4);
}
w[0]=w[0]/32;
} /* END FFT */
void InitForFFT()
{
int i;
for ( i=0;i<SAMPLENUMBER;i++ )
{
sin_tab[i]=sin(PI*2*i/SAMPLENUMBER);
cos_tab[i]=cos(PI*2*i/SAMPLENUMBER);
}
}
void InitADC()
{
ADCCLKCTL=0x11; // 144MHz ADCLK
ADCCLKDIV=0x4f00;
}
void EnableAPLL( )
{
/* Enusre DPLL is running */
*( ioport volatile unsigned short* )0x1f00 = 4;
wait( 25 );
*( ioport volatile unsigned short* )0x1f00 = 0;
// MULITPLY
*( ioport volatile unsigned short* )0x1f00 = 0x3000;
// COUNT
*( ioport volatile unsigned short* )0x1f00 |= 0x4F8;
wait( 25 );
//*( ioport volatile unsigned short* )0x1f00 |= 0x800
// MODE
*( ioport volatile unsigned short* )0x1f00 |= 2;
wait( 30000 );
// APLL Select
*( ioport volatile unsigned short* )0x1e80 = 1;
// DELAY
wait( 60000 );
}
void wait( unsigned int cycles )
{
int i;
for ( i = 0 ; i < cycles ; i++ ){ }
}
//lcd..
void Delaylcd(unsigned int nDelay)
{
int ii,jj,kk=0;
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<1024;jj++ )
{
kk++;
}
}
}
void delaynum(unsigned int d_time)
{
while(d_time--);
}
/************************************
* LCD12864写命令或者指令程序函数 *