使用2812对正弦波进行采样,从通道A0输入1KHZ的正弦波,用EV周期中断启动AD转换,采样频率设为100KHZ,但是得出的波形类似脉冲,望大侠帮助啊,哪儿有问题。。。
#include "DSP281x_Device.h"
float
a1[100]; //存储转换后的值;
//本程序只针对了ADCINA0信道
unsigned int a2=0;
//采样次数的统计
float
adclo=0.0;
//0位调整
unsigned int i=0;
interrupt void ad(void); //AD中断子程序
main()
{
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EALLOW;
PieVectTable.ADCINT=&ad; //中断向量表中的ADCINT中断指向AD中断函数
EDIS;
InitAdc();
InitEv();
IER |= M_INT1;
//使能中断第一组
PieCtrlRegs.PIEIER1.bit.INTx6=1; //第一组的第6位正好ADINT
EINT;
ERTM;
EvaRegs.T1CON.bit.TENABLE=1;
for(;;);
}
/*void delay(unsigned int t)
{
while(t>0)
t--;
}*/
interrupt void ad(void)
{
adclo=0;
//每块板的零位不一样,在这儿设一个合适的数以扣掉零位
IFR=0x0000;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
a2++;
a1[i]=((AdcRegs.ADCRESULT0>>4)*3)/4095.0+adclo;
if(i>=100)
{
EvaRegs.T1CON.bit.TENABLE=0; //关定时器1
i=0; //在这儿设一断点,程序执行到这儿停下后,查看变量数组a1即可看到ADC各通道的采样值。
}
else
i++;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
EINT;
}
void InitEv(void)
{
EvaRegs.T1PR=750;
EvaRegs.GPTCONA.bit.T1TOADC=2; //周期中断启动AD;
EvaRegs.T1CON.bit.TMODE=2; //连续增模式;
EvaRegs.T1CON.bit.TPS=0;
EvaRegs.T1CON.bit.TCLKS10=00; //使用内部时钟;
EvaRegs.T1CON.bit.TCLD10=2;
EvaRegs.T1CNT=0x00;
EvaRegs.EVAIMRA.bit.T1PINT=1;
}
#define ADC_usDELAY 8000L
#define ADC_usDELAY2 20L
void InitAdc(void)
{
extern void DSP28x_usDelay(Uint32 Count);
AdcRegs.ADCTRL1.bit.RESET=1;
//ADC模块软件复位
DELAY_US(ADC_usDELAY2);
AdcRegs.ADCTRL1.bit.RESET=0;
//无影响
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //0表示带限和参考电源关,3表示带限和参考电源开
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
//ADC内核的模拟电路的电源开
DELAY_US(ADC_usDELAY2);
AdcRegs.ADCTRL1.bit.SUSMOD=3;
//仿真挂起方式
AdcRegs.ADCTRL1.bit.ACQ_PS=3;
//采样窗的宽度,范围0-15。
AdcRegs.ADCTRL1.bit.CPS=1;
//ADC内核时钟定标,
AdcRegs.ADCTRL1.bit.CONT_RUN=0;
//0表示启动/停止模式,写1表示连续转换模式
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
//1为级联(单排序)模式,0为双排序模式
AdcRegs.ADCTRL3.bit.ADCCLKPS=15; //内核时钟定标。配合AdcRegs.ADCTRL1.bit.CPS
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //0为顺序采样模式,1为同时采样模式
AdcRegs.ADCMAXCONV.all=0x0000; //一次自动转换时的最大转换数
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
//AdcRegs.ADCCHSELSEQ1.bit.CONV01=1;
//AdcRegs.ADCCHSELSEQ1.bit.CONV02=2;
//AdcRegs.ADCCHSELSEQ1.bit.CONV03=3;
//AdcRegs.ADCCHSELSEQ2.bit.CONV04=4;
//AdcRegs.ADCCHSELSEQ2.bit.CONV05=5;
//AdcRegs.ADCCHSELSEQ2.bit.CONV06=6;
//AdcRegs.ADCCHSELSEQ2.bit.CONV07=7;
//AdcRegs.ADCCHSELSEQ3.bit.CONV08=8;
//AdcRegs.ADCCHSELSEQ3.bit.CONV09=9;
//AdcRegs.ADCCHSELSEQ3.bit.CONV10=10;
//AdcRegs.ADCCHSELSEQ3.bit.CONV11=11;
//AdcRegs.ADCCHSELSEQ4.bit.CONV12=12;
//AdcRegs.ADCCHSELSEQ4.bit.CONV13=13;
//AdcRegs.ADCCHSELSEQ4.bit.CONV14=14;
//AdcRegs.ADCCHSELSEQ4.bit.CONV15=15;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//写1清SEQ1中断标志位,写0无影响
//AdcRegs.ADCST.bit.INT_SEQ2_CLR=1;//写1清SEQ2中断标志位,写0无影响
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;
AdcRegs.ADCTRL2.bit.RST_SEQ1=0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //EQ1中断使能;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=0;
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; //EVa触发SEQ1
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;
//AdcRegs.ADCTRL2.bit.RST_SEQ2=0;
//AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;
//AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;
//AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;
//AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;
}