OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6432|回复: 13

STC12C5A60s2内部AD的问题,求解

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-9-24
在线时间
0 小时
发表于 2014-10-31 21:43:25 | 显示全部楼层 |阅读模式
5金钱
内部AD设置应该没问题,反复看过了,但是采样值一直很低,无论接多少V,AD值都在零点零几V左右飘忽,要是接地,就是非常准的0V

最佳答案

查看完整内容[请看2#楼]

void ADC_init() { P1ASF = 0xff; ADC_RES = 0; ADC_CONTR = 0xe0; delay_ms( 5 ); AUXR1 = 0x00; P1M0|=0x01;         //开漏模式 1_0= #00000000B P1M1|=0x01; } u16 ADC_process() { // int vol; ADC_CONTR = 0xe8; _nop_(); _nop_(); _nop_(); _nop_(); while (&nb ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-8-11
在线时间
0 小时
发表于 2014-10-31 21:43:26 | 显示全部楼层
void ADC_init()
{
P1ASF = 0xff;
ADC_RES = 0;
ADC_CONTR = 0xe0;
delay_ms( 5 );
AUXR1 = 0x00;
P1M0|=0x01;         //开漏模式 1_0= #00000000B
P1M1|=0x01;
}

u16 ADC_process()
{
// int vol;
ADC_CONTR = 0xe8;
_nop_();
_nop_();
_nop_();
_nop_();
while ( ! ( ADC_CONTR & ADC_FLAG ) );
ADC_CONTR = 0x00;
// vol = ( ADC_RES * 100 ) / 256;
// vol *= 5;
// return vol;
return ADC_RES;
}
回复

使用道具 举报

3

主题

2164

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5703
金钱
5703
注册时间
2013-11-22
在线时间
1198 小时
发表于 2014-10-31 22:30:27 | 显示全部楼层
AD值是一个经过计算的变量?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-10-31 23:09:34 | 显示全部楼层
帮顶.....
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-9-24
在线时间
0 小时
 楼主| 发表于 2014-11-1 17:33:55 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
是的
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-11-1
在线时间
2 小时
发表于 2014-11-1 20:53:33 | 显示全部楼层
变量没设置好,AD读回所要赋值的变量要用能用浮点型的。
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-11-1
在线时间
2 小时
发表于 2014-11-1 20:54:10 | 显示全部楼层
跟我之前用stc12C5204AD的情况一样
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-9-24
在线时间
0 小时
 楼主| 发表于 2014-11-1 22:01:54 | 显示全部楼层
回复【6楼】廖向涵:
---------------------------------
是AD的RESL和RESL的取回值要用浮点型变量装载?我试了下,没用啊
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-9-24
在线时间
0 小时
 楼主| 发表于 2014-11-1 22:12:58 | 显示全部楼层
回复【6楼】廖向涵:
---------------------------------
虽然不是那个问题,但是我找到了,是乘法过多的问题,方向对了,万分感谢
回复

使用道具 举报

23

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2014-2-16
在线时间
40 小时
发表于 2014-11-2 16:54:36 | 显示全部楼层
这是我以前写的一个程序  你可意参考一下 

ADC.rar

39.97 KB, 下载次数: 478

回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-11-12
在线时间
0 小时
发表于 2014-11-18 09:44:13 | 显示全部楼层
我最近也在用个这个单片机学习AD  也是 遇到这样的问题。请教楼主如何解决的么?
回复

使用道具 举报

3

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-8-11
在线时间
0 小时
发表于 2014-11-18 10:44:25 | 显示全部楼层
回复【8楼】OK工科男:
---------------------------------
是不是因为寄存器长度有限,要分步计算?我以前遇到过问题,分步计算就正确了。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-9-24
在线时间
0 小时
 楼主| 发表于 2014-11-26 23:26:53 | 显示全部楼层
回复【11楼】东阳马苏:
---------------------------------
具体问题不知道,只是用串口发送调试,一步一步,发现有的数据计算问题,数据没有溢出应该,但是算起来就是不对,不断的换计算公式,换计算函数,就对了最后,没总结出问题的共性
回复

使用道具 举报

3

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-8-11
在线时间
0 小时
发表于 2014-11-30 10:53:18 | 显示全部楼层
回复【13楼】东阳马苏:
---------------------------------
void ADC_init()
{
    1ASF = 0xff;
    ADC_RES = 0;
    delay_ms( 5 );
    AUXR1 = 0x00;    
    1M0|=0x01;         //开漏模式 P1_0= #00000000B
    1M1|=0x01;
}

u16 ADC_process( u8 ch )
{
    u16 vol;
    u8 adc_l;
    ADC_CONTR = ch + 0xe8;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while ( ! ( ADC_CONTR & ADC_FLAG ) );
    ADC_CONTR = 0x00;
    vol = ADC_RES;
    vol = vol * 4;
    adc_l =  ADC_RESL & 0x03;
    vol = vol + adc_l;
    return vol;
}   

不好意思,这个才对,前一个是错的。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表