AVR ADC teilweise fehlerhafte Ausgabe

OP #2502380
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:
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
}
Gast
Vielen Dank für die schnellen Antworten.
Leider ist das Problem auch bei den reinen ADC Werten schon vorhanden.
Werde es noch mal mit 2.56Volt interner Referenzspannung versuchen.
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 !
Uwe S. schrieb:
> b) in der adc-read wird der ADC-Kanal geändert, aber nicht die erste
> Wandlung verworfen. Siehe dazu das Datenblatt !

In welchem Datenblatt soll denn das stehen?

Das ist nur nötig beim Wechseln der Referenzspannung, oder beim 
Kanal-Wechsel im Differential-Mode, aber nicht beim "Otto-Normal" 
Kanal-Wechsel.
Gast
Danke für die guten Tips.
Letztendlich war's dann in der ADC Routine ein fehlerhafte Anweisung.

Falsch war:  ADCSRA = (1<<ADEN);
Richtig ist:  ADCSRA |= (1<<ADEN);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.