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