This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

28335 ADC 单通道高速连续采样时的问题



大家好!LZ最近在做一个实时位置控制的case。


其中28335片内AD采样是这样做的:
        在定采样周期中断触发后,对同一通道(先不做控制,被测量是静态不变化的)不间断连续采集多个值(CONV都设为同一通道,一次顺序采集)后,去掉最大和最小,再均值。
        发现这样得到的平均值结果,其跳码幅度较大,有3~4个毫伏之多。(测量的量是在开发板上的电阻分压电路,adc时钟降到12.5MHz,采样窗口开最大到0xf)
        而换成定周期触发AD采样一次仅一个值,多周期后求平均,这时的结果就能稳定在1个毫伏的变化内。(ADC时钟25MHz)

这样我是猜想AD对某一通道不间断连续采样是不是会对采样值带来干扰?为什么会有干扰?

想减轻这样的干扰,除了增加对某一通道连续采样的间隔时间,还有什么好方法?(毕竟实时控制下,ADC能兼顾速度和精度是最好了)加一级电压跟随可不可行?

LZ知道28335ADC的12位精度实际是达不到的,多大的跳码幅度属于正常?


希望各位大侠解答我的疑问

  • 从硬件上来看    加一级电压跟随    对精度没什么影响    只会带来直流增量

    只要保证ADC转换完成后  在进行下一次转换     这样结果不会应始终而影响过大

    我建议你确保输入端的信号没有毫伏级的变化

  • 还有   ADC 采集的结果做滤波处理是有必要的

  • 这是我采集的代码,单通道连续采依然没有改善:

    double ADC_SingleCH(Uint16 channel){
        int res[SAMPLE_NUM] = {0};
        int i;

        AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode

        //AdcRegs.ADCTRL1.bit.CONT_RUN = 0;       Start and stop

        AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;       // Enable Sequencer override feature,warp around

        AdcRegs.ADCCHSELSEQ1.bit.CONV00 = channel;         // Initialize all ADC channel selects to A0
        AdcRegs.ADCCHSELSEQ1.bit.CONV01 = channel;
        AdcRegs.ADCCHSELSEQ1.bit.CONV02 = channel;
        AdcRegs.ADCCHSELSEQ1.bit.CONV03 = channel;
        AdcRegs.ADCCHSELSEQ2.bit.CONV04 = channel;
        AdcRegs.ADCCHSELSEQ2.bit.CONV05 = channel;
        AdcRegs.ADCCHSELSEQ2.bit.CONV06 = channel;
        AdcRegs.ADCCHSELSEQ2.bit.CONV07 = channel;
        AdcRegs.ADCCHSELSEQ3.bit.CONV08 = channel;
        AdcRegs.ADCCHSELSEQ3.bit.CONV09 = channel;
        AdcRegs.ADCCHSELSEQ3.bit.CONV10 = channel;
        AdcRegs.ADCCHSELSEQ3.bit.CONV11 = channel;
        AdcRegs.ADCCHSELSEQ4.bit.CONV12 = channel;
        AdcRegs.ADCCHSELSEQ4.bit.CONV13 = channel;
        AdcRegs.ADCCHSELSEQ4.bit.CONV14 = channel;
        AdcRegs.ADCCHSELSEQ4.bit.CONV15 = channel;
        AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = SAMPLE_NUM - 1;  // convert and store in 8 results registers
        AdcRegs.ADCTRL2.all = 0x2000;   //start convert

        while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}
        AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
        AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;

       for (i=0;i<SAMPLE_NUM;i++){
            res[i]= *(&(AdcRegs.ADCRESULT0)+i)>>4;
       }

       return ADC_Filter(res);
    }

  • mangui zhang 说:

    从硬件上来看    加一级电压跟随    对精度没什么影响    只会带来直流增量

    只要保证ADC转换完成后  在进行下一次转换     这样结果不会应始终而影响过大

    我建议你确保输入端的信号没有毫伏级的变化

    谢谢您的回复! 上面是我采样的代码。 我尝试对开发板上的模拟地进行采样,这个0电压应该很稳了。用上面的代码,好几个寄存器的结果都不为0,某几个寄存器的值甚至能到20左右。平均值滤波或中值滤波都难以消除这样的异常。 上面的代码不知是否有错,依据手册,我这样的配置,在此通道结果写入寄存器时,下一通道的采样就开始了,比单通道循环采样读取N次的方法要快。我猜想是不是因为采样太快,保持器的电容充放电出现问题,所以询问通过跟随电路降低输出阻抗是否能改善。 但即使采样再快(25MHz时钟,最大采样窗口),也在ADC的能力范围内吧,所以我很疑惑。