Forum: Analoge Elektronik und Schaltungstechnik ADC mit Referenzspannung


von Udo Kreuzer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute!
Folgendes Problem:
Ich habe zuerst eine AD -Wandlung mit der Versorgungsspannung und GND
als Referenzspannungen - also so wie es standardmäßig beim PIC16f877
geschieht. Dabei wurde z.B. der Eingangswert 740mV in ca. 148 binär
gewandelt (bei 10bit)
(Vref+ - Vref-)/1024 =5V/1024=ca. 5mV
740mV / 5mV = 148
Diese AD -Wandlung stimmt also noch!

Als nächstes legte ich an Pin 3 von Port A (der Eingang für positive
Referenzspannung)2,56V an. Die Referenzspannungsquelle habe ich als
Dateianhang dazugegeben!!!!
Nun müsste der Eingangswert von 740mV so ca. 300 binär ergeben oder?

(Vref+ - Vref-)/1024 =2,56V/1024=ca. 2,5mV (als Vref- wurde GND
verwendet).
740mV / 2,5mV=296
Bei der AD -Wandlung ergibt sich jedoch ca. 40 als Binärwert ,also viel
zu niedrig?
Weiß jemand an was das liegen könnte?? mfg

von Michael (Gast)


Lesenswert?

Ohne pickilante Ahnung würde ich auf 8 bit Auflösung tippen. Addiere 256
und Du bekommst genaue 2 x 148 = 296 = 256+40, wenn ich mich nicht
verrechnet habe.

von Udo Kreuzer (Gast)


Lesenswert?

Ja aber ich frag mich warum die Auflösung durch das Anlegen einer
Referenzspannung kleiner wird? Naja vielleicht ist das ja der
Normalfall. danke

von Thomas O. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hast du ein Oszi um die Versorgungsspannung für den ADC zu prüfen,
evtl. bricht sie kurz ein oder da sind noch Spannungsspitzen, wenn die
Mux auf einen Kanal umschaltet oder die Messung gerade beginnt. Bei den
AVR's wird im Datenblatt empfohlen einen Tiefpass bestehend aus kleiner
Spule und Kondensator zu nehmen. Habe mal ein Bild reingesetzt schaus
dirs mal an könnte dir helfen. Evtl. reicht auch schon ein Kondensator.
Als Typ wird ein Tantalkondnsator empfohlen und die Referenzspannung mit
einem 1µF Elko zu Puffern kann auch nichts schaden so bleibt die
wenigsten stabil.

von Udo Kreuzer (Gast)


Lesenswert?

Habe leider kein Oszi bei der Hand, aber hab das mal mit dem Kondensator
ausprobiert --> gleiches Ergebnis wie vorher!
mfg

von Thomas O. (Gast)


Lesenswert?

Hallo,

mach mal den Kondensator sowohl zw. AVCC-AGND als auch zw- AREF-AGND,
möglichst nah an die Pins.

Bau mal zum testen einen normalemn Spannungsteiler um auf deine 2,56V
zu kommen. Wähle den ersten Wiederstand etwas kleiner so um die 400
Ohm, damit die Spannung auch belastbar bleibt.

Manche AVR können doch intern 2,56V an den AREF geben, dann würde sich
das ganze erübrigen.

Außerdem gibt es das Problem das die gängigen Stabilisierer (LM7805)
bei geringer Last ca. 5,1Volt ausspucken und erst bei höherer Last
korrekt auf 5,0V regeln, evtl. tut das deine Referenzspannungsquelle
auch etwas beeinflussen.

von Michael (Gast)


Lesenswert?

Bevor ich an der Hardware rumspielen würde, würde ich zunächst das
High-Byte beachten.

von Udo Kreuzer (Gast)


Lesenswert?

Ehm was genau meinst du damit??

von Michael (Gast)


Lesenswert?

Ohne Dein Programm gesehen zu haben, meine ich, daß man für 10 Bit zwei
Stück Bytes braucht: low + high. Mir scheint, Du verwendest nur das
low-Byte, womit man keine größeren Werte als 255 darstellen kann.

von Udo Kreuzer (Gast)


Angehängte Dateien:

Lesenswert?

Okay ich hab mal das Programm als Anhang dazugegeben. Okay vielleicht
wandelt er deswegen so komisch -aber warum ist es dann zuvor bei 5V als
Referenzspannung gegangen??? da hat er doch mit 10 bit gewandelt, warum
sollte er es jetzt nicht mehr machen???

kann es vielleicht sein, dass ich den Eingang den ich für die
Referenzspannung verwende irgendwie setzen muss oder ---keine
ahnung!!!
mfg

von Martin Maier (Gast)


Lesenswert?

hab jetzt versucht einen neuen PIC zu verwenden, hab als Datentyp
unsigned int probiert, hab eine andere Referenzspannungsquelle probiert
- schon langsam habe ich keine idee mehr?
Hat irgendjemand schon einmal eine ad -wandlung mit referenzspannungen
gemacht???

von Florian (Gast)


Lesenswert?

Tja, einfache erklärung:
178 lässt sich mit 8bit darstellen, 296 eben nicht mehr.
Deswegen, solltest du das high byte beachten;)
Damit du sicher seien kannst, das richtige zu verwenden nimm uint16_t
oder falls es bei avr anders sein sollte das äquivalent dazu.

Und jetzt noch das "Phänomen":
296: 1 0010 1000
bei blos 8 bit: 0010 1000 = 40
-> somit wäre ja wohl eindeutig klar was da abgeht.

set_adc_channel(0);// EingangA.0 als Eingang auswählen
tempwert = Read_ADC();

Wieso schreibst du das als funktionen?
Das kostet dich ne menge ausführungszeit, für das was in der Funktion
dann getan wird.

tempwert = ADCL;
tempwert += ADCH;
dass sollte alles sein, was du brauchst.
Dafür ne eigene Funktion ist doch etwas übertrieben.
mfg Flo

von Udo Kreuzer (Gast)


Lesenswert?

danke erstmal!
mfg

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.