Forum: Mikrocontroller und Digitale Elektronik Problem mit AD-Wandler ATMega8


von Kostja (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

ich möchte gerne eine Temperatur mit Hilfe eines Spannungsteilers 
messen. Angeschlossen habe ich alles wie im Bild im Dateianhang 
dargestellt. Mein Problem ist, dass der AD-Converter mir immer ein und 
die selbe Zahl liefert, auch wenn ich R(T) entferne und somit den 
Stromkreis des Spannungsteilers unterbreche. Sieht jemand wo mein Fehler 
ist oder hat zumindest Vermutungen?

Hier noch der Quelltextausschnitt:
unsigned short ADC_Val;
ADMUX = 0b11000000;    // RefVoltage 2,56V, Quelle C0
ADCSRA = 0b11100010;  // ADC ON, START, FREE RUNNING, INTERRUPT DISABLE, 
PRESCALE 4

  while(1)
  {
    while(!(ADCSRA &= 0b00010000)){}

    ADC_Val = ADCL;
    ADC_Val += (ADCH << 8);
...

von 2961 (Gast)


Lesenswert?

ARef und AVcc sollten richtig angeschlossen sein. siehen Datenblatt.

von Johannes M. (johnny-m)


Lesenswert?

2961 wrote:
> ARef und AVcc sollten richtig angeschlossen sein. siehen Datenblatt.
Sind sie doch (zumindest so, dass es funktionieren sollte). AREF über 
Kondensator an GND, AVCC an VCC. Gibts nix dran auszusetzen.

@Kostja:
Welche "Zahl" liefert er denn? Überprüf mal, ob die Spannung am Eingang 
nicht immer über 2,56 V ist. Außerdem: Du liest ADCL und ADCH zwar in 
der richtigen Reihenfolge ein, aber nimm trotzdem besser das 
16-Bit-Register ADC (oder ADCW), da brauchste Dir keine Gedanken um die 
richtige Reihenfolge zu machen (Voraussetzung ist natürlich, dass Dein 
Compiler ein 16-Bit-Register zur Verfügung stellt, ist aber bei allen 
mir bekannten Compilern der Fall).

von Tim (Gast)


Lesenswert?

Bitte prüfe auch ob die Spanung an AREF ca 2,56V ist.
Mit welchem Takt läuft dem µC?
GGF solltest du ADIF beim Init mit einer 1 zurücksetzten.

von 2961 (Gast)


Lesenswert?

Von Seite 6: AVcc
AVCC is the supply voltage pin for the A/D Converter, Port C (3..0), and 
ADC (7..6). It should be externally connected to V CC , even if the ADC 
is not used. If the ADC is used, it should be con-nected to V CC through 
a low-pass filter. Note that Port C (5..4) use digital supply voltage, 
VCC .

In der Tat, ARef ist hier anders als bei den Groesseren angeschlossen.

von Johannes M. (johnny-m)


Lesenswert?

2961 wrote:
> In der Tat, ARef ist hier anders als bei den Groesseren angeschlossen.
??? Was willst Du damit sagen?

Und der Filter am AVCC ist eine Empfehlung, kein muss. Funktionieren tut 
es i.d.R. auch ohne.

von Tim (Gast)


Lesenswert?

Wegen dem LC filter an AVCC:
Wenn man auf die letzen 1-2 bits des ADC Ergebnisses keinen wert legt, 
geht es ohne. Wenn doch sollte man die 10µH + 100nF einbauen. Dann aber 
bitte auch den Spannungsteiler aus AVCC versorgen, sonst bringt das 
nicht viel.

von Kostja (Gast)


Lesenswert?

Danke für die zahlreichen Antworten.

Hab zuerst gar nicht dran gedacht dass es vielleicht wichtig sein könnte 
aber. Der µC sollte ursprünglich mit 3686400 Hz laufen, hab mich bei der 
Beschaltung an einer anderen Schaltung orientiert wo vom Quarz nach 
Masse zwei Kapazitäten von 22pF lagen. Jedoch hab ich das übersehen und 
hab statt dessen 100nF eingelötet wodurch der µC mit 3686400 nicht lief. 
Um die Schaltung trotzdem testen zu können und weil ich 22pF grad nicht 
da hab, hab ich den Takt auf den internen RC-Oszillator 1MHz 
umgeschaltet.
Kann es sein dass es deshalb Probleme gibt da der Quarz an die 
entsprechenden Pins des µC noch angeschlossen ist?

Es wird die Zahl 968 zurückgeliefert
Die Messspannung liegt bei ca 2.00 V
An ARef hab ich etwas über 0V gemessen

von Tim (Gast)


Lesenswert?

Wenn der AVR auf internem Takt steht, ist ihm der Quarz egal.
Der Takt von 250kHz ist etwas hoch, aber unkritisch.

Dein Problem liegt hier:
>>An ARef hab ich etwas über 0V gemessen
Laut deiner ADMUX einstellung (REFS[1:0] = 11)
>>ADMUX = 0b11000000;    // RefVoltage 2,56V, Quelle C0
solltest du da 2,56V haben....

Ich Tippe mal auf einen Kurzschluss in deiner Schaltung der
AREF gegen Masse zieht.

von Kostja (Gast)


Angehängte Dateien:

Lesenswert?

Hmmmm, nein einen Kurzschluss zwischen ARef und Masse gibt es nicht.
Ich stell mal die ganze Schaltung und den Quelltext rein, vielleicht 
fällt einem geschulten Auge was auf.
Gemesen wird die Spannung die an R3 (unten mitte) abfällt.

von 2961 (Gast)


Lesenswert?

Es gibt aber schon noch eine GND Rueckseite auf der Leiterplatte ?
Gemaess Datenblatt sollen an ARef 2.56V hochohmig zur Verfuegung stehen.

von Tim (Gast)


Lesenswert?

Unabhänig davon das ich die Isolationsabstände zwischen dem 220V(?) und 
dem Rest für sehr gefährlich halte und auch die Leiterbahnbreite zu 
gering für eine 8A Sicherung ist, musst du für die korrekte Funktion des 
ADC eine
AREF haben (meine irgendwo gelesen zu haben das die >= 2V sein muss).
Der ADC misst nur zwischen Masse (ADC[H:L] = 0) und AREF (ADC[H:L] = 
1023).

Solange du also keine vernünftige AREF hast, funktioniert das nicht.

Zum testen könnte man ADMUX mal auf 0b01000000 stellen.
Dann sollte AREF = AVCC also 5V sein (C4 auslöten und messen).
Vieleicht ist ja auch der ADC im AVR defekt.

Ausserdem würde ich in der For-schleife noch ein
asm volatile ("nop");
empfehlen. Sonst wird die je nach eingestellter Optimierung weggelassen.

von Stefan W. (wswbln)


Lesenswert?

...die Isolierabstände sind nicht nur sehr gefährlich, sondern 
lebensgefährlich und wider jegliche Vorschriften!

@Kostja:
Schau Dir unbedingt mal die Platine eines Schltnetzteiles an, wie man 
sowas richtig macht und informiere Dich über die einzuhaltenden Luft- 
und Kriechstrecken. Die Zeitschrift Elektor hat IIRC auch in jeder 
Ausgabe eine Seite zu dem Thema.

von 2961 (Gast)


Lesenswert?

Da hat's noch Netz drauf ? Scheint so. Sowas mach man nie ! Nie ! Nie ! 
Immer ein externen Steckernetzteil einplanen. Weshalb ? Sobald man Netz 
drauf hat, gelten zu Recht andere Vorschriften.

Ein Steckerneztteil kostet 4 Euro und man ist die Sorge los.

von Kostja (Gast)


Lesenswert?

Keine Sorge die Isolationsabstände habe ich anschließend mit Paint 
nachbearbeitet (ich weis man kann sie zwar auch von vornherein im 
Layouteditor einstellen aber sei es drum). Was die Breite der Leitungen 
angeht die hohe Ströme führen, so hab ich an diese zusätzlich dickes 
Kupferdraht rangelötet.

@ Tim
>>...
>>musst du für die korrekte Funktion des
>>ADC eine
>>AREF haben (meine irgendwo gelesen zu haben das die >= 2V sein muss).
>>Der ADC misst nur zwischen Masse (ADC[H:L] = 0) und AREF (ADC[H:L] =
>>1023).

Mir fehlen wohl grundlegende Kenntnisse was den ADC angeht. Deine 
Erläuterung verstehe ich nicht.
Ich hab angenommen das der µC bei meinen Einstellungen die 2.56V 
Referenzspannung intern zur Verfügung stellt (sowie AVCC bei 
entsprechenden einstellungen) so dass ich quasi keine Referenzspannung 
an den µC-Pin ARef anlegen brauche und diesen Pin stattdessen über eine 
Kapazität mit GND verbinde.

Das ist wohl nicht der Fall nicht wahr?

von Johannes M. (johnny-m)


Lesenswert?

Kostja wrote:
> Ich hab angenommen das der µC bei meinen Einstellungen die 2.56V
> Referenzspannung intern zur Verfügung stellt (sowie AVCC bei
> entsprechenden einstellungen) so dass ich quasi keine Referenzspannung
> an den µC-Pin ARef anlegen brauche und diesen Pin stattdessen über eine
> Kapazität mit GND verbinde.
>
> Das ist wohl nicht der Fall nicht wahr?
Doch, genau so ist es. Bei korrekter Konfiguration stellt der µC die 
Referenzspannung intern zur Verfügung. Diese kann beim ATMega8 wahlweise 
AVCC oder 2,56 V betragen. Nur wenn eine nicht intern zur Verfügung 
stehende Referenzspannung verwendet werden soll (bzw. wenn die 
Genauigkeit der internen Referenz nicht ausreicht, was bei den AVRs 
durchaus der Fall sein kann), dann muss man eine externe 
Referenzspannung anlegen. Bei Verwendung einer internen Referenz sollte 
diese mit einem kleinen Kondensator am AREF-Pin stabilisiert werden.

@Tim:
Bitte erkundige Dich erst, bevor Du dem OP erzählst, er müsse eine 
externe Referenz anschließen. Ist alles oben schon durchdiskutiert 
worden.

von Tim (Gast)


Lesenswert?

>>Ich hab angenommen das der µC bei meinen Einstellungen die 2.56V
>>Referenzspannung intern zur Verfügung stellt (sowie AVCC bei
>>entsprechenden einstellungen) so dass ich quasi keine Referenzspannung
>>an den µC-Pin ARef anlegen brauche und diesen Pin stattdessen über eine
>>Kapazität mit GND verbinde.

Das ist so vollkommen richtig.

Das Pin AREF ist intern immer mit dem ADC verbunden und definiert
das Ende des Messbereiches (Der Anfang ist auf Masse festgelegt).

Nun gibt es 3 möglichkeiten eine Spannung an AREF anzulegen:
1. Interne Erzeugung auf 2,56V mit ext. Kondensator. 0b11...
2. Interne Brücke auf AVCC mit ext. Kondensator. 0b01...
3. Einspeisung einer externen AREF. 0b00...

Im 1. und 2 . Fall wird ein Kondensator an AREF angeschlossen um die
interne Referenzspannungsquelle zu stabilisieren. Nur im 3. Fall
wird die Referenzspannung extern produziert und dann eingespeist.
Das macht aber so gut wie niemand.

D.h. wenn dein Programm im AVR läuft und die interne AREF
Erzeugung aktiv ist must du da entwerder 2,56V oder 5V messen
(Je nach einstellung). Wenn nicht fehlt dem ADC die Grundlage
zum arbeiten.

von Tim (Gast)


Lesenswert?

Nachtrag: Es war keine absicht von mir dem OP eine externe einspeisung 
der AREF einzureden. Sorry, wenn das flsch rübergekommen ist.

In seiner Schaltung und seinem Setup sollte die Intern erzeugt werden 
(2,56V). Aber das scheint ja irgendwie nicht zu klappen da er nur etwas 
über 0V an AREF hat.

von Kostja (Gast)


Lesenswert?

Ahhhh so war das gemeint. Gut danke. Dann versuch ich das als nächstes 
mit AVCC als Referenzspannung und wenn das nicht klappt dann nehm ich 
einen anderen bzw. neuen µC. Aber ist schon mal gut zu wissen, dass in 
der Beschaltung keine gravierenden Fehler sind.

von Malte (Gast)


Lesenswert?

mal etwas, was mir passiert ist und den gleichen Fehler hervorgerufen 
hat:

Ich hatte den Pin nicht als Eingang definiert, sondern als Ausgang. Ich 
dachte durch das setzen des Pins im ADC als Eingang ist alles erledigt, 
aber leider nein.

Wenn er als Ausgang geschaltet ist kommt der ADC gar nicht an die Info 
ran.

Also prüf mal ob du den Port überhaupt richtig konfiguriert, sprich den 
Pin als Eingang deklariert hast!

Gruß

Malte

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.