主程序:
- #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; //使能全局中断
付:如果采用连续采样方法,采样的数据是正弦波
|