打印

ADC的采样误差很大问题

[复制链接]
3396|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火山LF|  楼主 | 2016-8-22 19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是TI的例程进行采样,参考电压为3.3V,12位,计算公式为:采样电压 = (ADC采样数据 / 4096 ) * 3.3 V

在例程中用单步调试采3.3V电压看数据,数据总是在3700-3800之间起伏,距离4096还有一段距离,也就是误差很大,请问关于误差这点需要怎么消除呢?

已通过采20次电压取平均值,结果也在3700-3800之间起伏。


下面是例程






#include "driverlib.h"

uint16_t Value_AD = 0;
uint16_t ADC_Get_Value = 0; // ADC采到的原始数据
uint16_t ADV_Get_Aver_Value = 0; //用于计算采ADC的平均值


void main(void)
{
    // Stop WDT
    WDT_A_hold(WDT_A_BASE);

    //Set P1.0 as an output pin.
    /*

     * Select Port 1
     * Set Pin 0 as output
     */
    GPIO_setAsOutputPin(
        GPIO_PORT_P1,
        GPIO_PIN0
        );

    //Set P1.0 as Output Low.
    /*

     * Select Port 1
     * Set Pin 0 to output Low.
     */
    GPIO_setOutputLowOnPin(
        GPIO_PORT_P1,
        GPIO_PIN0
        );
    //Set P1.1 as Ternary Module Function Output.
    /*

     * Select Port 1
     * Set Pin 1 to output Ternary Module Function, (A1, C1, VREF+, VeREF+).
     */


    GPIO_setAsPeripheralModuleFunctionOutputPin(
        GPIO_PORT_P3,
        GPIO_PIN0,
        GPIO_TERNARY_MODULE_FUNCTION
        );

    /*
     * Disable the GPIO power-on default high-impedance mode to activate
     * previously configured port settings
     */
    PMM_unlockLPM5();

    //Initialize the ADC12B Module
    /*
     * Base address of ADC12B Module
     * Use internal ADC12B bit as sample/hold signal to start conversion
     * USE MODOSC 5MHZ Digital Oscillator as clock source
     * Use default clock divider/pre-divider of 1
     * Not use internal channel
     */
    ADC12_B_initParam initParam = {0};
    initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
    initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
    initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
    initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
    initParam.internalChannelMap = ADC12_B_NOINTCH;
    ADC12_B_init(ADC12_B_BASE, &initParam);

    //Enable the ADC12B module
    ADC12_B_enable(ADC12_B_BASE);

    /*
     * Base address of ADC12B Module
     * For memory buffers 0-7 sample/hold for 64 clock cycles
     * For memory buffers 8-15 sample/hold for 4 clock cycles (default)
     * Disable Multiple Sampling
     */
    ADC12_B_setupSamplingTimer(ADC12_B_BASE,
                               ADC12_B_CYCLEHOLD_16_CYCLES,
                               ADC12_B_CYCLEHOLD_4_CYCLES,
                               ADC12_B_MULTIPLESAMPLESDISABLE);

    //Configure Memory Buffer
    /*
     * Base address of the ADC12B Module
     * Configure memory buffer 0
     * Map input A1 to memory buffer 0
     * Vref+ = AVcc
     * Vref- = AVss
     * Memory buffer 0 is not the end of a sequence
     */
    ADC12_B_configureMemoryParam configureMemoryParam = {0};
    configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
    configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_A12;
    configureMemoryParam.refVoltageSourceSelect =
        ADC12_B_VREFPOS_AVCC_VREFNEG_VSS;
    configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
    configureMemoryParam.windowComparatorSelect =
        ADC12_B_WINDOW_COMPARATOR_DISABLE;
    configureMemoryParam.differentialModeSelect =
        ADC12_B_DIFFERENTIAL_MODE_DISABLE;
    ADC12_B_configureMemory(ADC12_B_BASE, &configureMemoryParam);

    ADC12_B_clearInterrupt(ADC12_B_BASE,
                           0,
                           ADC12_B_IFG0
                           );

    //Enable memory buffer 0 interrupt
    ADC12_B_enableInterrupt(ADC12_B_BASE,
                            ADC12_B_IE0,
                            0,
                            0);

    while(1)
    {
        __delay_cycles(5000);

        //Enable/Start sampling and conversion
        /*
         * Base address of ADC12B Module
         * Start the conversion into memory buffer 0
         * Use the single-channel, single-conversion mode
         */
        ADC12_B_startConversion(ADC12_B_BASE,
                                ADC12_B_MEMORY_0,
                                ADC12_B_SINGLECHANNEL);




        __bis_SR_register(LPM0_bits + GIE);     // LPM0, ADC12_B_ISR will force exit
        __no_operation();                       // For debugger
    }
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(ADC12_VECTOR)))
#endif
void ADC12_ISR(void)
{
    switch(__even_in_range(ADC12IV,12))
    {
    case  0: break;                         // Vector  0:  No interrupt
    case  2: break;                         // Vector  2:  ADC12BMEMx Overflow
    case  4: break;                         // Vector  4:  Conversion time overflow
    case  6: break;                         // Vector  6:  ADC12BHI
    case  8: break;                         // Vector  8:  ADC12BLO
    case 10: break;                         // Vector 10:  ADC12BIN
    case 12:                                // Vector 12:  ADC12BMEM0 Interrupt

             Value_AD =  ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);

                ADC_Get_Value = ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);

                if (ADV_Get_Aver_Value == 0) {
                        ADV_Get_Aver_Value = ADC_Get_Value;
                }

                ADC_Get_Value = (ADV_Get_Aver_Value + ADC_Get_Value) / 2;
                ADV_Get_Aver_Value = ADC_Get_Value;


        if(ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0) >= 0x7ff)
        {
            //Set P1.0 LED on
            /*

             * Select Port 1
             * Set Pin 0 to output high.
             */
            GPIO_setOutputHighOnPin(
                GPIO_PORT_P1,
                GPIO_PIN0
                );
        }
        else
        {
            //Set P1.0 LED off
            /*

             * Select Port 1
             * Set Pin 0 to output high.
             */
            GPIO_setOutputLowOnPin(
                GPIO_PORT_P1,
                GPIO_PIN0
                );
        }
        __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
        break;                              // Clear CPUOFF bit from 0(SR)
    case 14: break;                         // Vector 14:  ADC12BMEM1
    case 16: break;                         // Vector 16:  ADC12BMEM2
    case 18: break;                         // Vector 18:  ADC12BMEM3
    case 20: break;                         // Vector 20:  ADC12BMEM4
    case 22: break;                         // Vector 22:  ADC12BMEM5
    case 24: break;                         // Vector 24:  ADC12BMEM6
    case 26: break;                         // Vector 26:  ADC12BMEM7
    case 28: break;                         // Vector 28:  ADC12BMEM8
    case 30: break;                         // Vector 30:  ADC12BMEM9
    case 32: break;                         // Vector 32:  ADC12BMEM10
    case 34: break;                         // Vector 34:  ADC12BMEM11
    case 36: break;                         // Vector 36:  ADC12BMEM12
    case 38: break;                         // Vector 38:  ADC12BMEM13
    case 40: break;                         // Vector 40:  ADC12BMEM14
    case 42: break;                         // Vector 42:  ADC12BMEM15
    case 44: break;                         // Vector 44:  ADC12BMEM16
    case 46: break;                         // Vector 46:  ADC12BMEM17
    case 48: break;                         // Vector 48:  ADC12BMEM18
    case 50: break;                         // Vector 50:  ADC12BMEM19
    case 52: break;                         // Vector 52:  ADC12BMEM20
    case 54: break;                         // Vector 54:  ADC12BMEM21
    case 56: break;                         // Vector 56:  ADC12BMEM22
    case 58: break;                         // Vector 58:  ADC12BMEM23
    case 60: break;                         // Vector 60:  ADC12BMEM24
    case 62: break;                         // Vector 62:  ADC12BMEM25
    case 64: break;                         // Vector 64:  ADC12BMEM26
    case 66: break;                         // Vector 66:  ADC12BMEM27
    case 68: break;                         // Vector 68:  ADC12BMEM28
    case 70: break;                         // Vector 70:  ADC12BMEM29
    case 72: break;                         // Vector 72:  ADC12BMEM30
    case 74: break;                         // Vector 74:  ADC12BMEM31
    case 76: break;                         // Vector 76:  ADC12BRDY
    default: break;
    }
}


