打印

msp430f4152的AD问题

[复制链接]
2060|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xddl|  楼主 | 2015-1-16 11:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
编译器:IAR430 5.20
代码为:

#include <msp430.h>
#include "adc10.h"
#include "basictimer.h"

unsigned short tadc[2] = {0};

//A0 A1 A7
//p7.4 p7.5 p6.7
//多通道 多次采样
void init_adc10(void)
{
        ADC10AE0 |= 0x03;    // A1/A0, repeat multi channel
        ADC10AE1  = 0;
        ADC10CTL0 = ADC10SHT_2 + /*REF2_5V*/ + REFON + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl  参考电压选1.5V
        ADC10CTL1 = CONSEQ_3 + INCH_1;     // A1/A0, repeat multi channel
       
        ADC10DTC0 = 0; //数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止
        ADC10DTC1 = 2; // 4 conversions
        //当多通道采样时,先采高的通道,再采低的通道。即A3的结果存储到Control_Val[0],A0的结果存储到Control_Val[3],由于A1、A2没有使能,所以在A2、A1的结果分别存储到Control_Val[1],Control_Val[2]的是不定的。存储顺数也是按照这个方式存储的。
}

void adc10(void)
{
        ADC10CTL0 &= ~ENC;                      //ADC不使能

    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active  ???

    ADC10SA = (unsigned int)tadc;
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start   ADC??,???? ADC10SC??????
        close_key();
        __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force
        open_key();
}

void close_adc10(void)
{
        return;
        ADC10CTL0 &= ~ENC;                      //ADC不使能,其他控制位必须在ENC为0时才可修改
        while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active  ???
       
        ADC10AE0 = 0;
        ADC10CTL0 = 0;
        ADC10CTL1 = 0;
       
        ADC10DTC0 = 0;
        ADC10DTC1 = 0;
}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)  //中断响应以后,中断标志位自动清零
{
        //ADC10CTL0 |= ENC + ADC10SC;
        //ADC10SA = (short)(tadc);
        __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}


问题:采样的AD值总是真实值的一半,怎么回事?

相关帖子

沙发
xddl|  楼主 | 2015-1-16 11:07 | 只看该作者

未命名.png (105.89 KB )

未命名.png

使用特权

评论回复
板凳
hxfxt| | 2015-1-16 20:21 | 只看该作者
改变下采样时间再试一试!

使用特权

评论回复
地板
angerbird| | 2015-1-16 23:11 | 只看该作者
这个是需要注意采样率的啦。

使用特权

评论回复
5
xddl|  楼主 | 2015-1-17 09:58 | 只看该作者
采样率就两个:ADC10SR为0或1,缺省为200ksps,改成50?

使用特权

评论回复
6
xddl|  楼主 | 2015-1-17 10:00 | 只看该作者
难道是C5 C6太大了吗?或者干脆就不该要这两个电容?

使用特权

评论回复
7
cainiao_123| | 2015-1-17 21:56 | 只看该作者
xddl 发表于 2015-1-17 10:00
难道是C5 C6太大了吗?或者干脆就不该要这两个电容?

104不算太大,不过可以改为103试一下

使用特权

评论回复
8
dirtwillfly| | 2015-1-19 20:10 | 只看该作者
楼主的问题解决了吗?

使用特权

评论回复
9
xddl|  楼主 | 2015-1-19 20:45 | 只看该作者
没有。

使用特权

评论回复
10
dirtwillfly| | 2015-1-19 21:15 | 只看该作者
本帖最后由 dirtwillfly 于 2015-1-21 22:40 编辑

看你的程序,没发现有明显的问题。采样值要经过换算成实际电压值。看你的代码里没有这部分。
不知道是不是这个问题?

使用特权

评论回复
11
xddl|  楼主 | 2015-1-20 08:40 | 只看该作者
不是。我并不是要采集电压,只是比对一个值,摇杆位于中间时,电阻为5K,应该是0.75V,但是AD的值只有240,应该是510左右的呀。这是我奇怪的

使用特权

评论回复
12
shenmu2012| | 2015-1-20 22:12 | 只看该作者
当多通道采样时,先采高的通道,再采低的通道。即A3的结果存储到Control_Val[0],A0的结果存储到Control_Val[3],由于A1、A2没有使能,所以在A2、A1的结果分别存储到Control_Val[1],Control_Val[2]的是不定的。存储顺数也是按照这个方式存储的。

使用特权

评论回复
13
xddl|  楼主 | 2015-1-21 09:30 | 只看该作者
是呀。我使能的就是A0 A1,数据存贮是没有问题的

使用特权

评论回复
14
dirtwillfly| | 2015-1-21 22:49 | 只看该作者
xddl 发表于 2015-1-20 08:40
不是。我并不是要采集电压,只是比对一个值,摇杆位于中间时,电阻为5K,应该是0.75V,但是AD的值只有240, ...

这个0.75V是用万用表测量出来的吗?

使用特权

评论回复
15
xddl|  楼主 | 2015-1-22 19:33 | 只看该作者
对。有问题吗?

使用特权

评论回复
16
xddl|  楼主 | 2015-1-24 19:23 | 只看该作者
问题还没有解决。难道我买着假的了?

使用特权

评论回复
17
xddl|  楼主 | 2015-3-19 08:47 | 只看该作者
msp430f4152的AD,是不是大家都不用?

使用特权

评论回复
18
ccw1986| | 2015-3-19 09:08 | 只看该作者
不该是假的吧,程序都跑起来了,肯定是你哪里设置的有问题,你再认真读下datasheet

使用特权

评论回复
19
angerbird| | 2015-3-22 13:37 | 只看该作者
若涉及到多通道多次AD转换采集的是需要注意的。

使用特权

评论回复
20
quray1985| | 2015-3-23 20:09 | 只看该作者
帮你顶了

使用特权

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

本版积分规则

30

主题

88

帖子

1

粉丝