Ich will über einen einfachen Spannungsteiler eine A/D Wandlung
durchführen.
Uin = max. 20V
R1 = 100k
R2 = 33k
UR2 = max. 5V
So weit alles OK. Wenn ich einen A/D Wert ermittle, kann ich den in eine
Spannung 0-5V umrechnen. Daraus kann ich mit einer Referenzspannung den
Faktor berechnen. Bspw.: Uin = 15V; U2 = 3,7V => 15/3,7 = 4,054. Wenn
ich dann 3V messe, ergibt das 3*4,054=12,2V So weit alles OK. Wie sich
aber herausstellt, wird die Abweichung immer größer, je weiter Uin von
der zum Berechnen des Faktors benutzten Referenzspannung abweicht.
Deshalb: Kann man den Spannungsteiler ein wenig optimieren, ohne gleich
zu komplex zu werden?
Naja, vielleicht liege jetzt mit meinem wenigen HW Kentnissen ganz
daneben, aber so kann man das doch nicht rechnen.
Also prinzipiell hast du doch Uin=0..20V an deiner Klemme.
Am Ad Wandler hast du die Spannung Uad
Uaus berechnet sich aus dem Spannungsteiler, ist dann noch die Frage an
welchem Widerstand du Uad abgreifst, ich geh mal von R2 aus.
Dann ist Uad= Uin x (R2/R1+R2) = Uin x 0.25 = 0..5V
Wenn du also an Uin 15V misst, hast du am AD Wandler
Uad = 15V x 0.25 = 3.75V
Langer Rede, kurzer Sinn, wie Benedikt schon meinte alle Bauteile linear
sind und auch die Formel linear ist, musst du dich vermessen haben oder
sonstwas sonderbares passieren.
Hm.
Das mit dem linear sehe ich ein.
"(R2/R1+R2)" verstehe ich aber nicht.
Habe mal ein paar Meßwerte aufgenommen, da ich zugeben muß, daß die
Werte aus meinem ersten posting ausgedacht waren, weil ich die Sache nur
verdeutlichen wollte.
Uin; Wert des A/D Wandlers; Uin/AD
9,9V - 456 - 0,0217
15,24V - 723 - 0,0213
19,60V - 942 - 0,0208
Das ist nicht gerade linear. Kann es daran liegen, daß ich den A/D
Wandler ohne irgendwelche externe Hardware betreibe? Also ohne L und C?
Das sind 4% Abweichung, das ist viel zuviel. Entweder hast du extrem
unlineare Widerstände, oder irgendwo ist was falsch (Software oder
Hardware).
Sind denn die ADC Werte stabil ? Was verwendest du als ADC
Referenzspannung ? Verarbeitest du die ADC Werte noch irgenwie ?
Noch was: Das sind Standard-Kohleschichtwiderstände. Ich habe schon mit
versch. Wertekombinationen bei gleichem Teilungsverhältnis
experimentiert. Immer gleich schlecht.
Ich habe gerade mal im Manual des ATmega8 gestöbert und folgendes
gefunden :
"The ADC is optimized for analog signals with an output impedance of
approximately 10 kΩ or less. If such a source is used, the sampling time
will be negligible. If a source with higher impedance is used, the
sampling time will depend on how long time the source needs to charge
the S/H capacitor, with can vary widely. The user is recommended to only
use low impedant sources with slowly varying signals, since this
minimizes the required charge transfer to the S/H capacitor."
Ähnlich gilt das auch bei PICs, soweit ich weiß ...
Und mit 33k liegst Du nun mal ehrheblich über 10k ! Einen Versuch wäre
es wert, und zum Messen würde ich nur Metallfilmwiderstände mit max. 1%
Toleranz nehmen !
Gruß, Andreas
Den Spannungsteiler wie schon gesagt mit Metallfilmwiderständen
aufbauen.
Gibts bei RS als 1% Variante oder besser 0,1%.
Den Spannungsteiler auf U mess-max 4,096V (oder kleiner) dimensionieren
und eine entsprechende Referenzspannung wählen.( erleichtert die
Auswertung)
Zur Messwertaufnahme einen OP benutzen.
Den OP als Impedanzwandler beschalten.
Dann sollte es funktionieren.
> "(R2/R1+R2)" verstehe ich aber nicht.
Du hast einen Spannungsteiler
Uin
---+
|
|
+-+
| | R1
+-+
|
--------- Uout
|
+-+
| | R2
+-+
|
|
----+--------
GND
Wenn du jetzt an Uin eine Spannung anlegst, wieviel
Strom fliest dann durch R1 und R2?
Nun, der Gesamtwiderstand von Uin nach GND beträgt
R1 + R2.
Also fliest ein Strom von Iin = Uin / ( R1 + R2 ) durch
beide Widerstände (Ohmsches Gesetz)
Insbesondere fliest dieser Strom auch durch R2. Wie
gross ist daher die Spannung, die an R2 abfällt.
Wieder: Ohmsches Gesetz: Uout = Iin * R2
für Iin eingesetzt, ergibt
Uin
Uout = --------- * R2
R1 + R2
und etwas umarangiert:
R2
Uout = Uin * ---------
R1 + R2
Na unbedingt ist ja wohl nicht lt. Datenblatt. War ja auch meine
Frage.
Aber ich habe mal experimentiert: R jetzt 22k und 6,8k
Dann mal 100nF zwischen AREF und GND: keine Besserung
AREF=AVCC (5V aus 7805 mit 100n am Ausgang): auch nicht besser
AREF=AVCC+100nF gegen Masse: auch nichts
:-(
Also muß ich mal 1%er besorgen. Aber das wird noch ein wenig dauern.
Vielleicht noch mal L/C probieren. Aber erst Morgen. Bis dann...
OP soll's ja gerade nicht werden. Das ist zu viel Aufwand.
@ Karl heinz Buchegger
Aha.
<klugscheiß>
R2
Uout = Uin * ---------
R1 + R2
ist aber nicht gleich
Uad= Uin x (R2/R1+R2)
Das ist nämlich
R2
Uout = Uin * -- + R2
R1
</klugscheiß>
Bis später!
Ich beschalte den AVR immer so:
- Direkt zwischen AGND und AVcc sowie zwischen AGND und AREF je ein
100nF Kondensator direkt an den Pins (ist ja leicht möglich, da die
direkt nebeneinander liegen).
- Dasselbe für GND und Vcc
- AGND und GND sind direkt verbunden
- Vcc und AVcc sind auch direkt verbunden, aber aufgrund der
Pinanordnung ist die Strecke länger als die GND Verbindung. Auf die
Spule verzichte ich.
- Zwischen AGND und den ADCs direkt unter dem AVR je ein 1nF-100nF
Kondensator (je nach zu messendem Frequenzbereich). Die Spannungen
werden über 1-100k eingespeist (je nach Frequenzbereich).
Damit erreichte ich problemlos einen stabilen Messwert der um weniger
als +/-2 Werte schwankt. Mit einem einfachen Softwarefilter nutze ich
meist etwa 11bit der Messwerte.
Besonders wichtig sind die Kondensatoren zwischen AGND und den ADC
Eingängen, damit das Signal während der Samplephase stabil bleibt.
> Die ADC Werte sind reproduzierbar, so weit> mein grob regelndes Netzteil das mitmacht
Womit misst du den die Eingangsspannung?
Wenn sich der ADC Wert um 1 ändert, dann entspricht
das einen Spannungsdifferenz von 2 Hunderstel Volt.
Kann dein Messgerät so genau messen?
Florian wrote:
> @ Karl heinz Buchegger> Aha.> <klugscheiß>
Sag das nicht mir. Sag das Til (Gast). Wenn er eine
Klammer unter den Tisch fallen lässt, ist das sein
Problem (oder künstlerische Freiheit :-)
Läßt mir ja doch keine Ruhe
@ Karl heinz Buchegger (kbucheg)
"zu-Kreuze-kriech". Sorry
Ich messe mit einem DMM, mit zwei Nachkommastellen. Es geht mir ja nicht
um ein Digit beim ADC, sondern um die Tendenz. Die Werte sind zwar gut
reproduzierbar, aber eben trotzdem ungenau.
@alle
Danke für die Tips.
Habe jetzt wo auch immer Cs drin und auch eine L gemäß den "Noise
Canceling Techniques" und alles hilft nichts :-(
Es bleibt bei Werten wie bspw.:
8,99V - 398 - 0,0226
19,22 - 897 - 0,0214
Es ändert sich also rein gar nichts an der Tendenz. Also kann man
eigentlich als Fazit ziehen: Der Aufwand lohnt wohl nicht.
Wenn nicht jemandem noch ein grober Schnitzer in meiner Software
auffällt, bleibt nur noch die 1%-oder-besser-Idee.
Ich habe mir deine Werte mal angeschaut und festgestellt, dass es sich
hierbei nicht um einen Linearitätsfehler handeln muss. Nehme ich einen
Offsetfehler von 0,8V an, so reduziert sich der Messfehler auf max.
0,2%.
Hast du schon einmal eine Spannung direkt an AD-IN angelegt (natürlich >
Aref)? Kleiner Tipp: am besten mimmst du dafür 3 Akkus bzw. Batterien.
Du kannst so in 3 Schritten messen und hast eine nahezu rauschfreie
Messung.
Die Widerstände, egal ob Metall- oder Kohleschichtwiderstände, würde ich
als Fehler auschließen. Linearitätsfehler ergeben sich in der Regel
durch Frequenz oder Wärme. Beides würde ich ausschliessen.
Zweifel jedoch immer ein wenig an dem, was du auf deinem DMM abliest.
Digitale Anzeigen verleiten dazu, diesen Wert als Tatsache anzunehmen.
Es wäre keine Überraschung für mich, wenn der o.g. Offsetfehler vom
Messgerät stammt.
Das große Finale: TATA!
@ alfsch
Ja, ich hatte.
@ alle
Ich hatte auch noch mal mein 5€ DMM aus'm Auto genommen, doch das war
ebenso ungenau, wie das erste.
Aus einem 7805, 7812, sowie 7812 + Z-Diode 5,1 habe jetzt ich drei
Spannungen aufgebaut. R-Spannungsteiler 22k und 6,8k
Und siehe: Linear ohne Gleichen.
5,14V - 250 - 0,0206
11,87 - 580 - 0,0205
16,93 - 829 - 0,0204
Die minimalen Abweichungen sind tolerierbare Meßfehler.
Und das ganz ohne L und C Gedönse mit Kohleschicht-Rs und offenem AREF.
Womit also als Fazit wirklich bleibt: Glaube nicht Deinem DMM und der
ganze Aufwand zur Rauschunterdrückung etc. des µC kann bei den meisten
Anwendungen entfallen.
> Die minimalen Abweichungen sind tolerierbare Meßfehler.
Das ist das eine.
Das andere ist, dass dein AVR mit float rechnet.
float hat 4 Bytes. Die Genauigkeit damit bewegt sich
im Bereich 5 bis 6 Stellen. Achtung: Das sind tatsächlich
Stellen, nicht Nachkomma-stellen. Bei einer Zahl
1000.6547, ist also bereits bei der 6 oder bei der 5
Schluss, vor allem dann wenn diese Zahl das Endergebnis
einer komplexeren Berechnung ist. Alles was rechts davon ist,
ist nur noch gelogen. Je mehr man dann mit diesen Zahlen
weiterrechnet, desto mehr wandert der Fehler nach links
(wird also größer). Besonders betroffen sind immer Berechnungen
in denen sich die Größenordnung der Zahlen gewaltig unterscheiden.
Aber abgesehen davon, sind Analysen über Rechenfehler und deren
Ausbreitung aufwändig und zeitraubend.
Wie schon Jim Blinn (einer der Gurus in der CG-Szene) einmal
zitierte:
Doing floating point arithmetic
is like moving piles of sand.
Everytime you do it,
you loose a little sand
and pick up a little dirt.
(Gleitkommaarithmetik ist wie das umschaufeln
von Sand. Jedesmal wenn man es macht, verliert
man ein bischen Sand und kriegt dafür ein bischen
Dreck).