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:
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
returnresult;
32
}
Mehr oder weniger der Beispielcode aus dem Tutorial, der Aufruf in Main
ist dann einfach:
1
uint16_tadcval;
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
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.
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
>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.
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.
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. ;)
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
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.
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