0

我一直在使用 ATmega128,现在我正在研究 ATmega2560。我已经在 128 中尝试过 ADC。当我在 2560 中尝试时,除了更改它时,我没有问题。我在 codevision 中编写了这段代码。仅使用单个通道时效果很好,但是在更改通道时会出现不稳定的行为。问题是什么 ?

这里的代码

void ADC_init(void)
{
     PINF=0;
     PORTF=0;
     PINK=0;
     PORTK=0;
     ADMUX  = 0b01000000;
     ADCSRA =0x87; //ADEN=1,ADIE=0
     ADCSRB=0x00;
}

void ADC1_read(void)// current - ADC1
{
    ADMUX=0x41;
    ADCSRA|=0x40; //ASSC=1 (ad_start)
    ADCSRB=0x00;
    while((ADCSRA&(1<<ADSC)));    //while((ADCSRA&0x10)==0);
    ADCSRA |= (1<<ADIF);
    cur_l=ADCL;
    cur_h=ADCH;
    cur_buf=cur_h;//0x03;
    cur_buf=(cur_buf<<8)|cur_l;
    cur_vol = (unsigned long)(((unsigned long)cur_buf*500)/1023);                      
}

void ADC3_read(void)  //temp sensor - ADC3
{
    unsigned long temp_volt;
    ADMUX = 0xC3;
    ADCSRA|=0x40; //ASSC=1 (ad_start)
    ADCSRB=0x00;
    while((ADCSRA&0x10)==0);
    ADCSRA |= (1<<ADIF);
    temp_l=ADCL;
    temp_h=ADCH;
    temp_buf=temp_h;//0x03;
    temp_buf<<=8;
    temp_buf|=temp_l;
    temp_volt = (unsigned long)(((unsigned long)temp_buf*256)/1023);    
    temp_analog = (unsigned long)(((unsigned long)temp_buf*256)/1023)-50;
}

Main里面的处理函数是这样的:

void process(void)
{
    static unsigned char tick_2sec=0, tick_3sec=0;
    unsigned char rx2;

    if (tick_1sec){
            tick_2sec++;
            tick_3sec++;
            tick_1sec = 0;            
    }
    if (tick_2sec == 2){
        tick_2sec = 0;
        if (t2 == 1){
            t2 = 0;
            ADC3_read(); //temp            
        }
    }
    if (tick_3sec == 3){
        tick_3sec = 0;
        if (t3 == 1){
            t3 = 0;
            ADC1_read(); //current           
        }
    }                          
}

我使用温度传感器 TMP36 输入 ADC3,在 20 C 时,输出电压约为 0.7 V。当仅使用 ADC 3 和 2.56 V 参考电压时,从 ADCH 和 ADCL 获取的值是 0x118。同样,我将 ADC1 连接到在正常情况下输出 2.48 伏的电压源。当我只使用参考电压为 5 伏的 ADC1 时,ADCH 和 ADCL 的输出为 509。随着电压的变化,ADCH 和 ADCL 寄存器也相应变化。当我调用函数以 2 和 3 秒的间隔读取 ADC1 和 ADC3 时,如代码所示,在相同的电压下,ADCH 和 ADCL 的内容与上面不同。ADC3 的 ADCH,L 为 137-140,ADC1 的 ADCH,L 为 340-352。

4

2 回答 2

1

过去从不同的 ADC 引脚读取数据时,我也遇到过类似的问题。原来最后的读数影响了当前的读数。当前值偏高或偏低于上次读数。

我当时解决了我的问题,方法是从同一个引脚读取两次,并且只使用第二个。

从那以后,我了解到问题可能来自电路中的电容。一些残余电荷从先前的电压留在电路中,这会影响下一次读数的电压。我怀疑在被读取的设备上添加电容器可能会克服这个问题,但我从来没有机会测试它。

于 2014-03-28T19:58:38.760 回答
0

与任何此类 ADC 一样,AVR ADC 使用“采样和保持”输入配置。“保持”功能是使用电容器实现的。当您从一个通道切换到另一个通道时,这个“保持”电容需要时间来稳定到新值。这个时间取决于您的硬件/软件配置(增益设置、输入源阻抗等。)这就是为什么读取两次值可以解决您的问题,“保持”电容器需要一些额外的时间来稳定到新值. 选择频道然后稍等片刻应该会提供相同的结果。

于 2017-04-27T15:34:03.640 回答