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

[复制链接]
 楼主| xzy03101271 发表于 2015-5-27 10:28 | 显示全部楼层 |阅读模式
主程序:
  1. #include"DSP281x_Device.h"
  2. #include"DSP281x_Examples.h"
  3. #include"DSP281x_GlobalPrototypes.h"
  4. float AdcData[256];
  5. Uint16 index=0;
  6. void main(void)
  7. {
  8.         InitSysCtrl();
  9.         DINT;
  10.         IER=0x0000;                //禁止CPU中断
  11.         IFR=0x0000;                //清除CPU中断标志
  12.         InitPieCtrl();        //初始化PIE控制寄存器
  13.         InitPieVectTable();//初始化PIE中断向量表
  14.         InitCpuTimers();        //初始化定时器相关配置
  15.         InitAdc();                        //初始化ADC相关配置
  16.         PieCtrlRegs.PIEIER1.bit.INTx7=1;//使能CPU定时器0 PIE中断
  17.         PieCtrlRegs.PIEIER1.bit.INTx6=1;//使能PIE中断中ADC中断
  18.         ConfigCpuTimer(&CpuTimer0,150,1000);
  19.         IER|=M_INT1;                                //开CPU中断
  20.         EINT;                                                //使能全局中断
  21.         ERTM;                                                //使能实时中断
  22.         StartCpuTimer0();                        //启动定时器0
  23. //        AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//启动转换
  24.         while(1);
  25. }

AD初始化程序:
  1. void InitAdc(void)
  2. {
  3.         extern void DSP28x_usDelay(Uint32 Count);
  4.        
  5.     // To powerup the ADC the ADCENCLK bit should be set first to enable
  6.     // clocks, followed by powering up the bandgap and reference circuitry.
  7.     // After a 5ms delay the rest of the ADC can be powered up. After ADC
  8.     // powerup, another 20us delay is required before performing the first
  9.     // ADC conversion. Please note that for the delay function below to
  10.     // operate correctly the CPU_CLOCK_SPEED define statement in the
  11.     // DSP28_Examples.h file must contain the correct CPU clock period in
  12.     // nanoseconds. For example:

  13.         AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3;        // Power up bandgap/reference circuitry
  14.         DELAY_US(ADC_usDELAY);                  // Delay before powering up rest of ADC
  15.         AdcRegs.ADCTRL3.bit.ADCPWDN = 1;                // Power up rest of ADC
  16.         DELAY_US(ADC_usDELAY2);                 // Delay after powering up ADC

  17.         AdcRegs.ADCTRL1.bit.RESET=1;                        //ADC复位
  18.         asm("NOP");
  19.         AdcRegs.ADCTRL1.bit.RESET=0;
  20. /*************ADC控制寄存器1设置***************/
  21. //        AdcRegs.ADCTRL1.bit.SUSMOD=3;                        //仿真挂起时,序列发生器和其它轮询程序逻辑立即停止
  22.         AdcRegs.ADCTRL1.bit.ACQ_PS=2;                        //ADC采样窗口大小为3个ADCLK
  23.         AdcRegs.ADCTRL1.bit.CPS=0;                                //核时钟预定标器,未进行2分频
  24.         AdcRegs.ADCTRL1.bit.CONT_RUN=0;                        //运行于启动/停止模式
  25.         AdcRegs.ADCTRL1.bit.SEQ_CASC=1;                        //选择级联模式
  26. /*************ADC控制寄存器3设置**************/
  27.         AdcRegs.ADCTRL3.bit.ADCCLKPS=15;                //ADCLK=HSPCLK/30=75MHz/30=2.5MHz
  28.         AdcRegs.ADCTRL3.bit.SMODE_SEL=0;                //采用顺序采样模式


  29.         AdcRegs.ADCMAXCONV.bit.MAX_CONV1=1;                //选择使用一个通道
  30.         AdcRegs.ADCCHSELSEQ1.bit.CONV00=0;                //选择ADCINA0通道作为采样通道
  31.         AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;                //清除SEQ1中断标志位
  32. //        AdcRegs.ADCST.bit.INT_SEQ2_CLR=1;                //清除SEQ2的中断标志

  33. /************ADC控制寄存器2设置**************/
  34.         AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;                //启动SEQ1中断
  35.         AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;                //每个SEQ1序列结束产生一个中断
  36. //        AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;                //SEQ1不能由EVA触发启动

  37. }       

定时器中断程序:
  1.         AdcRegs.ADCTRL2.bit.RST_SEQ1=1;                //复位序列发生器
  2.         AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;                        //进入定时器0一次,启动一次定时器中断
  3.         CpuTimer0Regs.TCR.bit.TIF=1;                        //清除定时器中断标志
  4.         PieCtrlRegs.PIEACK.bit.ACK1=1;                        //允许响应同组其他中断

ADC中断程序:
  1.   // Insert ISR Code here
  2.         AdcData[index]=((float)AdcRegs.ADCRESULT0)*3.0/65520.0;
  3.         index++;
  4. //        if(index>=256)
  5. //        {index=0;}
  6. /******************用于调试程序用******************/
  7. #if 1
  8.         if(index>=256)
  9.         {
  10.                 StopCpuTimer0();
  11.                 while(1);
  12.         }
  13. #endif
  14. /********************************************/

  15.         PieCtrlRegs.PIEACK.bit.ACK1=1;                //响应PIE同组中断
  16.         AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;        //清除AD中断标志位
  17. //        AdcRegs.ADCTRL2.bit.RST_SEQ1=1;                //复位序列发生器
  18.         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初始化程序中有段代码如下
  1.         AdcRegs.ADCTRL1.bit.RESET=1;                        //ADC复位
  2.         asm("NOP");
  3.         AdcRegs.ADCTRL1.bit.RESET=0;

在进行AD复位后,延时较短,查找资料说要等待12机器周期再配置相关寄存器,我把这段代码去掉后正常运行!
海中水 发表于 2015-5-28 16:51 | 显示全部楼层
xzy03101271 发表于 2015-5-28 16:16
问题已经解决了,谢谢啦!我原来的AD初始化程序中有段代码如下

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

恭喜,也很高兴分享你的经验,希望以后继续啊!
zhangmangui 发表于 2015-5-28 22:16 | 显示全部楼层
xzy03101271 发表于 2015-5-28 16:16
问题已经解决了,谢谢啦!我原来的AD初始化程序中有段代码如下

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

那就是没有复位成功
 楼主| xzy03101271 发表于 2015-5-28 22:52 | 显示全部楼层
zhangmangui 发表于 2015-5-28 22:16
那就是没有复位成功

嗯,是的。不过,ADC初始化中开始不进行ADC复位不知道会不会出现什么BUG。官方的ADC初始化函数里也只是有上电,也没见复位。
zhangmangui 发表于 2015-5-29 22:45 | 显示全部楼层
xzy03101271 发表于 2015-5-28 22:52
嗯,是的。不过,ADC初始化中开始不进行ADC复位不知道会不会出现什么BUG。官方的ADC初始化函数里也只是有 ...

应该没什么问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

97

帖子

1

粉丝
快速回复 返回顶部 返回列表