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

📄 ad.c

📁 源码完成TMS320x2407AD转换功能
💻 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;
unsigned int nADCIn0[ADCNUMBER];	/* 存储区1,保存通道ADCIN0的转换结果,循环保存 */
unsigned int nADCIn1[ADCNUMBER];	/* 存储区2,保存通道ADCIN1的转换结果,循环保存 */
main()
{   
	asm(" CLRC 	SXM");	/* 清标志,关中断 */
	asm(" CLRC 	OVM");
	asm(" CLRC 	CNF");

	pResult1=RESULT0;
	pResult2=RESULT2;
	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;
				}
			}
		}
	}	
}               

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

	for ( i=0;i<ADCNUMBER;i++ )	/* 缓冲区清0 */
		nADCIn0[i]=nADCIn1[i]=0;
	port000c=0;			/* 关指示灯 */
		
	*ADCTRL1= 0x2040;	/* 设置连续转换模式 */
	*MAXCONV = 0x2;		/* 每次完成转换两个通道 */
	*CHSELSEQ1=0x3210;	/* 转换次序,先ADCIN0,再ADCIN1 */
	*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 + -