Forum: Compiler & IDEs AVR ADC teilweise fehlerhafte Ausgabe


von Chris H. (sauerland)


Angehängte Dateien:

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.

von Karl H. (kbuchegg)


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
}

von Hunt W. (hunt_work_er)


Lesenswert?

Christoph Heer schrieb:
> Kann mir jemand noch einen Hinweis zur Fehlersuche geben?

ich sehe keinen fehler

von Christoph Heer (Gast)


Lesenswert?

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.

von Uwe (de0508)


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 !

von Stefan E. (sternst)


Lesenswert?

1
  /* ADC Prescale (64) */
2
  ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
3
  
4
  /* Activate ADC */
5
  ADCSRA = (1<<ADEN);
Du betreibst den ADC ohne Prescaler, also mit viel zu hohem Takt.

von Uwe (de0508)


Lesenswert?

Des weiteren ist noch in der main.c ein Fehler:
1
char buffer[5];

das reicht nicht für den String aus.

von Stefan E. (sternst)


Lesenswert?

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.

von Christoph Heer (Gast)


Lesenswert?

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);

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.