www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC halb falsch


Autor: timebeast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe gerade ein wenig mit dem ADC rumgespielt, funktioniert auch soweit, 
aber hat ein eigenartiges Verhalten.
Vorab Basics: ATmega8, AVR-Studio, C

Ich habe eine variable Spannungsquelle 0V-5V Volt, der Prozessor ist auf 
externer Referenzspannung (5V) mit 100nF zwischen Masse und ARef.
Der Code:
uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);  // Frequenzvorteiler 
      // setzen auf 8 (1) und ADC aktivieren (1)
ADMUX = mux;        // Kanal waehlen
ADMUX |= (1<<REFS0);    // Ref.spannung AVCC, Kondensator (100nF) an AREF 
 
// "Dummy-Readout"
   ADCSRA |= (1<<ADSC);       // eine ADC-Wandlung 
   while ( ADCSRA & (1<<ADSC) );// auf Abschluss Konvertierung warten 
 
// ADCW muss gelesen werden
  result = ADCW;  
 
// Eigentliche Messung
  result = 0; 

  for( i=0; i<4; i++ )
  {
  ADCSRA |= (1<<ADSC);// eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC));// auf Abschluss Konvertierung warten
  result += ADCW;       // Wandlungsergebnisse aufaddieren
  }

  ADCSRA &= ~(1<<ADEN);  // ADC deaktivieren (2)
 
  result /= 4;  // Summe durch vier teilen = arithm. Mittelwert
 
return result;
}

Mehr oder weniger der Beispielcode aus dem Tutorial, der Aufruf in Main 
ist dann einfach:
  uint16_t adcval;
  adcval = ReadChannel(5);   //für das Auslesen von ADC5
So weit so gut, funktioniert ja auch,... fast...
Bei der Abfrage:
    if (adcval<940){
      Led_aus();
    }
    else {
      Led_an();
    }
macht er komische Sachen, die Led ist an, wunderbar, der Wert ist ja 
auch 5Volt, ich regele die Spannung langsam runter, wunderbar die Led 
geht aus,... dann geh ich noch weiter runter mit der Spannung und siehe 
da, die Led geht wieder an?!? hääääää?!? Was soll das denn?

Jemand ne Idee?

Gruß
Ralf

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn du den wirklich auf externe Referenz konfiguriert hast, dann 
häng ARef an VCC. Irgendwie muss die externe Referenz ja auch zum ADC 
kommen, und die unendliche Impedanz für Gleichstrom eines Kondensators 
ist da nicht gerade hilfreich.

Autor: timebeast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ADMUX |= (1<<REFS0);    // Ref.spannung AVCC, Kondensator (100nF) an AREF

wie jetzt, "wenn ich wirklich"?
Hab ich jetzt oder hab ich was falsch gemacht?
Ausserdem, der ADC bezieht doch seine Referenzspannung von AVCC oder 
irre ich mich da?

Gruß
Ralf

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
timebeast wrote:
>
> ADMUX |= (1<<REFS0);    // Ref.spannung AVCC, Kondensator (100nF) an
> AREF
> 
>
> wie jetzt, "wenn ich wirklich"?
> Hab ich jetzt oder hab ich was falsch gemacht?
> Ausserdem, der ADC bezieht doch seine Referenzspannung von AVCC oder
> irre ich mich da?
Das ist schon soweit korrekt. "I_ H." hat von AVRs anscheinend keine 
wirkliche Ahnung. VCC hat an AREF nichts zu suchen. Dein Kommentar oben 
ist allerdings irreführend, Du schreibst nämlich was von "externer 
Referenz", hast aber auf "intern AVCC" konfiguriert...

Ich kann in Deinem Code keinen frappierenden Fehler entdecken. Das 
Problem hört sich eigentlich nach einem Underflow der Datenvariable an.

Autor: Starter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>VCC hat an AREF nichts zu suchen

