5452|10

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于AD转换的问题请教大家 [复制链接]

请问各位高手,我在用MSP430F133单片机实现AD转换的时候,测量输入电压后,程序显示的转换的结果与采用公式计算的结果不符,并且在不同的输入电压下,AD转换的结果并非线性关系,请教各位高手原因在那,以下是我写的程序:(系统采用内部2.5伏参考电压,单通道单次转换模式,采用A2输入通道)
#include "msp430x13x.h"

static unsigned int results;

void main(void)
{
WDTCTL = WDTPW+WDTHOLD;
P6SEL |= 0x04;
ADC12CTL0 = 0x0270;
ADC12CTL1 = SHP;
ADC12MCTL0 = 0x02;
ADC12IE = 0x01;
ADC12CTL0 |= ENC;
_EINT();

while(1)
{
ADC12CTL0 |= ADC12SC;
_BIS_SR(LPM0_bits);
}
}

interrupt[ADC_VECTOR] void ADC12ISR (void)
{
results = ADC12MEM0;
_BIC_SR_IRQ(LPM0_bits);
}

最新回复

static unsigned int results; void main(void) { WDTCTL = WDTPW+WDTHOLD; P6SEL |= 0x04; ADC12CTL0 = 0x0270;      /* ADC12ON+REFON +REF2_5V +SHT0_2(4分频)*/ ADC12CTL1 = SHP;            /*你ADC的时钟源好像是ACLK  采样/转换时钟是ADC12SC*/ ADC12MCTL0 = 0x02; ADC12IE = 0x01; ADC12CTL0 |= ENC; _EINT(); while(1) { ADC12CTL0 |= ADC12SC; /*你1次采样/转换需要  (ADC12SC*X / SHT0_2)                                                 如果设为连续采样就不需要ADC12SC  */ _BIS_SR(LPM0_bits); } } interrupt[ADC_VECTOR] void ADC12ISR (void) { results = ADC12MEM0; _BIC_SR_IRQ(LPM0_bits); }  详情 回复 发表于 2004-9-1 18:39
 
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你的硬件电路上的输入是多少,单片机的引脚上输入电压是多少?很可能是中间的隔离电路造成的原因!
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
就是测得的单片机引脚上的输入电压经过转换后的数值与给定的转换公式换算过来的数值不符啊?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
哦,你使用的是什么公式啊,脚上的输入电压是多少啊?转换结果是什么啊?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
公式不就一个吗?data = 4095*(Vin - Vr-)/(Vr+ - Vr-),采用内部参考2.5V,是不是就是令Vr+=2.5V,Vr- = 0V,将测得的引脚输入电压带入公式后,得到的结果与仿真结果不吻合啊。
并且每次输入不同的电压,得到的转换结果如果用曲线表示的话,是非线性的。怎么回事啊?搞不懂,谁来帮帮忙?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
(系统采用内部2.5伏参考电压,单通道单次转换模式,采用A2输入通道)
#include "msp430x13x.h"

static unsigned int results;

void main(void)
{
WDTCTL = WDTPW+WDTHOLD;
P6SEL |= 0x04;
ADC12CTL0 = 0x0270;
ADC12CTL1 = SHP;
ADC12MCTL0 = 0x02;
ADC12IE = 0x01;
ADC12CTL0 |= ENC;
_EINT();
/***************************************************************/
试试改为如下:
while(1)
{
ADC12CTL0 |= ADC12SC;
ADC12CTL0 & = ~ADC12SC;

ADC12CTL0 |= ADC12SC;
ADC12CTL0 & = ~ADC12SC;

ADC12CTL0 |= ADC12SC;
ADC12CTL0 & = ~ADC12SC;

ADC12CTL0 |= ADC12SC;
ADC12CTL0 & = ~ADC12SC;
_BIS_SR(LPM0_bits);
}
/**************************************************************/
}

interrupt[ADC_VECTOR] void ADC12ISR (void)
{
results = ADC12MEM0;
_BIC_SR_IRQ(LPM0_bits);
}[/quote]
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
你先试试我楼上哥们的程序吧,VIN是测的你单片机引脚的电压吗?要是还不可以的话,我可以把我的汇编程序发给你!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
这么改是什么意思?俺有点笨,不懂啊,可否解释一下?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
有两个原因你可以参考一下
1 测量一下参考元,因为它是在2.4-2.6的范围之间
2 采样是进太短,适当的演唱采样时间
3 输入阻抗太小,价格电压跟随器。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
还是斑竹厉害,佩服,能回答一下我的浮点库问题吗,谢了
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

11
 
static unsigned int results;

void main(void)
{
WDTCTL = WDTPW+WDTHOLD;
P6SEL |= 0x04;
ADC12CTL0 = 0x0270; /* ADC12ON+REFON +REF2_5V +SHT0_2(4分频)*/
ADC12CTL1 = SHP; /*你ADC的时钟源好像是ACLK 采样/转换时钟是ADC12SC*/
ADC12MCTL0 = 0x02;
ADC12IE = 0x01;
ADC12CTL0 |= ENC;
_EINT();

while(1)
{
ADC12CTL0 |= ADC12SC; /*你1次采样/转换需要 (ADC12SC*X / SHT0_2)
如果设为连续采样就不需要ADC12SC */
_BIS_SR(LPM0_bits);
}
}

interrupt[ADC_VECTOR] void ADC12ISR (void)
{
results = ADC12MEM0;
_BIC_SR_IRQ(LPM0_bits);
}
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表