打印
[AVR单片机]

奇怪问题--Atmega8L的AD转换误差

[复制链接]
4488|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sanxingyu|  楼主 | 2007-1-4 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    参考电压源是采用外部VREF管脚的电压,转换周期26uS。当所检测的电压为0时,AD转换结果居然在31和30即0x1f和0x1e之间跳动, 当检测的电压为1V时这个偏差大概为25,2V左右时,偏差大概为20。百思不得其解,AVR的AD转换不应该会存在如此之大的偏差呀,我用Atmega16L也试过了,也是存在同样的问题。郁闷呀,这个问题花了我几天的时间都还没解决,请各位大侠不吝赐教呀~~~~~~~~~~~
以下是我的程序
void adc_init(void)
{
 ADCSR = 0x00; //disable adc
 ADMUX = 0x00; //select adc input 0
 ACSR  = 0x80;
 ADCSR = 0xA3;
}
unsigned int ReadADC( unsigned char channel)
{
    unsigned int i = 0 ;
    channel &= 0x0f ;
    CLI(); 
    ADMUX &= 0XF8 ;    
    ADMUX |= channel;               
    ADCSR |= 0x40;                     
    while (!(ADCSR & 0x10));        
    ADCSR |= 0x10;  
    i = ADCL;       
    i += (unsigned int)ADCH << 8;         
    SEI();  
    return i;
}

              

相关帖子

沙发
zhiwei| | 2007-1-4 17:19 | 只看该作者

26uS,速度太快了吧。

你的ADC时钟是500k?超出最大时钟限制了。推荐应该是50-200k。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
842022884 + 1 很给力!
板凳
coldra| | 2007-1-4 17:28 | 只看该作者

AVR单片机AD有误差

但不会太大,只要参考源稳定,模拟和数字电路布线处理好,相互不干扰问题不大,我通常用中断模式,看一下楼主程序
void adc_init(void)
{
ADCSR = 0x00; //disable adc-这个寄存名应该是ADCSRA,你能编译通过?可能你我编译器不一样
ADMUX = 0x00; //select adc input 0
ACSR  = 0x80;
ADCSR = 0xA3;//使能,连续转换,8分频,其实看下面你应该用单次转换模式
}
unsigned int ReadADC( unsigned char channel)
{
    unsigned int i = 0 ;
    channel &= 0x0f ;
    CLI(); 
    ADMUX &= 0XF8 ;  //清通道位设置  
    ADMUX |= channel;     //改为所需通道 其实可以先读通道,如果不一致再改通道,通常改后的通道第一次转换可能误差较大。         
    ADCSR |= 0x40;        //ADCSRA |= 0x40    ,开始转换         
    while (!(ADCSR & 0x10));        //等待转换结束
    ADCSR |= 0x10;  //硬件清零,可以删掉该句
    i = ADCL;       //
    i += (unsigned int)ADCH << 8;   //这两句可以合写成i=ADC;      
    SEI();  
    return i;
}

使用特权

评论回复
地板
sanxingyu|  楼主 | 2007-1-4 17:50 | 只看该作者

太感谢各位大虾的热心指导了!!

太感谢各位大虾的热心指导了!!我用的编译器是ICCAVR。
语句ADCSR = 0xA3;是我自己写的时候搞错了,实际上我是用ADCSR = 0x83;
但也存在同样的问题。 有可能是coldra所说的
“  ADMUX |= channel;     //改为所需通道 其实可以先读通道,如果不一致再改通道,通常改后的通道第一次转换可能误差较大。 ”

使用特权

评论回复
5
dadodo| | 2007-1-5 13:20 | 只看该作者

改变通道后的第一次采样值应抛弃不用

只要给ADMUX赋值,哪怕ADMUX的值没变,第一次采样的结果也会有很大误差

使用特权

评论回复
6
qjy_dali| | 2007-1-5 21:52 | 只看该作者

不得不说:AVR的AD是不怎么样

使用特权

评论回复
7
gtw| | 2007-1-6 12:51 | 只看该作者

只能说是你的问题

如果像你所说,atmel连一个下三烂的IC厂都不如了
市场也不会接受啊。

还是自身找原因吧。

使用特权

评论回复
8
lz13| | 2007-1-8 22:45 | 只看该作者

蛮好用

我现在用48,挺好用的,用内部基准,10位过采,做到12位,采用值,一动不动,并且准,应该AD的输入口,最好显式设置为输入口.然后,在48里,还应该将它将数字口完全脱开.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

1

粉丝