请教关于F2812的AD采样问题

2019-03-26 16:00发布

这是我写的一个AD采样的程序,目的是采样NUM个点之后停止,但是结果有一些问题,想请教问题出在什么地方。
#include "DSP28_Device.h"
#define NUM 1800

interrupt void adc_isr(void);
float fIn[NUM];
int count=0;
int k;
int flag=0;

void main(void)
{   
    InitSysCtrl();

    DINT;
    IER = 0x0000;
    IFR = 0x0000;

    InitPieCtrl();
    InitPieVectTable();
    InitPeripherals();

    EvaRegs.T1CNT=0;
    EvaRegs.T1PR=18;
    EvaRegs.GPTCONA.bit.T1TOADC=1;       //下溢中断启动AD
    EvaRegs.T1CON.all=0x1242;  //TMODE=10,TCLKS=00,TPS=2,EVACLK=75M/4=18.75MHz,装载条件计数器值为0,使能定时器比较操作,定时器使能

    InitAdc();
      AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
    AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
    AdcRegs.MAX_CONV.all=0x0;
    AdcRegs.CHSELSEQ1.bit.CONV00=0x2;
    AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;  //使能EVASOC启动SEQ1
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;  //使能SEQ1中断

    EALLOW;
    PieVectTable.ADCINT=&adc_isr;
    EDIS;

    PieCtrl.PIEIER1.bit.INTx6=1;

    IER|=0x0001;  //CPU级中断

    EINT;
    ERTM;

    while ( 1 )
        {
            if(flag==1)
                {
                        for(k=0;k<NUM;k++)
            {
                fIn[k]=fIn[k]*3/4095.0/16.0;
                        }
                    flag=0;
                }
        }
}

interrupt void adc_isr(void)
{
    fIn[count]=AdcRegs.RESULT0;
    PieCtrl.PIEACK.all=PIEACK_GROUP1;
    AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
    AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
    count++;
    if(count==NUM)
        {
                    flag=1;
            AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;
        }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
onepiece820
1楼-- · 2019-03-27 02:12
< void InitAdc(void)
{
        unsigned int i;
       
        AdcRegs.ADCTRL1.bit.RESET=1;        //ADC模块软件复位
        NOP;
        AdcRegs.ADCTRL1.bit.RESET=0;        //无影响
        AdcRegs.ADCTRL1.bit.SUSMOD=3;
        AdcRegs.ADCTRL1.bit.ACQ_PS=1;        //采样窗的宽度,范围0-15
        AdcRegs.ADCTRL1.bit.CPS=0;                //ADC内核时钟定标
        AdcRegs.ADCTRL1.bit.CONT_RUN=0;        //0表示启动/停止模式,写1表示连续转换模式
        AdcRegs.ADCTRL1.bit.SEQ_CASC=1;        //1为级联(单排序)模式,0为双排序模式
       
        AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;  //0表示带限和参考电源关,3表示带限和参考电源开
        for(i=0;i<10000;i++)        NOP;
        AdcRegs.ADCTRL3.bit.ADCPWDN=1;        //ADC内核的模拟电路的电源开
        for(i=0;i<5000;i++)        NOP;
        AdcRegs.ADCTRL3.bit.ADCCLKPS=1;  //内核时钟定标,配合AdcRegs.ADCTRL1.bit.CPS
        AdcRegs.ADCTRL3.bit.SMODE_SEL=0;  //0为顺序采样模式,1为同时采样模式
       
        AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;//写1清SEQ1中断标志位,写0无影响
        AdcRegs.ADC_ST_FLAG.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;         //SEQ1中断使能
        AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;                 //选择排序器1软件触发
        AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;  //每一个SEQ1结束时置位中断标志
        AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;         //禁止EVA触发SEQ1
        AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;         //禁止外部触发SEQ1
        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;
}

SysCtrlRegs.HISPCP.all = 0x0001;

一周热门 更多>