原创 【TI博客大赛】中文原创DSP笔记:TMS320CF2812 DSP ADC转换应用程序入门

2012-9-20 09:23 4954 14 14 分类: 处理器与DSP

20120920091901845.jpg   

           TMS320CF2812 ADC模块具有16路12位流水线模数转换模块(ADC).TMS320CF2812 DSP内部就有ADC转换资源。包含前段模拟多路复用器(MUX)采样保持S/H电路、转换内核、稳压器以及其他模拟支持电路。
数字电路包含可编程序列发生器、结果寄存器、模拟电路接口、器件外围总线接口已经其他片上模块的接口。模数转换
(ADC)模块可以直接用于电机或运动控制场合。
软件:软件立即启动(使用SOC的SEQn位)。
EVA:事件管理器A(在EVA中有多个事件源)。
EVB:事件管理器B(在EVB中有多个事件源)。
排序器可工作在启动/停止模式,允许多个按时间排序的触发源使转换同步。
EVA和EVB可分别独立地触发SEQ1和SEQ2(仅用在双排序器模式)。
外部:(ADC SOC)引脚。
模拟输入:0V―3V

20120919085756988.jpg

 

        初始化TMS320CF2812 DSP的ADC模块,以及转换程序。并且对所有模拟输入通道进行转换,转换的结果可以在RESULTSn寄存器中获得。使用的用户可以访问该寄存器。ADC以16状态排序器来实现操作,一旦排序到达EOS(序列的结束)时,转换结束,ADC转换程序实现如下:

//
//文件   Example_281xAdcSOC.c
//
//DSP2812 ADC 应用程序
//本学习应用程序,中断是要被使能,并且EVA设置SEQ1为产生一个周期的ADC SOC信号。
//
//变量:
//Voltage1[10]      最后的10次ADCRESULT0 值
//Voltage2[10]      最后的10次ADCRESULT1 值
//conversioncount   当前的转换结果计数次数0-9  
//loopcount         空闲循环计数器
#include 〝DSP281x_Device.h 〞        //DSP281x headerfile
include file
#include 〝DSP281x_examples.h 〞        //DSP281x examples
include file

//程序中函数类型声明
interrupt vold adc_isr(void);

//本程序全局中变量:
uint16 loopcount;
uint16 conversioncount;
uint16 voltagel1[10];
uint16 voltagel2[10];

main()
{
//第一步:初始化系统控制PLL,watchDog,使能外设时钟
//本程序中的初始化系统控制函数可以在DSP281x_sysctrl.c找到
initsysctrl();

//对于本程序,设置HSPCLK为SYSCLKOUT/6(假设SYSCLKOUT为150Mhz,HSPCLK为25Mhz)
EALLOW;

//第二步:初始化GPIO
//该程序函数可以在DSP281x_piectrl.c文件中找到
initGpio();//本程序不需要这一步

//第三步清除所有中断,并初始化PIE向量表
//禁止CPU中断
 DINT;

//初始化PIE控制寄存器到默认状态,所有PIE中断的默认状态为禁止,并且标志位被清除
//该程序函数可以在DSP281x_piectrl.c文件中找到
  initipiectrl();

//禁止CPU中断,清除所有CPU中断标志
  IER ﹦ 0X0000;
  IER ﹦ 0X0000;
-
//使用指向外部中断服务程序(ISR)的指针初始化PIE向量表
//这将对所有表单元进行操作,即使本程序不使用的中断。这对于调试是很有用的
//外部中断服务程序(ISR)可以在DSP281x_defaultisr.c文件中找到
  initipiectrl();

//在本程序使用的中断被重新影射到文件中的ISR函数
  EALLOW;                        //在写EALLOW保护寄存器,该语句是必须的
  pievecttable.ADCINT = &adc_isr;
  EDIS;                          //当禁止写EALLOW保护寄存器,该语句是必须的

//第四步:初始化元件的外设
//下面的函数可以在DSP281x_initperipherals.c文件中找到
//initperipherals();            //本程序是不必需要的
  initadc();                    //本程序是要初始化ADC

//第五步:用户代码,使能中断


//使能PIE中的ADCINT
  piectrlregs.PIEIER1.bit.INTx6 = 1;
  IER ︳﹦M_INT1;               //使能CPU中断1
  EINT;                         //使能全局中断INTM
  ERTM;                         //使能全局实时中断DBGM

Loopcount = 0;
conversioncount = 0;

//配置ADC
  Adcregs.ADCMAXCONV.all = 0x0001;       // 在设置SEQ1设置2个转换
  Adcregs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // 设置ADCINA3作为第一次SEQ1转换
  Adcregs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // 设置ADCINA2作为第二次SEQ1转换
  Adcregs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // 设置EVASOC,从而开始SEQ1
  Adcregs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // 设置SEQ1中断,(每一个EOS)

//配置EVA
//假如EVA时钟已经在initsysctrl()被使能
  Evaregs.T1CMPR = 0x0080;                // 设置T1比较值   
  Evaregs.T1PR = 0xFFFF;                  // 设置周期寄存器
  Evaregs.T1CON.all = 0x1042;             // 使能定时器1比较(向上计数模式)

//等待ADC中断
  while(1)
  ﹛
    loopcount++;
   ﹜

interrupt void adc_isr(void)

  voltage1[conversioncount] = adcregs.ADCRSULT0 ﹥﹥4;
  voltage2[conversioncount] = adcregs.ADCRSULT1 ﹥﹥4;

//如果已经记录40次转换,则需要重新开始
if(conversioncount == 9)

  conversioncount = 0;

else conversioncount++;

//重新初始化下一个ADC序列
adcregs.ADCTRL2.bit.RST_SEQ1 = 0;        //复位SEQ1
adcregs.ADCST.bit.INT_SEQ1_CLR = 1;      //清除INT SEQ1 位
piectrlregs.PIEACK.all = PIEACK_GROUP1;   //应答PIE的中断

return;
 

请点击链接下载【TMS320CF2812 DSP_ADC内部方框图】

 

文章评论0条评论)

登录后参与讨论
我要评论
0
14
关闭 站长推荐上一条 /2 下一条