主程序:
#include"DSP281x_Device.h"
#include"DSP281x_Examples.h"
#include"DSP281x_GlobalPrototypes.h"
float AdcData[256];
Uint16 index=0;
void main(void)
{
InitSysCtrl();
DINT;
IER=0x0000; //禁止CPU中断
IFR=0x0000; //清除CPU中断标志
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable();//初始化PIE中断向量表
InitCpuTimers(); //初始化定时器相关配置
InitAdc(); //初始化ADC相关配置
PieCtrlRegs.PIEIER1.bit.INTx7=1;//使能CPU定时器0 PIE中断
PieCtrlRegs.PIEIER1.bit.INTx6=1;//使能PIE中断中ADC中断
ConfigCpuTimer(&CpuTimer0,150,1000);
IER|=M_INT1; //开CPU中断
EINT; //使能全局中断
ERTM; //使能实时中断
StartCpuTimer0(); //启动定时器0
// AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//启动转换
while(1);
}
AD初始化程序:
void InitAdc(void)
{
extern void DSP28x_usDelay(Uint32 Count);
// To powerup the ADC the ADCENCLK bit should be set first to enable
// clocks, followed by powering up the bandgap and reference circuitry.
// After a 5ms delay the rest of the ADC can be powered up. After ADC
// powerup, another 20us delay is required before performing the first
// ADC conversion. Please note that for the delay function below to
// operate correctly the CPU_CLOCK_SPEED define statement in the
// DSP28_Examples.h file must contain the correct CPU clock period in
// nanoseconds. For example:
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // Power up bandgap/reference circuitry
DELAY_US(ADC_usDELAY); // Delay before powering up rest of ADC
AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Power up rest of ADC
DELAY_US(ADC_usDELAY2); // Delay after powering up ADC
AdcRegs.ADCTRL1.bit.RESET=1; //ADC复位
asm("NOP");
AdcRegs.ADCTRL1.bit.RESET=0;
/*************ADC控制寄存器1设置***************/
// AdcRegs.ADCTRL1.bit.SUSMOD=3; //仿真挂起时,序列发生器和其它轮询程序逻辑立即停止
AdcRegs.ADCTRL1.bit.ACQ_PS=2; //ADC采样窗口大小为3个ADCLK
AdcRegs.ADCTRL1.bit.CPS=0; //核时钟预定标器,未进行2分频
AdcRegs.ADCTRL1.bit.CONT_RUN=0; //运行于启动/停止模式
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //选择级联模式
/*************ADC控制寄存器3设置**************/
AdcRegs.ADCTRL3.bit.ADCCLKPS=15; //ADCLK=HSPCLK/30=75MHz/30=2.5MHz
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //采用顺序采样模式
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=1; //选择使用一个通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0; //选择ADCINA0通道作为采样通道
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除SEQ1中断标志位
// AdcRegs.ADCST.bit.INT_SEQ2_CLR=1; //清除SEQ2的中断标志
/************ADC控制寄存器2设置**************/
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //启动SEQ1中断
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //每个SEQ1序列结束产生一个中断
// AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0; //SEQ1不能由EVA触发启动
}
定时器中断程序:
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位序列发生器
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //进入定时器0一次,启动一次定时器中断
CpuTimer0Regs.TCR.bit.TIF=1; //清除定时器中断标志
PieCtrlRegs.PIEACK.bit.ACK1=1; //允许响应同组其他中断
ADC中断程序:
// Insert ISR Code here
AdcData[index]=((float)AdcRegs.ADCRESULT0)*3.0/65520.0;
index++;
// if(index>=256)
// {index=0;}
/******************用于调试程序用******************/
#if 1
if(index>=256)
{
StopCpuTimer0();
while(1);
}
#endif
/********************************************/
PieCtrlRegs.PIEACK.bit.ACK1=1; //响应PIE同组中断
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除AD中断标志位
// AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位序列发生器
EINT; //使能全局中断
付:如果采用连续采样方法,采样的数据是正弦波
|