MrLCL 发表于 2012-11-10 19:51:00

AVR ADC错误求解

//*******************************************************************/
//*
//* 电池电压检测
//*
//*******************************************************************/
void Vcheck()
{
if(ADCSRA&BIT4)
        {
      Vbat=ADCH*256+ADCL;
          while(!( UCSR0A & (1<<UDRE)) );
          UDR0=ADCH;
          while(!( UCSR0A & (1<<UDRE)) );
          UDR0=ADCL;
          while(!( UCSR0A & (1<<UDRE)) );
          UDR0=0XAA;
          Vbat=Vbat*33/1024;
          ADCSRA|=BIT4;
          ADCSRA|=BIT6;
    }
}

//*************************************************************************
//                        AD初始化函数
//*************************************************************************
void AD_init()
{
        ADMUX =0x00;               //选择通道0,数据右对齐,AREF为电压基准
    ADCSRA=0x92;               //adc使能,连续转换
    ADCSRB=0xF0;   
       
    SFIOR =0x00;               //控制和状态寄存器初始化
    EIFR =0xC0;                  //清中断标志位
    ADCSRA|=BIT6;
}

AD只是在上电的时候读一次
不知道什么原因

zhanan 发表于 2012-11-10 20:27:06

1.ad的频率比串口发送要快得多吧。函数vcheck()是ad中断程序吗?
2.读ad的H和L有顺序要求的,先低后高。可能这个是主要问题。

MrLCL 发表于 2012-11-11 10:19:13

zhanan 发表于 2012-11-10 20:27 static/image/common/back.gif
1.ad的频率比串口发送要快得多吧。函数vcheck()是ad中断程序吗?
2.读ad的H和L有顺序要求的,先低后高。 ...

没用中断,你说的先后顺序可能是这个问题
看我那个程序,Vbat=ADCH*256+ADCL。编译后,可能是先读 的高啊。明天我试试,今天拿不到板子,

zhanan 发表于 2012-11-11 10:29:21

读了ADCL后,就停止更新了。你那个程序下面有一个 UDR0=ADCL;

MrLCL 发表于 2012-11-11 11:00:12

zhanan 发表于 2012-11-11 10:29 static/image/common/back.gif
读了ADCL后,就停止更新了。你那个程序下面有一个 UDR0=ADCL;

可是,每次之后我都再次启动adc

yklstudent 发表于 2012-11-11 12:27:48

就不能换种写法方式 转换完了 再通过串口发送

MrLCL 发表于 2012-11-11 14:18:20

现在问题不是发上来,就是不发,也转换一遍

MrLCL 发表于 2012-11-11 16:20:23

zhanan 发表于 2012-11-10 20:27 static/image/common/back.gif
1.ad的频率比串口发送要快得多吧。函数vcheck()是ad中断程序吗?
2.读ad的H和L有顺序要求的,先低后高。 ...

是你说的那个问题,另外一个资料也说明了
必须先读取低位的,
页: [1]
查看完整版本: AVR ADC错误求解