2744|1

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教关于F2812的AD采样问题 [复制链接]

这是我写的一个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             {
                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;
        }
}
点赞 关注
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
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;
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表