Forum: Mikrocontroller und Digitale Elektronik ADC halb falsch


von timebeast (Gast)


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:
1
uint16_t ReadChannel(uint8_t mux)
2
{
3
uint8_t i;
4
uint16_t result;
5
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);  // Frequenzvorteiler 
6
      // setzen auf 8 (1) und ADC aktivieren (1)
7
ADMUX = mux;        // Kanal waehlen
8
ADMUX |= (1<<REFS0);    // Ref.spannung AVCC, Kondensator (100nF) an AREF 
9
 
10
// "Dummy-Readout"
11
   ADCSRA |= (1<<ADSC);       // eine ADC-Wandlung 
12
   while ( ADCSRA & (1<<ADSC) );// auf Abschluss Konvertierung warten 
13
 
14
// ADCW muss gelesen werden
15
  result = ADCW;  
16
 
17
// Eigentliche Messung
18
  result = 0; 
19
20
  for( i=0; i<4; i++ )
21
  {
22
  ADCSRA |= (1<<ADSC);// eine Wandlung "single conversion"
23
  while (ADCSRA & (1<<ADSC));// auf Abschluss Konvertierung warten
24
  result += ADCW;       // Wandlungsergebnisse aufaddieren
25
  }
26
27
  ADCSRA &= ~(1<<ADEN);  // ADC deaktivieren (2)
28
 
29
  result /= 4;  // Summe durch vier teilen = arithm. Mittelwert
30
 
31
return result;
32
}

Mehr oder weniger der Beispielcode aus dem Tutorial, der Aufruf in Main 
ist dann einfach:
1
  uint16_t adcval;
2
  adcval = ReadChannel(5);   //für das Auslesen von ADC5
So weit so gut, funktioniert ja auch,... fast...
Bei der Abfrage:
1
    if (adcval<940){
2
      Led_aus();
3
    }
4
    else {
5
      Led_an();
6
    }
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

von I_ H. (i_h)


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.

von timebeast (Gast)


Lesenswert?

Moin,
1
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

von Johannes M. (johnny-m)


Lesenswert?

timebeast wrote:
>
1
> ADMUX |= (1<<REFS0);    // Ref.spannung AVCC, Kondensator (100nF) an
2
> AREF
3
>
>
> 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.

von Starter (Gast)


Lesenswert?

>VCC hat an AREF nichts zu suchen

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

von Johannes M. (johnny-m)


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.

von Starter (Gast)


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

von Ingo E. (ogni42)


Lesenswert?

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

von timebeast (Gast)


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

von Johannes M. (johnny-m)


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.

von timebeast (Gast)


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

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.