ADC12测量的AD直问题,请教!

woshisaochenwen   2004-11-2 07:59 楼主
采样的电压很低,40mv ,内部2.5V基准,数据应该为65,实际采样数据在60-80跳变,是否正常??

回复评论 (29)

引用:

采样的电压很低,40mv ,内部2.5V基准,数据应该为65,实际采样数据在60-80跳变,是否正常??

应该不会跳变的,是硬件的问题。用内部基准的时候,可以在VEREF加104的电容。

而且可以用1.5V做基准啊
点赞  2004-11-2 08:05
是不是采样电压太低的原因,我用高电压,没有这么跳变的
点赞  2004-11-2 08:20
一般是电路设计的问题
地电流可能会引起这种情况
一般跳动2个字左右正常
点赞  2004-11-2 08:29
会不会是程序问题,帮我看看啊

ADC12CTL0&=~ENC; //ENC=0 ,允许修改参数
ADC12CTL1=CSTARTADD_1+SHS_0+ADC12SSEL_2+CONSEQ_0; //单通道单次转换 ,ADC12MEM1
//选择MLCK为时钟源,not use sample timer
//S/H source: directly controlled by ADC12SC
ADC12CTL0|= REF2_5V+REFON+ADC12ON;
ADC12CTL0|=ENC; //ENC=1 ,不允许修改参数

delay(5000); //delay 30ms,fosc=1M ??????????????
ADC12_SUM=0;
for(i=0;i<16;i++) //采样Vp输出的电压16次,取平均值
{
ADC12CTL0|=ADC12SC; //ADC12SC=1
_NOP();
_NOP();
_NOP();
_NOP();
ADC12CTL0&=~ADC12SC; //ADC12SC=0,启动AD转换
_NOP();
while ((ADC12CTL1 & ADC12BUSY) == 1); //如果转换未结束,等待
_NOP();
ADC12_SUM+=ADC12MEM1; //把采样的AD值加到ADC12_SUM上
_NOP();
_NOP();
} //进行下一
点赞  2004-11-2 08:35
为什么不把信号放大后采样呢?在信号很小的时候,硬件电路包括布线对采样的影响都很大的。
点赞  2004-11-2 08:42
引用:

为什么不把信号放大后采样呢?在信号很小的时候,硬件电路包括布线对采样的影响都很大的。
同意,可以加个运放呀
点赞  2004-11-2 08:46
应该还是从硬件电路上下工夫,小信号也不应该跳动的!
点赞  2004-11-2 08:49
未放大的电压为 10-700mv,我已经放大3倍了,就是10mv放大后的30mv测量不稳定
点赞  2004-11-2 08:52
60-80大了些,跳动3-4差不多吧。把小信号后的采样电阻加大。
点赞  2004-11-2 09:31
引用:

60-80大了些,跳动3-4差不多吧。把小信号后的采样电阻加大。


用意,输入电阻一定要大?最好用仪用放大器
点赞  2004-11-2 09:34
2.5的基准,在放大3倍也没有问题啊,
是不是有干扰,从地引入,或者是50HZ??
点赞  2004-11-2 09:35
如果测量电压有1V 的话,测量的AD值相差只有 1-2个,是不是电压太低了
点赞  2004-11-2 09:51
ADC12MCTL1 没定义呀 用内部2.5通道0的话是10H
采样保持定时器SHT0 按你实际时间来定义
这个不对的话就是这个现象 我以前也就是这样的
点赞  2004-11-2 10:27

要怎么定义啊。我用的通道0 和通道 1的设置差不多的。如下

通道0
ADC12CTL1=CSTARTADD_0+SHS_0+ADC12SSEL_2+CONSEQ_0; //单通道单次转换

//选择MLCK为时钟源,not use sample timer
//S/H source: directly controlled by ADC12SC
ADC12CTL0|= REF2_5V+REFON+ADC12ON;

