AVR ADC teilweise fehlerhafte Ausgabe

OP #2502380
Lesenswert?

Hallo,
ich habe den ADC im Atmega8 in Betrieb genommen.
Die ADC-Eingangsspannung von 0-5V wird über ein Poti eingestellt, 
Ausgabe über UART auf PC.

Auf den ersten Blick funktioniert alles sehr gut.
Ich vergleiche die am PC (über UART) angezeigten Werte mit der 
gemessenen ADC- Eingangsspannung (gemessen mit Digitalvoltmeter DVM). 
Sehr gute Übereinstimmung.

Allerdings sieht es so aus, als würden der ADC in einem sehr kleinen 
Spannungsbereich zwischen 3.62 Volt und 3.72 Volt nicht mehr richtig 
wandeln. Die Ergebnisse sehen da immer so aus und sind reproduzierbar:

DVM           PC(UART)
..                 ..
3.60 Volt     3.60 Volt
3.61 Volt     3.61 Volt
3.62 Volt     3.62 Volt
3.63 Volt     3.62 Volt
3.64 Volt     3.62 Volt
u.s.w.           ...
...                 ...
3.70 Volt     3.62 Volt
3.71 Volt     3.62 Volt
3.72 Volt     3.62 Volt
3.73 Volt     3.73 Volt
...                ...

d.h. regele ich die Spannung am Poti von 0...5Volt, bleibt der 
ADC-Ausgang im Bereich von 3.62 Volt bis 3.72 Volt bei konstanten 3.62 
Volt hängen und zeigt erst oberhalb 3.72 Volt wieder korrekt an.
Ähnliches passiert auch, wenn ich von 5...0Volt regele, dann bleibt der 
ADC in dem gleichen Bereich, allerdings dann bei 3.72 Volt hängen, um 
unterhalb von 3.62 Volt wieder richtig anzuzeigen.

Folgende Maßnahmen haben bisher nicht geholfen:
verschiedene prescaler (Abtastrate)
unterschiedliche Mittelwertbildung
neuer Controller
Ausgabe an LCD Modul und nicht über UART
alle Spannungen mit Oszi gemessen (keine Besonderheiten)
anderes Poti

Kann mir jemand noch einen Hinweis zur Fehlersuche geben?

Danke im Voraus.
Angehängte Dateien:
#2502382
Lesenswert?

Lass dir mal zusätzlich die direkten ADC Werte ausgeben, damit du erst 
mal weißt, ob der ADC schon in der Messung das Problem hat, oder ob dir 
in der Umrechnung nach Volt etwas Unvorhergesehenes passiert.
1
  uint16_t wert;
2

3
  ...
4
  while(1)
5
  {
6
    wert = ADC_read_avg(0, 64);
7
    res = (wert * 4.96) / 1023;
8

9
    utoa( wert, buffer, 10 );
10
    uart_puts( buffer );    
11
    uartPuts( " " );
12

13
    dtostrf(res, 5, 2, buffer);
14
    uart_puts( buffer );
15
    uart_puts( "\r\n" );
16
  }
17
}
#2503005
Lesenswert?

Hallo,

ich finde zwei Probleme:

a) in der adc-init wird 3x ADCSRA = ..; geschrieben.

somit überschreibt man alle vorherigen Einstellungen und der ADC wird 
nicht korrekt initialisiert.

b) in der adc-read wird der ADC-Kanal geändert, aber nicht die erste 
Wandlung verworfen. Siehe dazu das Datenblatt !

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