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