📄 main.c
字号:
#include "myapp.h"
//#include "ICETEK-VC5509-A.h"
#include "LCD.h"
#include "math.h"
#include "extaddr.h"
#include "util.h"
#define CREG (*(unsigned short int *)0x400004)
#define IIRNUMBER 3
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF 10000
#define PI 3.1415926
// AD ----------------------------------------------------------
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)
// DA ----------------------------------------------------------
#define DA_DATA_L (*((unsigned int *)0x400800))
#define DA_DATA_H (*((unsigned int *)0x400801))
#define DA_CTL (*((unsigned int *)0x400802))
#define DA_CHN1 0x0
#define DA_CHN2 0x40
#define DA_CHN3 0x80
#define DA_CHN4 0xc0
// 液晶 ----------------------------------------------------------
#define CTRLED (*(unsigned int *)0x600802) // port8004
#define MCTRKEY (*(unsigned int *)0x602802) // port8005
#define CTRCLKEY (*(unsigned int *)0x600803) // port8006
#define CTRSTATUS (*(unsigned int *)0x600800) //port8000
#define ADCNUMBER 256
void TIME_init(void);
void INTR_init( void );
void interrupt Timer( void );
void InitADC();
float InputWave();
float IIR();
ioport unsigned int * sysR = (unsigned int *)0x7fd;
struct struLCDGraph struGraph,struGraph1;
unsigned int nScreenBuffer[30*128];
int nData[256],nData1[256];
void Delay(unsigned int nDelay);
int k0,k1,uWork,uWork0,nAD,keyflage;
int nGraphBuf1[ADCNUMBER],nGraphBuf2[ADCNUMBER];
int nADBuf1[ADCNUMBER],nADBuf2[ADCNUMBER];
int nGraphBuf1[ADCNUMBER],nGraphBuf2[ADCNUMBER];
float fBn[IIRNUMBER]={ 0.0,0.9428,-0.3333 };
float fAn[IIRNUMBER]={ 0.09763,0.19526,0.09763 };
float fXn[IIRNUMBER]={ 0.0 };
float fYn[IIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[ADCNUMBER],fOut[ADCNUMBER];
int nIn,nOut;
int step=0;
unsigned int Showout[ADCNUMBER],showin[ADCNUMBER];
int mbuffer[ADCNUMBER];
main()
{
int j;
unsigned int * pWork;
unsigned int uWork1;
PLL_Init(30);
SDRAM_init();
CREG=1;
LCDTurnOff();
LCDSetScreenBuffer(nScreenBuffer);
for ( uWork=0,pWork=nScreenBuffer;uWork<30*128;uWork++,pWork++ ) (*pWork)=0;
LCDSetDelay(1);
LCDTurnOn(); // 打开显示
LCDCLS(); // 清除显示内存
TIME_init();
INTR_init();
InitADC();
ADCCTL = 0x8000;
(*sysR)=1;
k0=k1=0;
keyflage=0;
CTRCLKEY=0;
nIn=0; nOut=0;
fInput=fOutput=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
// fStepSignal1=2*PI/30;
// fStepSignal2=2*PI*1.4;
fStepSignal1=2*PI/50;
fStepSignal2=2*PI/2.5;
for(;;)
{
for(j=0;j<ADCNUMBER;j++)
{
mbuffer[j]=nGraphBuf1[j];
}
fInput=InputWave();
fIn[nIn]=fInput;
nIn++; nIn%=ADCNUMBER;
fOutput=IIR();
fOut[nOut]=fOutput;
nOut++; // break point
if ( nOut>=ADCNUMBER )
{
nOut=0;
for(j=0;j<ADCNUMBER;j++)
{
showin[j]=mbuffer[j]>>1;
Showout[j]=fOut[j];
}
if(keyflage==1)
{
struGraph.pData=Showout;
struGraph.uDataMode=DATAUINTMODE;
struGraph.uDataLength=ADCNUMBER;
struGraph.uMaxValue=512;
struGraph.uWindowX0=0;
struGraph.uWindowY0=0;
struGraph.uWindowX1=240;
struGraph.uWindowY1=128;
struGraph.nOriginX=0;
struGraph.nOriginY=0;
struGraph.uLineMode=LINEMODE;
LCDGraph(&struGraph);
for ( j=0;j<20;j++ ) _Delay(614);
LCDSetScreenBuffer(nScreenBuffer);
LCDCLS(); // 清除显示内存
}
if(keyflage==0)
{
struGraph.pData=showin;
struGraph.uDataMode=DATAUINTMODE;
struGraph.uDataLength=ADCNUMBER;
struGraph.uMaxValue=1024;
struGraph.uWindowX0=0;
struGraph.uWindowY0=0;
struGraph.uWindowX1=240;
struGraph.uWindowY1=128;
struGraph.nOriginX=0;
struGraph.nOriginY=0;
struGraph.uLineMode=LINEMODE;
LCDGraph(&struGraph);
for ( j=0;j<20;j++ ) _Delay(614);
LCDSetScreenBuffer(nScreenBuffer);
LCDCLS(); // 清除显示内存
}
uWork1=MCTRKEY;
CTRCLKEY=0;
if(uWork1==128)
{
keyflage=1-keyflage;
}
}
}
}
void TIME_init(void)
{
ioport unsigned int *tim0;
ioport unsigned int *prd0;
ioport unsigned int *tcr0;
ioport unsigned int *prsc0;
tim0 = (unsigned int *)0x1000;
prd0 = (unsigned int *)0x1001;
tcr0 = (unsigned int *)0x1002;
prsc0 = (unsigned int *)0x1003;
*tcr0 = 0x04f0;
*tim0 = 0;
*prd0 = 0x03ff;
*prsc0 = 2;
*tcr0 = 0x00e0;
}
void INTR_init( void )
{
IVPD=0xd0;
IVPH=0xd0;
IER0=0x10;
DBIER0 =0x10;
IFR0=0xffff;
asm(" BCLR INTM");
}
void interrupt Timer( void )
{
uWork0=ADCDATA; // 从FIFO中读取转换结果
uWork=uWork0&0x0f000;
if ( uWork==0 )
{
uWork0&=0x0fff; // 去掉高4位
nADBuf1[k0++]=uWork0; // 保存结果
DA_DATA_L=uWork0&0xff;
DA_DATA_H=((uWork0>>8)&0x0f)|DA_CHN1;
DA_CTL=0;
if ( k0>=ADCNUMBER )
{
for ( nAD=0;nAD<k0;nAD++ )
{
nGraphBuf1[nAD]=nADBuf1[nAD];//+2048;//+1352;
nGraphBuf1[nAD]&=0x0fff;
}
for ( nAD=k0;nAD<ADCNUMBER;nAD++ )
{
nGraphBuf1[nAD]=nADBuf1[k0-1];//+2048;//+1352;
nGraphBuf1[nAD]&=0x0fff;
}
k0=0;
}
ADCCTL = 0x9000; // 发送控制脉冲信号,进行下次转换 1通道只需送0x9000即可
}
if ( uWork==0x1000 )
{
uWork0&=0x0fff; // 去掉高4位
nADBuf2[k1++]=uWork0;
DA_DATA_L=uWork0&0xff;
DA_DATA_H=((uWork0>>8)&0x0f)|DA_CHN2;
DA_CTL=0;
if ( k1>=ADCNUMBER )
{
for ( nAD=0;nAD<k1;nAD++ )
{
nGraphBuf2[nAD]=nADBuf2[nAD];//+2048;//+1352;
nGraphBuf2[nAD]&=0x0fff;
}
for ( nAD=k1;nAD<ADCNUMBER;nAD++ )
{
nGraphBuf2[nAD]=nADBuf2[k1-1];//+2048;//+1352;
nGraphBuf2[nAD]&=0x0fff;
}
k1=0;
}
ADCCTL = 0x8000; // 发送控制脉冲信号,进行下次转换 0通道只需送0x8000即可
}
}
void InitADC()
{
ADCCLKCTL=0x1;//ADCCLKCTL=0x1;
ADCCLKDIV=0x1f00;//ADCCLKDIV=0x1f00;
}
float InputWave()
{
for ( i=IIRNUMBER-1;i>0;i-- )
{
fXn[i]=fXn[i-1];
fYn[i]=fYn[i-1];
}
fXn[0]=mbuffer[step]>>1;
step++;
if(step>=ADCNUMBER) step=0;
fYn[0]=0.0;
fSignal1+=fStepSignal1;
if ( fSignal2>=f2PI ) fSignal2-=f2PI;
return(fXn[0]);
}
float IIR()
{
float fSum;
fSum=0.0;
for ( i=0;i<IIRNUMBER;i++ )
{
fSum+=(fXn[i]*fAn[i]);
fSum+=(fYn[i]*fBn[i]);
}
return(fSum);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -