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

📄 ad.c

📁 基于DSP LF2407A的AD采样程序
💻 C
字号:
#include "2407c.h"                    

#define ADCNUMBER 256

void interrupt gptime1(void);	/* 中断服务程序,用于设置保存标志 */
void ADInit(void);		/* 初始化A/D转换模块和通用定时器1 */

ioport unsigned char port000c;	/* I/O端口用于设置ICETEK-2407-A板上指示灯 */
unsigned int uWork,uWork1,nADCount,nLed,*pResult1,*pResult2;
int nNewConvert,nWork;
int B=0,BB=0,ii=0,jj=0,c=0,i=0,j=0,k=0,number1=0,number2=0;
unsigned int nADCIn0[ADCNUMBER];	/* 存储区1,保存通道ADCIN0的转换结果,循环保存 */
unsigned int nADCIn1[ADCNUMBER];	/* 存储区2,保存通道ADCIN1的转换结果,循环保存 */
unsigned int D[ADCNUMBER];
unsigned int E[ADCNUMBER];
main()
{   
	asm(" CLRC 	SXM");	/* 清标志,关中断 */
	asm(" CLRC 	OVM");
	asm(" CLRC 	CNF");

	pResult1=RESULT0;
	pResult2=RESULT1;
	nNewConvert=0;
	
	*WDCR=0x6f;
	*WDKEY=0x5555;
	*WDKEY=0xaaaa;	/* 关闭看门狗中断 */
	*SCSR1=0x81fe;	/* 打开所有外设,设置时钟频率为40MHz */
	uWork=(*WSGR);	/* 设置I/O等待状态为0  */
	uWork&=0x0fe3f;
	(*WSGR)=uWork;
	ADInit();	/* 初始化A/D相关设备 */

	*IMR=3;		/* 使能定时器中断 */
	*IFR=0xffff;	/* 清所有中断标志    */
	asm(" clrc INTM");	/* 开中断 */         
	while ( 1 )
	{
		if ( nNewConvert )	/* 如果保存标志置位,以下开始转换和保存转换结果 */
		{
			nNewConvert=0;		/* 清保存标志 */
			uWork=(*pResult1);	/* 取ADCINT0通道转换结果 */
			uWork>>=6;		/* 移位去掉低6位 */
			nADCIn0[nADCount]=uWork;/* 保存结果 */
			uWork=(*pResult2);	/* 取ADCINT1通道转换结果 */
			uWork>>=6;		/* 移位去掉低6位 */
			nADCIn1[nADCount]=uWork;/* 保存结果 */
			nADCount++;
			if ( nADCount>=ADCNUMBER )	/* 缓冲区满后设置指示灯闪烁 */
			{
				nADCount=0;             /* 中断位置 */
				nWork++;
				if ( nWork>=16 )
				{
					nWork=0;
					nLed++; nLed&=0x0f;
					port000c=nLed;
				}
				for ( i=0;i<ADCNUMBER;i++ )
 {   if (nADCIn0[i]<0)
    {B=B+nADCIn0[i];
    j=j+1;}
    
    if (nADCIn0[i]<0&&nADCIn0[i+1]>0)  
        {c=B/j;
        for (k=(i-j+1);k<i+1;k++)
            {if (nADCIn0[k]<c&&nADCIn0[k+1]>c)
                number1=number1+1;
            }
        
        D[ii]=number1;//下降沿沿周期的跳变数
        number1=0;
        ii=ii+1;
        B=0;
        j=0;
    }
    
    if (nADCIn0[i]>0)
    {BB=BB+nADCIn0[i];
    j=j+1;}
    
    if (nADCIn0[i]>0&&nADCIn0[i+1]<0)
        {c=BB/j;
         for (k=(i-j+1);k<i+1;k++)
            {if (nADCIn0[k]>c&&nADCIn0[k+1]<c)
                number2=number2+1;
            }
        
        E[jj]=number2; //上升沿周期的跳变数
        number2=0;
        jj=jj+1;
        BB=0;
        j=0;
    }
    
}
			}
		}
	}	
}               

void ADInit(void)       /* 初始化设置 */
{
	int m;

	for ( m=0;m<ADCNUMBER;m++ )	/* 缓冲区清0 */
		nADCIn0[m]=nADCIn1[m]=D[m]=E[m]=0;
	
	
	/*for ( m=0;i<ADCNUMBER;m++ )	
		nADCIn0[i]=nADCIn1[i]=0;
	
	
	for ( m=0;i<ADCNUMBER;m++ )	
		nADCIn0[i]=nADCIn1[i]=0;*/
	
	
	port000c=0;			/* 关指示灯 */
		
	*ADCTRL1= 0x2f40;	/* 设置连续转换模式 */
	*MAXCONV = 0x1;		/* 每次完成转换两个通道 */
	*CHSELSEQ1=0xc4;	/* 转换次序,先ADCIN4,再ADCIN11 */
	*ADCTRL2= 0x2000;    	/* 启动转换 */
	nADCount=nLed=nWork=0;
	;
	
				/* 以下设置通用定时器参数 */
	*EVAIMRA = 0x80;	/* 使能T1PINT */
	*EVAIFRA = 0xffff;	/* 清中断标志 */
	*GPTCONA = 0x0100;	
	*T1PR    = 2000;	/* 保存结果周期=2000*25ns=50us=20KHz */
	*T1CNT   = 0;		/* 计数器从0开始计数 */
	*T1CON   = 0x1040;	/* 连续增计数方式,启动计数器 */
	
}

void interrupt gptime1(void)
{
   uWork1=(*PIVR);
   switch ( uWork1 )
   {  
   		case 0x27:
   		{
			nNewConvert=1;	/* 设置保存标志 */
			(*EVAIFRA)=0x80;/* 清中断标志位 */
   		   	break;
   		}
   }
}                       

⌨️ 快捷键说明

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