搜索
bottom↓
回复: 12

M16 AD转换寻求帮助!

[复制链接]

出0入0汤圆

发表于 2014-1-4 16:46:12 | 显示全部楼层 |阅读模式
哎,做一块板子,做得头疼。ADC转换测试电压,得到的结果,电压值不停在变化,找了半天不知道那儿原因?

电路图如下:

使用ADC0通道进行测试5V电压,5V电压经过75K和51K电阻分压。

AREF使用单独制作的稳定5V电源。

ADC转换程序如下:
uint ADC_CONVERT_V()
{
         uint result;
         DDRA&=~BIT(PA0);
         PORTA&=~BIT(PA0);
         ADMUX=0;
         ADCSR=0XC6;
         while(!(ADCSR&(BIT(ADIF))));
         result=(int)(ADC*5000.0/1023.0*12.6/5.1);
         ADCSR|=BIT(7);
         return result1;  
}
这个程序在仿真软件上试验没有问题,但是在实际电路中测试,发现测试5V电压,在小数点第二位和第三位总是变化,每次测试的数值都不同。万用表实际测试5V电源很稳定,AREF电压也很稳定。

看了半天,发现LCD显示屏的RS,RW,E三个脚在AD转换的时候有电压变化,所以就将LCD这三个脚移动到别的引脚上,悬空了PA5,PA6,PA7三个引脚,这样改善后,测试得到的电压也没有明显改善。始终不知道问题出在那儿?

后来看DATASHEET上有,ADC噪声抑制模式,按照上面的说明改程序如下:
uint ADC_CONVERT_V()
{
         uint result;
         DDRA&=~BIT(PA0);
         PORTA&=~BIT(PA0);
         SREG|=BIT(7);
                  
         ADMUX=0;
         ADCSRA|=BIT(ADEN);
         ADCSRA|=BIT(ADIE);
         MCUCR|=0X50;
         asm("SLEEP");
         while(!(ADCSR&(BIT(ADIF))));
         result=(int)(ADC*5000.0/1023.0*12.6/5.1);
         ADCSRA&=~BIT(ADIE);
         ADCSRA&=~BIT(ADEN);
         SREG&=~BIT(7);
         return result;  
}
这样改后,连电压都不能测试了,怎么实验也没成功这个噪声抑制模式。不知道使用噪声抑制模式对ADC转换的结果变化有没有改善?

真心请教各位高手,耐心看看问题出在那儿?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-1-7 13:58:31 | 显示全部楼层
怎么没有人帮助呢?,现在还没有找到问题原因!

出0入0汤圆

发表于 2014-1-7 14:40:29 | 显示全部楼层
AVR我不是很了解,但是你的计算可以大幅度化简:
result=(int)(ADC*5000.0/1023.0*12.6/5.1);//需要注意,应该是1024而不是1023
这一句改写成如下两行,可以节省4次浮点运算以及一次浮点到整型的转换,误差为(-1.37, +0.49):
  1. result = ADC;
  2. result = (result<<3) + (result<<2) + (result+8)>>4
复制代码

如果你实在需要保证那1mV的精度,也应该先把后面的(5000.0/1023.0*12.6/5.1)这部分算好写成如下的样子:
result = ADC*12.06342

出0入0汤圆

发表于 2014-1-7 14:54:39 | 显示全部楼层
貌似5V AREF,8位AD,实际精度电压小数点后第二第三位波动不是很正常么。。。

出0入0汤圆

 楼主| 发表于 2014-1-9 15:09:31 | 显示全部楼层
eduhf_123 发表于 2014-1-7 14:40
AVR我不是很了解,但是你的计算可以大幅度化简:
result=(int)(ADC*5000.0/1023.0*12.6/5.1);//需要注意, ...

非常感谢!

出0入0汤圆

 楼主| 发表于 2014-1-9 15:10:50 | 显示全部楼层
chandle2735 发表于 2014-1-7 14:54
貌似5V AREF,8位AD,实际精度电压小数点后第二第三位波动不是很正常么。。。 ...

8位AD,分辨率应该是4.9mV啊,按道理应该是小数点后面第三位变化啊?

出0入0汤圆

发表于 2014-1-9 16:03:45 | 显示全部楼层
AD转换也有误差的啊,AVR的似乎是±2LSB,那么8位AD 误差0.02V不很正常的

出0入0汤圆

发表于 2014-1-9 16:14:04 | 显示全部楼层
硬件上,在AD输入的端口上加对地滤波电容......

软件上,按照实际要求做一定的数字滤波处理......

在达到要求的情况下,采样速度可以慢一些......

按照以往用16做AD的经验,采集到的AD值一般跳动在1~2左右,即ADC的跳动范围也就差不多±2......

出0入0汤圆

 楼主| 发表于 2014-1-9 16:18:25 | 显示全部楼层
菜鸟很热心 发表于 2014-1-9 16:03
AD转换也有误差的啊,AVR的似乎是±2LSB,那么8位AD 误差0.02V不很正常的

10位ADC分辨率不是0.005V吗?

出0入0汤圆

发表于 2014-1-9 16:18:34 | 显示全部楼层
最近刚做了一个应用的,也是检测5V电压,不过直接用的是AVCC作参考电压的,采集出的电压最多在0.01V跳动......

出0入0汤圆

 楼主| 发表于 2014-1-9 16:19:27 | 显示全部楼层
ada1983 发表于 2014-1-9 16:14
硬件上,在AD输入的端口上加对地滤波电容......

软件上,按照实际要求做一定的数字滤波处理......

这个跳动有点大吧!
我现在小数第二位跳动!

出0入0汤圆

发表于 2014-1-9 16:25:06 | 显示全部楼层
result=(int)(ADC*5000.0/1023.0*12.6/5.1);

没必要用浮点,改成如下也能用的:

result= ( (unsigned long ) ADC * 5000 * 126 / ( 1023 * 51 ) );

先做乘法,后做除法,减小余数的影响......实在想提高精度,还可对余数做一定的处理的......

出0入0汤圆

发表于 2014-1-9 16:30:45 | 显示全部楼层
blueice2014 发表于 2014-1-9 16:19
这个跳动有点大吧!
我现在小数第二位跳动!

0.01V不就是对应了0.005V的精度了么?

采样出来的 ADC 值范围是0~1023,跳动一般是1,经过运算,刚好在边界跳动话,5V电压精确到小数点后两位不刚好就是跳动0.01V么??
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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