一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3445|回复: 13

[其他综合] 请教一下,AD 转换结果狂跳的问题

[复制链接]
发表于 2013-11-14 21:41 | 显示全部楼层 |阅读模式
uint mega16_ad()
{
         uint addata;
         DDRA=0X00;
         PORTA=0X00;
         cli();
         ADMUX        = 0x00;
         ADCSRA=0x87;
         ADCSRA|=BIT(ADSC);
         ACSR= 0x80;
         SFIOR |= 0x00;
         while(!(ADCSRA&(BIT(ADIF))));
         addata=ADCL;
         addata=addata+ADCH*256;
         ADCSRA|=BIT(ADIF);
         ADCSRA=0X00;
     sei();
         return addata;
}
void port_init(void)
{
         PORTA = 0x00;
         DDRA  = 0x00;        
}
void init_devices(void)
{
         port_init();
         MCUCR  = 0x00;
         MCUCSR = 0x80;//禁止JTAG
         sei();//开全局中断
}

int main(void)
{
         uint i;
         uchar ad0[4]={0,0,0,86,86};//初始值
        init_devices();
         LCD_init(); //LCD初始化
        LCD_clear();//清屏
        DDRD  =0xff;               
         while(1)
         {  
         int xx=mega16_ad();
         itoa(xx,ad0,10);// int to uchar
         for(i=0;i<=4;i++)                                        //显示转换的数值
                {                                                                                                                                                                                                                                                                                                                                                                                 
                         LCD_write_char(i,0,ad0[i]);  
                         _delay_ms(10);
                 };        
                 _delay_ms(10);
                 LCD_write_str(0,1,"yes?+2");//第二行显示
                PORTD =0xcd;//点亮LED
         }
初学单片机,看着手册设定的各个寄存器,现在AD转换的结果在400~500之间狂调,用的外部参考电压5V也不至于这样吧,
还有一点不理解的,ADCH+ADCL,应该显示在0-255之间,怎么会一直显示400~500呢?
硬件环境是在X宝买的M16最小系统,看原理图AVCC aref连在一起的。
求大神指点一下,上述不妥之处无喷,毕竟谁都有第一次吧。

发表于 2013-11-14 21:47 | 显示全部楼层
10位ADC的话,应该显示在0-1023之间.
400-500之间不是很正常吗?
回复

使用道具 举报

发表于 2013-11-14 21:48 | 显示全部楼层
就是跳的厉害了些.
看看你的电源,基准,还有输入是否滤波良好且稳定
回复

使用道具 举报

发表于 2013-11-14 21:49 | 显示全部楼层
AD的结果计算是
addata=ADCL;
addata=addata+ADCH*256;
这是一个UINT型的值,最大65535
回复

使用道具 举报

 楼主| 发表于 2013-11-14 22:04 | 显示全部楼层
yanjian 发表于 2013-11-14 21:48
就是跳的厉害了些.
看看你的电源,基准,还有输入是否滤波良好且稳定

用万用表测了一下,aref5.00V貌似还算稳定吧。
回复

使用道具 举报

发表于 2013-11-14 22:26 | 显示全部楼层
多少位的AD?只取高位
回复

使用道具 举报

发表于 2013-11-15 00:57 | 显示全部楼层
你现在只看到跳,还没看到温漂呢。呵呵继续努力,啥时候看到温漂了,算是ad入门了。
回复

使用道具 举报

发表于 2013-11-15 12:38 | 显示全部楼层
M16 10位精度,奇怪的是我要是只显示ADCH的话,显示出来的数字就“固定”了,这个固定的意思是不管测什么样的电压都不变。神奇
回复

使用道具 举报

发表于 2013-11-15 12:57 | 显示全部楼层
zqdl88 发表于 2013-11-15 12:38
M16 10位精度,奇怪的是我要是只显示ADCH的话,显示出来的数字就“固定”了,这个固定的意思是不管测什么样 ...

取高位不是说ADCL都扔掉  是看情况舍弃最后的几位
回复

使用道具 举报

发表于 2013-11-15 13:02 | 显示全部楼层
或者可以取N次然后求平均值,或者用算法滤波。。。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-31 18:28 , Processed in 0.033759 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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