DSP2812AD采样

2019-03-24 10:23发布

利用2812中的AD模块采样正弦波时,利用CCS观测到的采样波形隔一段时间会出现相位跳跃,或者说出现断层现象,求原因! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
ltbytyn
1楼-- · 2019-03-24 16:46
< 你是如何启动AD实现采样的?说说你的方法
labixiaojing
2楼-- · 2019-03-24 21:34
 精彩回答 2  元偷偷看……
ltbytyn
3楼-- · 2019-03-24 21:39
labixiaojing 发表于 2014-7-11 19:20
定时器周期中断启动,而且发现频率高于50Hz时没有问题,频率低于40Hz会出现这种现象

不同频率的信号,你是一个周波采样几个点,还是20ms采样几个点算的?
labixiaojing
4楼-- · 2019-03-24 22:37
ltbytyn 发表于 2014-7-12 23:30
不同频率的信号,你是一个周波采样几个点,还是20ms采样几个点算的?

不同频率改变采样率,基本上一个周期采10个点左右,关键导师要求实际信号频率只有几Hz到十几Hz
ltbytyn
5楼-- · 2019-03-24 23:36
 精彩回答 2  元偷偷看……
labixiaojing
6楼-- · 2019-03-25 03:26
ltbytyn 发表于 2014-7-14 19:59
基本上一个周期采10个点左右。难道每个周期周期采样点有可能不确定吗?
不要搞太复杂。先把程序优化成单一 ...

我本来就是单一频率信号采样的,只是因为有断层现象试一下不同频率输入会不会有什么不同。附上程序,麻烦帮忙看下
void  main(void)
{
    InitSystem();            //初始化DSP内核寄存器
    InitPieCtrl();
    InitDIDO();        //调用PIE控制单元初始化函数
    InitPieVectTable();         //  调用PIE向量表初始化函数
    InitAdc();                   //调用ADC模块的基本初始化函数   
    EALLOW;
    PieVectTable.ADCINT=&adc_isr;    //重新设置PIE向量表中ADc的中断入口向量
    EDIS;
   
    PieCtrlRegs.PIEIER1.bit.INTx6=1;     //使能PIE中断分组1中的ADC中断
    GpioDataRegs.GPASET.bit.GPIOA0=1;
    GpioDataRegs.GPACLEAR.bit.GPIOA0=1;
   
   
    IER=1;          //使能和ADC中断相连的CPU INT1中断
   
    EINT;           //使能全局中断位INTM
    ERTM;           // 使能全局实时调试中断DBGM
   
   
    /* SET ADC*/
    AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
   
    AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//双排序器工作模式
    AdcRegs.ADCTRL1.bit.CONT_RUN=0;//启动-停止模式
    AdcRegs.ADCTRL1.bit.CPS=0;     //FCLK=CLK/1
    AdcRegs.ADCMAXCONV.all=2;
    AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x01;
    AdcRegs.ADCCHSELSEQ1.bit.CONV02=0x02;
    AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;       //使能EVA引起的中断
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;      
    AdcRegs.ADCTRL3.bit.ADCCLKPS=2;       //ADc模块的核心时钟频率=HSPCLK/4
   
    /* SET EVA*/
    EvaRegs.GPTCONA.bit.TCMPOE=0;     //禁止比较输出
    EvaRegs.GPTCONA.bit.T1PIN=0;
    EvaRegs.GPTCONA.bit.T1TOADC=2;       //设置周期中断标志启动ADC
    EvaRegs.T1CON.bit.FREE=0;    //防真挂起时,定时器1立即停止工作
    EvaRegs.T1CON.bit.SOFT=0;
    EvaRegs.T1CON.bit.TMODE=2;   //连续增计数模式
    EvaRegs.T1CON.bit.TPS=7;     //设置定时器时钟频率为HSPCLK/128
    EvaRegs.T1CON.bit.TENABLE=1;     //允许定时器操作
    EvaRegs.T1CON.bit.TCLKS10=0;     //内部时钟
    EvaRegs.T1CON.bit.TCLD10=0;     //计数器为0时重载
    EvaRegs.T1CON.bit.TECMPR=0;     //禁止比较操作
    EvaRegs.T1PR=2000;//300hz
   
    while(1)
    {                       

        }
}

    void InitSystem(void)
    {
        EALLOW;
        SysCtrlRegs.WDCR=0x00E8;        //禁止看门狗模块
        SysCtrlRegs.PLLCR.bit.DIV=10;    //将CPU的PLL倍频系数设为5
        
        SysCtrlRegs.HISPCP.all=0x1;      //高速时钟的预定标器设置成除以2
        SysCtrlRegs.LOSPCP.all=0x2;      //低速时钟的预定标器设置成除以4
        
        
        //根据需要时能各种外设模块的时钟
        SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
        SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
        EDIS;
     }
     
      
  
      
      
     interrupt void adc_isr(void)
     {
   
           EALLOW;
        temp0[x]=AdcRegs.ADCRESULT0>>4;
        temp1[x]=AdcRegs.ADCRESULT1>>4;
        temp2[x]=AdcRegs.ADCRESULT2>>4;  
        x++;
        if(x==512)
          {
              x=0;
          }
        
        
        //重新初始化ADC采样序列
        AdcRegs.ADCTRL2.bit.RST_SEQ1=1;  //复位SEQ1  
        AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除中断位INT SEQ1
        PieCtrlRegs.PIEACK.all=PIEACK_GROUP1; //清除PIE1的中断响应位
        EDIS;
      
     }

一周热门 更多>

相关问题

    相关文章