//#####################################################################
//文件: Example_281xAdcSeqModeTest.c
//功能: 對通道A0的輸入信號進行AD轉換
//#####################################################################
#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 模塊時鐘 = HSPCLK/2*ADC_CKPS = 25MHz/(1*2) = 12.5MHz
#define ADC_SHCLK 0xf //ADC模塊的采樣/保持周期 = 16 ADC clocks
#define AVG 1000 //平均采樣界限
#define BUF_SIZE 2048 //采樣緩沖器長度
//全局變量
Uint16 SampleTable[BUF_SIZE];
//主程序
main()
{
Uint16 i;
//步驟1.初始化系統控制:PLL、看門狗、使能外設時鐘
InitSysCtrl();
//本例的時鐘配置
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; //HSPCLK = SYSCLKOUT/ADC_MODCLK
EDIS;
//步驟2.初始化GPIO
//InitGpio(); //本例中略過
//步驟3.清除所有中斷并初始化PIE控制寄存器,關CPU中斷
DINT; //關全局中斷
InitPieCtrl();
IER = 0x0000; //關所有CPU級中斷
IFR = 0x0000; //清除CPU所有中斷標志
//初始化中斷向量表
InitPieVectTable();
//步驟4.初始化所有外設,本例中只初始化ADC
//InitPeripherals(); //本例中不需要
InitAdc(); //初始化AD
//本例中 ADC的設置
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //配置為級聯模式
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //配置為連續轉換模式
//步驟5.使能CPU中斷
//初始化 SampleTable 為0
for (i=0; i<BUF_SIZE; i++)
{
SampleTable[i] = 0;
}
//啟動序列器1
AdcRegs.ADCTRL2.all = 0x2000;
//獲取 ADC 轉換數據并裝載到SampleTable數組
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) );
}
}
}