Forum: Mikrocontroller und Digitale Elektronik ATMega88 ADC Wert verfälscht, 2 Kanäle


von Andy (Gast)


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

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Andy schrieb:
> 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.

Lass mich raten: Du hast an PC1 kein Signal angeschlossen...

von Andy (Gast)


Lesenswert?

Lass mich raten:
Du hast recht...

Danke ;-)

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Bitte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.