EysTech 发表于 2012-10-31 17:02:30

ATMEGA128内部ADC为何转换不正确?

AVR的输入信号是通过放大器输出的信号,用福禄克的万用表测量放大器的输出是正常的,但是无论怎了测量就是不对,AREF脚接外部3V参考电压,初始化程序严格按Datasheet里面来写的,结果读取数据发送出来发现根本不对,实际是198mv,结果转换出来乱七八糟的,只能看出电压变大还是变小的效果,但是测量的电压值相差甚远!请教下各位会是哪个地方出了问题呢?》硬件的问题还是软件的问题?

EysTech 发表于 2012-10-31 17:06:10

这是初始化函数
void MyAdcConfig(void)            
{
       ADMUX = 0x00;                      //外部参考,通道0
       ADCSRA = 0xA0;                  //使能ADC,暂时不启动转换,禁止中断.连续转换模式
       ADCSRA |= (1<<ADSC);         //启动转换
}

EysTech 发表于 2012-10-31 17:06:33

这是读取数据的函数
float GetAdcData(void)
{
        unsigned char TempH,TempL;                                         /*接收变量*/
        unsigned int Temp=0;                                                /*ADC内码值*/
        float Vx=0;                                                                       /*电压值*/
        while((ADCSRA & 0x10) != 0x10);                                /*等待转换完成*/       
        TempH = ADCH & 0x03;                                                 /*保留低2位*/
        TempL = ADCL ;                                                           /*低八位*/
        Temp = (TempH<<8)|TempL;                                        /*组合数据*/
        Vx = (Temp*REF)/1024;                                                /*换算成电压值*/
        return(Vx);                                                                        /*电压值*/
}

gumogumo 发表于 2012-10-31 20:14:17

ADMUX=0x00;
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADIF);
delay=0;
while(((ADCSRA&0x10)==0x00)&&delay++<0xf0);
Temp=ADC&0x3ff;(结果可以直接读出来)

我用这个可以的

jimmy_xt 发表于 2012-10-31 20:33:27

用的晶振是多少的?
注意ADC的时钟必须限制在200K以下。

改下分频系数试试

EysTech 发表于 2012-10-31 22:01:06

jimmy_xt 发表于 2012-10-31 20:33 static/image/common/back.gif
用的晶振是多少的?
注意ADC的时钟必须限制在200K以下。



我用的是外部晶振11.0592MHZ的晶振   ,分频系数最大和最小我都试过了还是不行,AVR会不会因为配置不当烧毁内部电路或者输入通道什么的!?

EysTech 发表于 2012-10-31 22:04:12

gumogumo 发表于 2012-10-31 20:14 static/image/common/back.gif
ADMUX=0x00;
ADCSRA=(1

我明儿试试你这个程序!
页: [1]
查看完整版本: ATMEGA128内部ADC为何转换不正确?