打印
[DSP编程]

2812用CpuTimer0定时触发AD采样,采样数值不变,给采样通道加的是正弦波

[复制链接]
2245|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzy03101271|  楼主 | 2015-5-27 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主程序:
#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;                //使能全局中断

付:如果采用连续采样方法,采样的数据是正弦波

相关帖子

沙发
zhangmangui| | 2015-5-27 22:55 | 只看该作者
先别用ADC触发   直接软件使能看看怎么样   
可以了    在修改触发条件

使用特权

评论回复
板凳
zhangmangui| | 2015-5-27 22:56 | 只看该作者
或者先看看定时器中断能进去不

使用特权

评论回复
地板
xzy03101271|  楼主 | 2015-5-28 16:16 | 只看该作者
zhangmangui 发表于 2015-5-27 22:56
或者先看看定时器中断能进去不

问题已经解决了,谢谢啦!我原来的AD初始化程序中有段代码如下
        AdcRegs.ADCTRL1.bit.RESET=1;                        //ADC复位
        asm("NOP");
        AdcRegs.ADCTRL1.bit.RESET=0;

在进行AD复位后,延时较短,查找资料说要等待12机器周期再配置相关寄存器,我把这段代码去掉后正常运行!

使用特权

评论回复
5
海中水| | 2015-5-28 16:51 | 只看该作者
xzy03101271 发表于 2015-5-28 16:16
问题已经解决了,谢谢啦!我原来的AD初始化程序中有段代码如下

在进行AD复位后,延时较短,查找资料说要 ...

恭喜,也很高兴分享你的经验,希望以后继续啊!

使用特权

评论回复
6
zhangmangui| | 2015-5-28 22:16 | 只看该作者
xzy03101271 发表于 2015-5-28 16:16
问题已经解决了,谢谢啦!我原来的AD初始化程序中有段代码如下

在进行AD复位后,延时较短,查找资料说要 ...

那就是没有复位成功

使用特权

评论回复
7
xzy03101271|  楼主 | 2015-5-28 22:52 | 只看该作者
zhangmangui 发表于 2015-5-28 22:16
那就是没有复位成功

嗯,是的。不过,ADC初始化中开始不进行ADC复位不知道会不会出现什么BUG。官方的ADC初始化函数里也只是有上电,也没见复位。

使用特权

评论回复
8
zhangmangui| | 2015-5-29 22:45 | 只看该作者
xzy03101271 发表于 2015-5-28 22:52
嗯,是的。不过,ADC初始化中开始不进行ADC复位不知道会不会出现什么BUG。官方的ADC初始化函数里也只是有 ...

应该没什么问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

97

帖子

1

粉丝