mikrocontroller.net

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


Autor: Kostja (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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);
...

Autor: 2961 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ARef und AVcc sollten richtig angeschlossen sein. siehen Datenblatt.

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

Bewertung
0 lesenswert
nicht 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).

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 2961 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kostja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kostja (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: 2961 (Gast)
Datum:

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

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 2961 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kostja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

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

Bewertung
0 lesenswert
nicht 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.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kostja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.