專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

TMS320F2812外設(shè)例程系列之Adc

作者:佚名   來(lái)源:不詳   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月16日   【字體:

//#####################################################################

//文件:  Example_281xAdcSeqModeTest.c
//功能:  對(duì)通道A0的輸入信號(hào)進(jìn)行AD轉(zhuǎn)換
//#####################################################################
#include "DSP281x_Device.h"       //DSP2812 頭文件
#include "DSP281x_Examples.h"   
//AD 定義
#define ADC_MODCLK 0x3   //HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25MHz
#define ADC_CKPS 0x1 //ADC 模塊時(shí)鐘 = HSPCLK/2*ADC_CKPS = 25MHz/(1*2) = 12.5MHz
#define ADC_SHCLK 0xf   //ADC模塊的采樣/保持周期 = 16 ADC clocks
#define AVG        1000 //平均采樣界限
#define BUF_SIZE  2048 //采樣緩沖器長(zhǎng)度
//全局變量
Uint16 SampleTable[BUF_SIZE];
//主程序
main() 
{
    Uint16 i;
  //步驟1.初始化系統(tǒng)控制:PLL、看門(mén)狗、使能外設(shè)時(shí)鐘
    InitSysCtrl();
  //本例的時(shí)鐘配置      
    EALLOW;
    SysCtrlRegs.HISPCP.all = ADC_MODCLK; //HSPCLK = SYSCLKOUT/ADC_MODCLK
    EDIS;
  //步驟2.初始化GPIO
  //InitGpio();       //本例中略過(guò)  
  //步驟3.清除所有中斷并初始化PIE控制寄存器,關(guān)CPU中斷
    DINT;               //關(guān)全局中斷
    InitPieCtrl();
    IER = 0x0000;       //關(guān)所有CPU級(jí)中斷
    IFR = 0x0000;       //清除CPU所有中斷標(biāo)志
  //初始化中斷向量表
    InitPieVectTable();
  //步驟4.初始化所有外設(shè),本例中只初始化ADC
  //InitPeripherals(); //本例中不需要
    InitAdc();           //初始化AD
  //本例中 ADC的設(shè)置
    AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
    AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;     
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;       //配置為級(jí)聯(lián)模式
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    AdcRegs.ADCTRL1.bit.CONT_RUN = 1;         //配置為連續(xù)轉(zhuǎn)換模式
  //步驟5.使能CPU中斷
  //初始化 SampleTable 為0
    for (i=0; i<BUF_SIZE; i++)
    {
      SampleTable[i] = 0;
    }
    //啟動(dòng)序列器1
    AdcRegs.ADCTRL2.all = 0x2000;
    //獲取 ADC 轉(zhuǎn)換數(shù)據(jù)并裝載到SampleTable數(shù)組  
    while(1)
    {  
      for (i=0; i<AVG; i++)
    {
        while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}     //等待中斷
        //Software wait = (HISPCP*2) * (ADCCLKPS*2) * (CPS+1) cycles
        //           =(3*2)*(1*2)*(0+1)=12cycles
        asm(" RPT #11 || NOP");
        AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
        SampleTable[i] =((AdcRegs.ADCRESULT0>>4) ); 
      }
    }
}
 
關(guān)閉窗口