通道1
ADC12CTL1=CSTARTADD_1+SHS_0+ADC12SSEL_2+CONSEQ_0; //单通道单次转换 ,ADC12MEM1
//选择MLCK为时钟源,not use sample timer
//S/H source: directly controlled by ADC12SC
ADC12CTL0|= REF2_5V+REFON+ADC12ON;

通道0是正常的啊。为什么!!
点赞  2004-11-2 11:31
我说的是ADC12MCTLx不是ADC12CTLx
ADC12MCTLx是转换存储器控制寄存器 它的定义如下:第7位是EOS表示序列结束
4~6位Sref参考电源选择 你要用内部的就是Sref_1
0~3位INCH选择输入通道 在这里定义你输入通道 通道0就是INCH_0
而不是用CSTARTADD_0
CSTARTADD_0只是定义起始通道
总结程序:
ADC12CTL0&=~ENC; //ENC=0 ,允许修改参数
ADC12CTL1=CSTARTADD_0+SHS_0+ADC12SSEL_2+CONSEQ_0; //单通道单次转换 ,ADC12MEM0
//选择MLCK为时钟源,not use sample timer
//S/H source: directly controlled by ADC12SC
ADC12CTL0|= SHT0_4+REF2_5V+REFON+ADC12ON;
ADC12MCTL0=10H;//信号由A0输入,内部参考电源
ADC12CTL0|=ENC; //ENC=1 ,不允许修改参数

delay(5000); //delay 30ms,fosc=1M ??????????????
ADC12_SUM=0;
for(i=0;i<16;i++) //采样Vp输出的电压16次,取平均值
{
ADC12CTL0|=ADC12SC; //ADC12SC=1
_NOP();
_NOP();
_NOP();
_NOP();
ADC12CTL0&=~ADC12SC; //ADC12SC=0,启动AD转换
_NOP();
while ((ADC12CTL1 & ADC12BUSY) == 1); //如果转换未结束,等待
_NOP();
ADC12_SUM+=ADC12MEM0; //把采样的AD值加到ADC12_SUM上
_NOP();
_NOP();
} //进行下一
点赞  2004-11-2 11:52
我的通道1 改为如下设置,还是有问题,??为什么??

ADC12CTL1=CSTARTADD_1+SHS_0+ADC12SSEL_2+CONSEQ_0;
//单通道单次转换 ,MCLK做内部时钟源,
ADC12CTL0|= REF2_5V+REFON+ADC12ON;
//内部基准 2.5V
ADC12MCTL1 = SREF_1+INCH_1;
//选择通道1
点赞  2004-11-2 13:32

不好意思,早上讲错了。
我的问题是出在通道1 上。我现在设置通道1 如下,还是不行,

ADC12CTL1=CSTARTADD_1+SHS_0+ADC12SSEL_2+CONSEQ_0;
//单通道单次转换 ,MCLK做内部时钟源,
ADC12CTL0|= REF2_5V+REFON+ADC12ON;
//内部基准 2.5V
ADC12MCTL1 = SREF_1+INCH_1;


我把ADC12CTL1中的CONSEQ_0改为CONSEQ_1, 程序就停在 while ((ADC12CTL1 & ADC12BUSY) == 1);
点赞  2004-11-2 13:44
CONSEQ_1是序列通道转换了
这个你不要改 就是CONSEQ_0单通道单次转换
你用的是什么型号的片子?
点赞  2004-11-2 13:55

我现在改为这样,实际大概200mv(用万用表测量的,很稳定的),AD 测量16次,取平均值,数据在198-212MV 跳变,还可以,
我仿真的时候,每次测量的AD值相差很大(200mv 应该是 327 ),测量AD值 100-500跳变。用149片子

ADC12CTL1=CSTARTADD_1+SHS_0+ADC12SSEL_2+CONSEQ_0;
//单通道单次转换 ,MCLK做内部时钟源,
ADC12CTL0|= REF2_5V+REFON+ADC12ON;
//内部基准 2.5V
ADC12MCTL1 = SREF_1+INCH_1;
点赞  2004-11-2 14:00
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复