相关帖子

沙发
dirtwillfly| | 2016-8-22 19:41 | 只看该作者
你采集的信号源是什么?
开发板供电是怎么样的?

使用特权

评论回复
板凳
火山LF|  楼主 | 2016-8-22 20:06 | 只看该作者
dirtwillfly 发表于 2016-8-22 19:41
你采集的信号源是什么?
开发板供电是怎么样的?

参考电压是板子内部的VCC  3.3V,我是IO口接外部电压,DC电源提供的3.3V

使用特权

评论回复
地板
火山LF|  楼主 | 2016-8-22 20:31 | 只看该作者
dirtwillfly 发表于 2016-8-22 19:41
你采集的信号源是什么?
开发板供电是怎么样的?

群主,原来MSP430FR5969的板子上的VCC是3.60V 的,所以3.3V在3750范围内就很正常了。。。。。

使用特权

评论回复
5
dirtwillfly| | 2016-8-22 20:39 | 只看该作者
火山LF 发表于 2016-8-22 20:31
群主,原来MSP430FR5969的板子上的VCC是3.60V 的,所以3.3V在3750范围内就很正常了。。。。。 ...

恩,不过波动有点大

使用特权

评论回复
6
xyz549040622| | 2016-8-22 22:27 | 只看该作者
建议接VCC看看,波动范围太大了,不正常。还有可能是你外部电压本身波动就这么大。

