ATMega88 ADC Wert verfälscht, 2 Kanäle

Gast #2916066
Lesenswert?

Hallo,
ich lese mit dem ATMega88 den ADC an PC0 und PC1 aus.
Beschaltet mit externem Quarz 16MHz.
AVCC (Spule 100µH gegen 5V, Kondensator 100nF gegen Masse)
AREF (Kondensator 100nF gegen Masse)

Dazu verwende ich folgende Routinen:
1
void adc_init(void)
2
{
3
  ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADEN);
4
  ADMUX = (1<<REFS0);
5
  ADCSRA |= (1<<ADSC);  
6
  while (ADCSRA & (1<<ADSC));
7
  (void)ADCW;            
8
}
9

10

11
uint16_t read_channel(uint8_t channel)
12
{
13
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
14
  ADCSRA |= (1<<ADSC);
15
  while (ADCSRA & (1<<ADSC));
16
  return ADCW;
17
}

Der Aufruf in der main() sieht folgendermaßen aus:
1
...
2
    temp=read_channel(0);
3
    adc_buffer[0]=temp & 0x00FF;
4
    adc_buffer[1]=temp & 0xFF00;
5
    current_left=(uint16_t)(adc_buffer[1]+adc_buffer[0]);
6
    
7
    
8
    temp=read_channel(1);
9
    adc_buffer[2]=temp & 0x00FF;
10
    adc_buffer[3]=temp & 0xFF00;
11
    current_right=(uint16_t)(adc_buffer[3]+adc_buffer[2]);
12
...

Im Ruhezustand (PC0 und PC1 nicht beschaltet) liefert der ADC exakte 
Werte. Auch wenn ich beispielsweise die zweite Wandlung auskommentiere 
liefert er richtige Ergebnisse. Wenn ich jedoch z.B. auf PC0 einen 
Sprung auf 5V gebe, so liefert der ADC an PC1 nicht mehr 0V, sondern 
wird allmählich auf knapp 5V gezogen.

Ich könnte mir vorstellen, das die Zeit zwischen den beiden Wandlungen 
zu knapp bemessen ist und dadurch der Kondensator des ADC nicht genügend 
Zeit hat sich wieder zu entladen. Aber selbst wenn ich ein delay 
zwischen beide Aufrufe mache, tritt dieses Problem auf.

Viele Grüße,
Andy

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren