PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Analog Digital Wandler bei Mega8



Barthimaeus
07.07.2008, 21:15
Weil ich schon immer mal den AD Wandler einsetzten/testen wollte habe ich das Beispielprogramm aus dem RN Wiki ein wenig umgeschrieben, um den AD Wandler zu testen.



' Die gemessene Spannung wird in der Variablen W gespeichert.
' Channel ist der Pin, an dem die Spannung gemessen werden soll.

$regfile "m8def.dat"
$baud = 9600
$crystal = 8000000

Config Portc.5 = Output
Portc.5 = 1

Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0
Do
W = Getadc(channel)
Print "ADC-Pin " ; Channel ; ": Wert " ; W
Incr Channel
If Channel > 7 Then Channel = 0
Waitms 800
Loop
End

Zwischen Portc.5 (an dem ja +5V liegen sollten) und AD0 hängt ein 10K Poti. AREFF und AVCC sind nicht beschaltet (dann verwendet er doch VCC als AREFF, oder?) Wenn ich nun das Proggi starte, so gibt sendet der uC für jeden ADPort 1023 - egal, wie das Poti eingestellt ist. Das kann doch nicht richtig sein...?

fhs
07.07.2008, 21:37
Hallo Barthimaeus,


...Zwischen Portc.5 (an dem ja +5V liegen sollten) und AD0 hängt ein 10K Poti.
Lege mal ein Ende des Potis an den Pin, das andere Ende an Masse und den Mittelabgriff an AD0. Deine Methode funktioniert nicht, da der AD-Wandler aufgrund seines hohen Eingangswiderstands immer die volle Spannung "sieht".


AREFF und AVCC sind nicht beschaltet ...
Aus dem ATmega8 Datenblatt:

http://www.fhs-consulting.com/ind/ATmega8_AVcc_Aref.png
Im Zweifel Aref immer zusätzlich mit einem Kondensator entkoppeln.

Viele Grüße

Fred

Barthimaeus
07.07.2008, 22:53
Bekomme weiterhin 1023. Wie sollte die Ausgabe denn eigentlich aussehen? Dezimalzahl entsprechend der Anzahl an Volt?

Ich hatte jetzt verbunden:

VCC--AGND
VCC--AREF
PBO--Pot links
GND--Pot rechts
AD0--Pot mitte

wkrug
07.07.2008, 23:40
VCC--AGND
VCC--AREF
PBO--Pot links
GND--Pot rechts
AD0--Pot mitte
Ich würd mal sagen AGND gehört mit GND verbunden.
AREF kann an VCC, also +5V bleiben, im Controller dann externe Referenz auswählen. Man sollte da dann aber ein LC Tiefpaßfilter einbauen um Störungen aus der "Digitalseite" rauszufiltern ( Steht auch so im Datenblatt ), oder die Pins AVCC und VREF verbinden.

Messen kannst Du aber dann nur was, wenn der Port PB0 auf +5V steht.

fhs
08.07.2008, 00:04
Hallo,

1. siehe wkrug's Posting.

2. AVcc muss immer noch mit Vcc (evtl. über ein LC- oder RC-Filter) verbunden werden, damit der A/D-Wandler überhaupt richtig funktionieren kann!

3. Welche Werte Du erhältst, ist von der Referenz abhängig und im Datenblatt genau erklärt. Da ich kein Bascom kann, kann ich das nicht mit Deinem Code korrelieren. Sieh mal in der Bascom-Dokumentation nach, wie Du die Referenz einstellen musst. Wenn Du nur ADC0 nutzen willst, warum fragst Du dann die anderen Kanäle ab?

Gruß

Fred

goara
08.07.2008, 08:33
hätt auch noch ne frage zu areff, bisher habe ich das immer über einen widerstand an vcc gehängt, bei meiner neuen platine habe ich den aber vergessen, geht das auch wenn areff nicht beschaltet ist ??
und avcc immer auf vcc legen oder?
danke shcon mal..

Barthimaeus
08.07.2008, 08:39
Was ist ein "LC- oder RC-Filter"? Warum braucht der AD Wandler überhaupt eine externe Spannungsversorgung? Warum kann ich nicht die interne Referenzspannung benutzen? Wie schalte ich auf externe Referenzspannung um (bei den Fusebits nichts gesehen)?

fhs
08.07.2008, 08:44
Hi,


...ne frage zu areff, bisher habe ich das immer über einen widerstand an vcc gehängt...
das widerspricht dem Datenblatt. Sieh mal auf S. 197 des Datenblatts Version 2486S–AVR–08/07 : An Aref steht die externe oder per Software gewählte interne Referenzsspannung an. Im 2. Fall ist der Pin ist nur dazu da, dass man von dort noch einen Kondensator gegen Masse legt (geht auch ohne C, aber Du kannst doch sicher noch einen "freitragend" dranlöten, selbst wenn Du ihn nicht auf der Platine vorgesehen hast, oder?). Aref darf nicht an Avcc angeschlossen sein, wenn Du als Referenz AVcc oder die interne Spannungsreferenz wählst, sonst gibt es einen Kurzen! Schau mal hier auf S. 15! (http://www.uni-koblenz.de/~physik/informatik/MCU/Analog.pdf)


...und avcc immer auf vcc legen oder?
Genau, möglichst mit einem LC- oder RC-Tiefpass davor.

Gruß

Fred

fhs
08.07.2008, 08:57
Hi Barthimaeus,


Was ist ein "LC- oder RC-Filter"?
http://de.wikipedia.org/wiki/Tiefpassfilter

Im Datenblatt des ATmega8 (http://atmel.com/dyn/resources/prod_documents/2486S.pdf) steht auf S. 203 sogar ein Vorschlag zur Dimensionierung!


Warum braucht der AD Wandler überhaupt eine externe Spannungsversorgung? Warum kann ich nicht die interne Referenzspannung benutzen?

Du wirfst hier Begriffe durcheinander. Die Designer haben die externe Spannungsversorgung (AVcc) des AD-Wandlers an einen Pin gelegt, damit man sie filtern kann. Mit der Referenzspannung hat das direkt nichts zu tun.
Du kannst zwar AVcc als Referenzspannung wählen (s.u.), aber auch eine (innerhalb der erlaubten Spannungswerte) beliebige externe Referenzspannung an Aref anschließen oder die interne Referenzsspannung wählen. Was nimmt man? Natürlich das, was für die jeweilige Hardware-Situation optimal ist!


Wie schalte ich auf externe Referenzspannung um (bei den Fusebits nichts gesehen)?

Ohne das Lesen von Datenblättern geht es nicht: Bits REFS0 und REFS1 im SFR ADMUX (S. 205 im oben verlinkten Datenblatt). Wie man das in Bascom umsetzt, weiß ich nicht, da ich kein Bascom kann.

Gruß

Fred

goara
08.07.2008, 13:15
hallo fhs, erstmal danke fuer die hilfe
dann werde ich avcc noch ueber nen 100nF an vcc hängen.
den bekomm ich sicherlich noch irgendwo hin.
weis nur, das ich beim letzten mal probleme mit den adcs hatte und keine sinnvollen werte rauskamen, wenn ich areff nicht auf vcc hatte, (auch mit interner refernezspannung, aber ich werde es nochmal veruschen)

die werte fuer das r-c-glied sind unkritisch oder? R=1K 100nF sollte tun oder ?

fhs
08.07.2008, 13:27
Hallo,


...dann werde ich avcc noch ueber nen 100nF an vcc hängen.
Vielleicht verstehe ich Deine Formulierung falsch -- aber das klingt nicht in Ordnung: Siehe Datenblatt (2486T–AVR–05/08) S. 203.


... beim letzten mal probleme mit den adcs hatte und keine sinnvollen werte rauskamen, wenn ich areff nicht auf vcc hatte, (auch mit interner refernezspannung, aber ich werde es nochmal veruschen)
Dann war etwas kaputt! Kann natürlich auch die Software sein.


die werte fuer das r-c-glied sind unkritisch oder? R=1K 100nF sollte tun oder ?
Unter sehr ungünstigen Bedingungen kann der AD-Wandler schon fast 0,5mA benötigen. Mit 1k verlierst Du dann 0,5V! Nimm einfach eine Ferrit-Perle über der Zuleitung von Vcc nach AVcc und einen 100nF Kondensator direkt am AVcc-Pin nach GND, damit liegst Du besser. Oder geh auf ca. 100Ohm runter, wenn Du bei einem RC-Filter bleiben willst. Ich empfehle ein LC-Filter!

Gruß

Fred

Barthimaeus
08.07.2008, 13:49
Wenn ein Tiefpassfilter SO (http://upload.wikimedia.org/wikipedia/de/7/71/Tiefpass.PNG) aussieht - wie benutze ich ihn dann als Verbindung zwischen AVCC und VCC?

fhs
08.07.2008, 14:01
Hallo,


Wenn ein Tiefpassfilter SO (http://upload.wikimedia.org/wikipedia/de/7/71/Tiefpass.PNG) aussieht - wie benutze ich ihn dann als Verbindung zwischen AVCC und VCC?
Das ist ein RC-Glied. Nimm besser ein LC-Glied wie im Datenblatt auf S. 203 gezeigt. Das Datenblatt ist verlinkt in meinem Beitrag von heute 08:57. Gründe in meinem vorigen Beitrag.

Gruß

Fred

Barthimaeus
08.07.2008, 14:10
Das Datenblatt des mega8 hat keine 203 Seiten...

Mittlerweile bin ich hier angekommen:

VCC-100nF-AVCC
VCC-AREFF
GND-AGND
PB5(+5V)-Potentiometer links
AD0-Potentiometer mitte
GND-Potentiometer rechts

Die Werte, die ich erhalte sind nun nichtmehr nur 1023, aber sie unterliegen extremen Schwankungen, die anscheinend unabhängig vom Poti sind. Ohne am Poti zu drehen habe ich folgende Ergebnisse erzielt:


Wert 137
Wert 103
Wert 495
Wert 533
Wert 500
Wert 384
Wert 96
Wert 41
Wert 72
Wert 85
Wert 64
Wert 467
Wert 435
Wert 164

fhs
08.07.2008, 14:30
Hi,


Das Datenblatt des mega8 hat keine 203 Seiten...

Stimmt, es hat insgesamt 308 Seiten. In der Anlage die S. 203. Du musst es nur in meinem Beitrag von 08:57 öffnen (Link anklicken - fertig!). Wenn Du die Datenblätter nicht benutzt, kann ich Dir nicht mehr weiterhelfen.

Wie sind die REFS-Bits in ADMUX eingestellt?

Gruß

Fred

Barthimaeus
08.07.2008, 14:33
Oops. Mein Datenblatt hatte nur 21 Seiten. Geht das wirklich nur mit Spule?

Christopher1
08.07.2008, 14:34
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf
Kaum zu finden...

fhs
08.07.2008, 14:36
Kannst du mir mal den Link zu deinem Datasheet geben ? Bitte?

Deine Variante hat ein "S" im Dateinamen -- das sind die "short" Datenblätter!

Ist oben verlinkt! Hier nun noch einmal direkt (und nicht in den Text eingebaut): http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

Gruß

Fred

PS: Oben hättest Du nur auf den Text (hier rot markiert) klicken müssen (lässt sich in diesem Bild natürlich nicht anklicken, aber im Beitrag oben!):
http://www.fhs-consulting.com/ind/exc_08_57.png

fhs
08.07.2008, 14:49
Geht das wirklich nur mit Spule?

Nimm einfach eine Induktivität mittels einer Ferrit-Perle über der Zuleitung (aufpassen, die Dinger können leiten und Dir einen Kurzschluss zwischen Pins machen, wenn Du nicht aufpasst), dann hast Du 5-10μH und fertig. Alternativ eine solche Festinduktivität (kann wie ein bedrahteter Widerstand aussehen, gibt es auch in SMD). Bei der Ferrit-Perle muss es der Verlust-behaftete Typ sein (im Gegensatz zum Typ mit höher HF-Güte).

Gruß

Fred

Barthimaeus
08.07.2008, 14:50
Gut, jetzt habe ich das RICHTIGE Datenblatt. Vielen Dank fürs deutliche Zeigen des Links. Ich schätze die Mühe, die ihr euch gebt sehr.

Auf S. 203 ist dargestellt, dass das LC Glied aus einem Kondensator 100nF und einer 10uH Spule besteht. Eine solche Spule besitze ich nicht, allerdings habe ich noch nie gehört, dass man zum Betrieb des AD Wandlers eine Spule braucht. Geht es auch ohne? Was muss man dann noch verändern?

fhs
08.07.2008, 14:56
Wie oben gesagt, anstelle der Spule kannst Du auch einen Widerstand (sagen wir mal zwischen 47 Ohm und 100 Ohm) nehmen. 10μH Drosseln sind allerdings Pfennigartikel und besser geeignet!

Barthimaeus
08.07.2008, 14:57
ES KLAPPT ! Das LC Glied war das entscheidende Detail. Zusätzlich sollte man noch mit
Config Adc = Single , Prescaler = Auto , Reference = Aref sicherstellen, dass wirklich die externe Referenzspannung genutzt wird. Die Auswertung des Ergebnisses ist auch nahezu Idiotensicher:

Die getadc(channel) Funktion liefert einem als Ergebnis ein Byte, sprich eine Zahl zwischen 0 und 255. Nun teilt man seinen Wert einfach durch 255 und multipliuiert das mit der Spannung an AREF und voila -> man hat seine Spannung. Ich habs nachgemessen. Es stimmt.

Vielen Dank für eure Hilfe!!! Das war klasse.

Barthimaeus
08.07.2008, 16:20
Epilog:

Mir ist grade aufgefallen, was es bewirkt, wenn manden mittleren Anschluss des Potis als Ausgang verwendet. Man erhält dadurch ja eine Art regelbaren Spannungsteiler, denn durch den Drehknopf verändert man dann ja das Verhältnis der Wiederstände zwischen Mitte-Links und Mitte-Rechts.

Müsste richtig sein, oder?

goara
08.07.2008, 19:28
jipp so ist das gedacht.

goara
08.07.2008, 20:33
sorry ich nochmal...
also bis jetzt hatte ich das so : (linkes bild)
http://dyyyh.de/robo/avcc.jpg
die timer hatte ich bis jetzt so gesetzt

'---------Timer----------------
Config Adc = Single , Prescaler = 8 , Reference = Avcc
Start Adc
'-----------Interupts----------
On Icp1 Get_empfaenger Nosave ' ICP fuer Funke
On Ovf1 Kanal_reset Nosave
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Falling
Enable Ovf1
Enable Icp1
Enable Interrupts
waere es dann so wie im rechten bild korrekt ?? und muss ich dann an dem

Config Adc = Single , Prescaler = 8 , Reference = Avcc
etwas aendern oder stimmt das dann ??

fhs
08.07.2008, 20:35
Hallo,

"so besser" ist besser! (Bloß muss das Kreuzchen noch von Aref weg.)

Viele Grüße

Fred

goara
08.07.2008, 20:40
ui stimmt, da hab ich nich getroffen ;) werde das aber sowieso jetzt erst mal drannlöten, will nich die ganze platine wegen einem kondensator neu ätzen.. dann probier ich das jetzt mal...
die initialisireung vom adc is so korrek oder ??
danke noch mal,...

fhs
08.07.2008, 20:49
Hi,


..die initialisireung vom adc is so korrek oder ??
keine Ahnung, kann kein Bascom!

Gruß

Fred