6131|10

19

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430 ADC采样保持时间对采样准确度的影响 [复制链接]

芯片msp430fr5994,用到ADC采集,发现定义不同的采样保持时间得到的数据差距有点大啊,比如,采集一个1.6V左右的信号,4个cycle时的值为1520,64个cycle时的值为1680,192个cycle时的值为1880.不知道是代码写的不正确,还是ADC太差?

最新回复

1、根据你的1.6V换算一下,看看哪个cycle的值最准确,我算了一下,怎么感觉好像都不准,AVCC我用3.3V来算 2、在转换和得到的结果的时候,最好关闭总中断 3、最好拿例程来验证下,然后在例程基础上面修改,看看你的程序和例程的有什么区别 4、得到的ADC值是要经过滤波的,去极值取中间值求平均  详情 回复 发表于 2017-5-23 08:46
 
点赞 关注

回复
举报

19

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
用过的来一起讨论啊

点评

你的驱动代码什么样的,我测试一下  详情 回复 发表于 2017-5-19 13:38
 
 

回复

1059

帖子

1

TA的资源

版主

板凳
 
tianxiaoya 发表于 2017-5-19 13:33
用过的来一起讨论啊

你的驱动代码什么样的,我测试一下
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

4
 
void init_clock_DCO16MHZ(void)
{
    //Set DCO frequency to 16MHz
    CS_setDCOFreq(CS_DCORSEL_1, CS_DCOFSEL_4);

    CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
    CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
}

void init_adc(void)
{
    //Set P1.0 as Ternary Module Function Input.
    GPIO_setAsPeripheralModuleFunctionInputPin(
        GPIO_PORT_P1,
        GPIO_PIN0,
        GPIO_TERNARY_MODULE_FUNCTION
        );

    PMM_unlockLPM5();

    //Initialize the ADC12B Module
    /*
     * Base address of ADC12B Module
     * Use internal ADC12B bit as sample/hold signal to start conversion
     * USE smclk 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_SMCLK;
    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 4 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_4_CYCLES,
                               ADC12_B_CYCLEHOLD_4_CYCLES,
                               ADC12_B_MULTIPLESAMPLESDISABLE);

    //Configure Memory Buffer
    /*
     * Base address of the ADC12B Module
     * Configure memory buffer 0
     * Map input A0 to memory buffer 0
     * Vref+ = AVcc
     * Vref- = VSS
     * 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_A0;
    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);

}
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

5
 
void main(void)
{
    WDT_A_hold(WDT_A_BASE);

    init_clock_DCO16MHZ();
    init_adc();

    while(1)
    {
        ADC12_B_startConversion(ADC12_B_BASE,
                                                                ADC12_B_MEMORY_0,
                                                                ADC12_B_SINGLECHANNEL);
        vol = ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);


        if(index_b == 512)
        {
                index_b = 0;
        }

        circularBuffer[index_b++] = vol;
}
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

6
 
麻烦版主看一下,msp430的ADC我还没有搞得很清楚,用的CCS
 
 
 

回复

6366

帖子

4929

TA的资源

版主

7
 
采样保持时间太短,采集到的电压接近于瞬时电压,所以跟你用万用表测出来的电压有差别,

点评

我采集一个直流电压的话,瞬时电压不都是一个固定的值么?  详情 回复 发表于 2017-5-22 09:43
 
 
 

回复

1059

帖子

1

TA的资源

版主

8
 
我测试自己写的程序没有问题,你的程序不对,计算你的采样时间,应该是采样时间不够

点评

版主,你用的哪款芯片测试的呢?可以保证,采样转换时间肯定是小于采样间隔的,同样的采样间隔,较大的采样时间得到的数据和实际数据是吻合的,较小的采样时间得到的数据误差较大,是不是和采样保持电路有关?  详情 回复 发表于 2017-5-22 09:40
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

9
 
qwerghf 发表于 2017-5-22 08:21
我测试自己写的程序没有问题,你的程序不对,计算你的采样时间,应该是采样时间不够

版主,你用的哪款芯片测试的呢?可以保证,采样转换时间肯定是小于采样间隔的,同样的采样间隔,较大的采样时间得到的数据和实际数据是吻合的,较小的采样时间得到的数据误差较大,是不是和采样保持电路有关?
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

10
 
tiankai001 发表于 2017-5-20 15:22
采样保持时间太短,采集到的电压接近于瞬时电压,所以跟你用万用表测出来的电压有差别,

我采集一个直流电压的话,瞬时电压不都是一个固定的值么?
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

11
 
1、根据你的1.6V换算一下,看看哪个cycle的值最准确,我算了一下,怎么感觉好像都不准,AVCC我用3.3V来算
2、在转换和得到的结果的时候,最好关闭总中断
3、最好拿例程来验证下,然后在例程基础上面修改,看看你的程序和例程的有什么区别
4、得到的ADC值是要经过滤波的,去极值取中间值求平均
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表