garfield

TMS320LF2407 AD定时转换

0
阅读(2829)

TMS320LF2407dsp片上自带ad转换模块,结合定时器可以实现数据定时采样,设置定时器中断触发ad转换,并记录转换次数。程序代码如下:

#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=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;
    }
   }
  }
 } 
}              
void ADInit(void)       /* 初始化设置 */
{
 int i;
 for ( i=0;i<ADCNUMBER;i++ ) /* 缓冲区清0 */
  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;
     }
   }
}