TMS320LF2407 AD定时转换
0赞
发表于 2011/6/6 22:03:11
阅读(2049)
TMS320LF2407dsp片上自带ad转换模块,结合定时器可以实现数据定时采样,设置定时器中断触发ad转换,并记录转换次数。程序代码如下:
#include "2407c.h"
#define ADCNUMBER 256
void interrupt gptime1(void); /* 中断服务程序,用于设置保存标志 */
void ADInit(void); /* 初始化A/D转换模块和通用定时器1 */
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");
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=RESULT1;
nNewConvert=0;
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa; /* 关闭看门狗中断 */
*SCSR1=0x82fe; /* 打开所有外设,设置时钟频率为40MHz */
uWork=(*WSGR); /* 设置I/O等待状态为0 */
uWork&=0x0fe3f;
(*WSGR)=uWork;
ADInit(); /* 初始化A/D相关设备 */
pResult2=RESULT1;
nNewConvert=0;
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa; /* 关闭看门狗中断 */
*SCSR1=0x82fe; /* 打开所有外设,设置时钟频率为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;
}
}
}
}
}
*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;
{
int i;
for ( i=0;inADCIn0[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; /* 连续增计数方式,启动计数器 */
}
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;
}
}
}
{
uWork1=(*PIVR);
switch ( uWork1 )
{
case 0x27:
{
nNewConvert=1; /* 设置保存标志 */
(*EVAIFRA)=0x80;/* 清中断标志位 */
break;
}
}
}