28335 ADC同步采样两路信号

各位早安,最近我在用F28335上的ADC时遇到一个问题:据资料上说28335自带的ADC有两个采样保持器,可以用一个ADC实现两路信号同时采样;目前我需要实现这个功能,但写的ADC配置可能有些问题,一直无法输出正确的数,想请大家帮我看看哪里有问题,或是缺少了什么部分;代码如下:

AdcRegs.ADCTRL3.bit.SMODE_SEL = 1;      //设置同步采样模式
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x00;//设置1对转换,共2通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x1;  //设置ADCINA1和ADCINB1
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; //使能PWMA SOC触发
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;   //使能SEQ1中断

我的预期是ADCINA1的结果存入AdcRegs.ADCRESULT0中,ADCINB1的结果存入AdcRegs.ADCRESULT1中,可程序运行并暂停后并没有我期望的结果。

上面是我根据书上的代码改的,可能问题不少,请大家不吝赐教。

4 个回复

  • 自动定序功能在单次会话中可提供多达16次“自动转换”。可将每次转换编程为选择16个输入信道中的任何一个。
    序列发生器可运行为2个独立的8态序列发生器,或作为1个较大的16态序列发生器(即2个级联的8态序列发生器)。
    CONT_RUN配置了吗

    TI的忠诚粉丝!

  • 回复 mangui zhang:

    啊,对,这也是我想问的;看书的时候对启停模式和连续模式的区别没太弄明白;现在我只是想在运行程序后立即开始采样,采够了双路的1024个点后自动停止采样,请问应该如何选择模式?

    我是在TI官方的例程Example_2833xAdcSoc修改的,配置ADC后的内容我也贴一下:

    // Assumes ePWM1 clock is already enabled in InitSysCtrl();
       EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group
       EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount
       EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event
       EPwm1Regs.CMPA.half.CMPA = 0x0080;	  // Set compare A value
       EPwm1Regs.TBPRD = 0xFFFF;              // Set period for ePWM1
       EPwm1Regs.TBCTL.bit.CTRMODE = 0;		  // count up and start
    
    // Wait for ADC interrupt
       for(;;)
       {
          LoopCount++;
       }
    
    }
    
    
    interrupt void  adc_isr(void)
    {
    
      Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4;
      Voltage2[ConversionCount] = AdcRegs.ADCRESULT1 >>4;
    
      // If 40 conversions have been logged, start over
      if(ConversionCount == 255)
      {
         ConversionCount = 0;
      }
      else ConversionCount++;
    
      // Reinitialize for next ADC sequence
      AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
      AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
      PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
    
      return;
    }
    

  • 回复 45 45:

    感谢回复,目前看来基本是解决了,可还有一些小问题比较困惑,可以的话希望不吝赐教:
    1、关于初始化:我看过了TI的4个ADC相关例程,都没有初始化ADC相关引脚(// InitGpio(); // Skipped for this example),我的工程也没初始化,不过能出结果;这让我觉得很奇怪,难道ADC模块不用初始化引脚的吗?
    2、关于采样率:我在资料上查到双通道同步采样级联的采样时序为:S/H采样保持时间(高电平)为(1+ACQ_PS)×T_adcclk,低电平为2×T_adcclk,所以一个采样周期应该是(ACQ_PS+3)×T_adcclk,可我实际测量出来的采样周期是这个值的2倍,也就是双通道同步采样率为1/(2×(ACQ_PS+3)×T_adcclk),这里的采样率为什么会减半呢?