使用特权

评论回复
7
火山LF|  楼主 | 2016-8-23 08:04 | 只看该作者
xyz549040622 发表于 2016-8-22 22:27
建议接VCC看看,波动范围太大了,不正常。还有可能是你外部电压本身波动就这么大。 ...

接板子上的VCC就很准确,嗯嗯呢

使用特权

评论回复
8
数码小叶| | 2016-8-23 09:05 | 只看该作者
火山LF 发表于 2016-8-22 20:31
群主,原来MSP430FR5969的板子上的VCC是3.60V 的,所以3.3V在3750范围内就很正常了。。。。。 ...

我很好奇,怎么来了个3.6的电压

使用特权

评论回复
9
火山LF|  楼主 | 2016-8-23 09:37 | 只看该作者
数码小叶 发表于 2016-8-23 09:05
我很好奇,怎么来了个3.6的电压

是板子内部的VCC一直都是3.60V的

使用特权

评论回复
10
数码小叶| | 2016-8-23 09:41 | 只看该作者
火山LF 发表于 2016-8-23 09:37
是板子内部的VCC一直都是3.60V的

不要吓我

使用特权

评论回复
11
火山LF|  楼主 | 2016-8-23 09:48 | 只看该作者

用万用表一直测DC电源的电压,就是没有测板子上面VCC的电压

使用特权

评论回复
12
tmkdfan| | 2016-8-23 11:32 | 只看该作者
火山LF 发表于 2016-8-23 09:48
用万用表一直测DC电源的电压,就是没有测板子上面VCC的电压

开发板上为什么用3。6v不用3.3v呢?

使用特权

评论回复
13
火山LF|  楼主 | 2016-8-23 11:37 | 只看该作者
tmkdfan 发表于 2016-8-23 11:32
开发板上为什么用3。6v不用3.3v呢?

我也不知道为什么板子内部的VCC是3.6V的,我一直以为是3.3V的,所以就出现了这个问题

使用特权

评论回复
14
icecut| | 2016-8-23 14:28 | 只看该作者
你要用4000字的万用表来测 dc 电压.

使用特权

评论回复
15
yu515301489| | 2016-8-23 16:57 | 只看该作者
确定源稳不稳,基准稳不稳。~水一下

使用特权

评论回复
16
豆腐块| | 2016-8-23 21:45 | 只看该作者
可能是外部电压本身波动就大

使用特权

评论回复
17
10299823| | 2016-8-24 16:37 | 只看该作者
在前段电路加上滤波试试

使用特权

评论回复
18
10299823| | 2016-8-24 16:37 | 只看该作者
或者软件里面加上软件滤波试试看再说。

使用特权

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

本版积分规则

88

主题

816

帖子

16

粉丝