打印
[AVR单片机]

mega48 ADC怎么误差这么大?请指点

[复制链接]
3488|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
POWTE|  楼主 | 2012-10-4 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用mega48的AD,用内部1.1V的基准,单次转换,出来的数据误差很大,是什么原因呢?
结果如下,测了几个数值,输入电压越低误差越大。如果是几个数字的误差,还能修正。可是输入电压低时有18个字的误差!!
输入电压V基准电压V应得值测得值
0.0191.0718 1
0.0271.0726 8
0.0641.0761 45
0.0911.0787 69
0.151.07144 126
0.1841.07176 158
0.1871.07179 161
0.3951.07378 372
0.4631.07443 435
0.861.07823 820


单片机5V供电,程序见下,winavr
void ADC_Init()
{
    Adc_DDR=0;
    Adc_PORT=0;
    DIDR0=0x3f;        //禁止管脚数字寄存器。
    ADMUX=(1<<REFS1)|(1<<REFS0);        //内部1.1V基准.
    ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);    //64分频,125K.
}

//
void AtoD(void)
{
    uint8_t i=0;
    uint8_t j;
   
//    ADMUX&=0xf0;
    ADMUX=(1<<REFS1)|(1<<REFS0);        //内部1.1V基准.
    while(i<6) //6
    {
//        if(i==2)ADMUX=0xce;
        _delay_us(50);            //测量内部1.1,需要延时50us,测量才准确。
        for(j=0;j<4;j++)
        {
            if(j==0)ad_data=0;
            ADCSRA|=(1<<ADSC);
            loop_until_bit_is_clear(ADCSRA,ADSC);        // wait until ADC is finish;   
            ad_data+=ADC;
        }
        ad_data=ad_data/4;
        ADMUX+=1;
        i++;
    }
}

相关帖子

沙发
POWTE|  楼主 | 2012-10-4 12:19 | 只看该作者
硬件上,输入单片机的电压,在管脚上都有加104滤波,是稳定电压。AD出来的数值也稳定,不会变化。

使用特权

评论回复
板凳
NE5532| | 2012-10-5 15:17 | 只看该作者
输入电压短路(0V)再测,然后输入1.1V的,再测。

使用特权

评论回复
地板
XZL| | 2012-10-10 16:29 | 只看该作者
在AD输入口要加滤波电容。

使用特权

评论回复
5
xdy1927| | 2012-10-10 23:13 | 只看该作者
你可以把AD通道切换到内部基准上面测一下基准看输出是多少,另外再用你的表测一下VREF的值,看看具体是你的输入值不对应还是其它问题。

使用特权

评论回复
6
POWTE|  楼主 | 2012-10-14 21:14 | 只看该作者
终于搞好了。
是我的一个疏忽造成的。AD的程序没有问题。AD的问题一时解决不了,就继续调试其它功能,到今天,忽然发现单片机耗电有70mA,这肯定不正常,就查原因,发现有一个管脚电平没有处理,高低电平短路了。修改后,功耗下降为12mA,这时再测AD,结果正常了,没有那么大偏差了。
一时马虎啊!从这方面看,要想AD准,一定要降低功耗,能休眠测最好。

使用特权

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

本版积分规则

5

主题

69

帖子

1

粉丝