Bei älteren Typen schon. Da gibt's die interne Möglichkeit noch nicht.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Starter wrote:
>>VCC hat an AREF nichts zu suchen
>
> Bei älteren Typen schon. Da gibt's die interne Möglichkeit noch nicht.
Der Mega8 ist aber kein solcher "älterer Typ". Alles, wo nicht 
"AT90S..." draufsteht, hat die Möglichkeit, AVCC intern zu wählen.

Autor: Starter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze de externen Aref z.B. bei den DIL-40 Typen (mega32 usw.) aus 
Kompatibilitätsgründen. Da ich vom 90S8535 hochgerüstet habe war die 
Hardware schon entsprechend designed.
Würde also nicht generell sagen dass an Uref nicht Vcc dran darf, nur 
bei neuen Layouts mache ich das logischerweise auch intern. ;)

Autor: Ingo Elsen (ogni42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aref entkoppelt (mit 10u-100u Spule) zwischen Vcc und AVcc, ARef dann an 
AVcc?

Autor: timebeast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jupp, danke!!
Ich dachte schon ich wär "blöd", und.....
äääh, wie jetzt interne AVCC...

aaargh, nein, oky, mit dem Satz aus dem Datenblatt:
"AVCC with external capacitor at AREF pin" (Einstellung REFS0)
Das bedeutet also das nicht die Spannung an Pin-AVCC die 
Referenzspannung ist, sondern die gleich benannte interne 
Referenzspannung von 2,56V, oder ne, jetzt bin ich völlig verwirrt, 
nerv.

Also ich will das die Referenzspannung 5V beträgt. Dazu habe ich 5V an 
AVCC gelegt und einen 100nF Kondensator zwischen AREF und GND.

Das ist also falsch,AVCC gehört an 5V, der Kondensator gehört zwischen 
AVCC und GND (um die Spannung zu glätten) und an AREF gehört, äääh auch 
5V, als Referenzspannung,....

Also irgendwie...

Muß ich dann überhaupt AVCC noch anschließen?

Mit verwirrten Grüßen

Ralf

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
timebeast wrote:
> Also ich will das die Referenzspannung 5V beträgt. Dazu habe ich 5V an
> AVCC gelegt und einen 100nF Kondensator zwischen AREF und GND.
Genau so ist es richtig!

> Das ist also falsch,AVCC gehört an 5V, der Kondensator gehört zwischen
> AVCC und GND (um die Spannung zu glätten) und an AREF gehört, äääh auch
> 5V, als Referenzspannung,....
Nein!

> Muß ich dann überhaupt AVCC noch anschließen?
AVCC ist die Versorgungsspannung für den ADC und die Porttreiber der 
Pins, an denen die Analogeingänge hängen. Wenn Du die nicht anschließt, 
läuft gar nix.

Nochmal:
Bei allen aktuell am Markt erhältlichen AVRs mit ADC ist an AREF *nur 
dann* eine externe Spannung anzuschließen, wenn eine Referenz benötigt 
wird, die der Controller intern nicht zur Verfügung stellen kann. Da 
AVCC intern einstellbar ist, kommt in dem Fall nur ein kleiner 
Kondensator zwischen AREF und GND.

Autor: timebeast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hab rausgefunden woran´s liegt.
Fehler meinerseits. Mir war nicht klar das ein 78L05 nur dann 5V an OUT 
hat wenn die Spannung mindestens 1,7V über 5V liegt. Komme ich also 
unter 6,7 Volt ziehe ich dem Prozessor die Referenzspannung unter den 
Füßen weg, und der Wert den ich einlese steigt halt wieder...

Ich werd also die interne 2,56V Referenzspannung nehmen, und hoffen das 
die auch unter 5V Processorversorgung konstant bleibt. Für den Processor 
selber sollte das kein Problem sein, da es sich um einen ATmega8L 
handelt, der halt bis 2,7V noch funktionstüchtig bleibt.

Danke trotzdem für eure Bemühungen, es hat ja auch geholfen, zumindest 
konnte ich so eine Fehlerquelle ausschließen.

Schönen Tag noch
Ralf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.