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?
Irgendwas passt nicht: Der ADC ist weitesgehend linear und Widerstände auch. Der Fehler muss daher immer gleich groß sein.
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 ?
Hier mein Code (ATmega32). Die ADC Werte sind reproduzierbar, so weit mein grob regelndes Netzteil das mitmacht. Ich hoffe, das ist verständlich:
1 | double komma; |
2 | uint8_t i; |
3 | uint16_t result = 0; |
4 | |
5 | ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // Frequenzvorteiler: setzen auf 64 (8 MHz / 64 = 125 kHz) und ADC aktivieren |
6 | ADMUX = 0x00; // Kanal waehlen (ADC0) |
7 | ADMUX |= (1<<REFS0); // externe Referenzspannung AVCC mit Kondensator an AREF nutzen |
8 | |
9 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
10 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
11 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung |
12 | while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten |
13 | |
14 | // Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen um Meßfehler/Schwankungen zu eliminieren
|
15 | for(i=0;i<4;i++) |
16 | {
|
17 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" |
18 | while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten |
19 | result += ADC; // Wandlungsergebnisse aufaddieren (ggf. ADCW) |
20 | }
|
21 | result /= 4; // Summe durch vier teilen = arithm. Mittelwert |
22 | |
23 | komma = result * 5.0 / 1024.0; // A/D-Wert in Spannung umrechnen (AREF=5V, 10 Bit A/D-Wandler: 2^10=1024) |
Noch was: Das sind Standard-Kohleschichtwiderstände. Ich habe schon mit versch. Wertekombinationen bei gleichem Teilungsverhältnis experimentiert. Immer gleich schlecht.
"externe Referenzspannung AVCC mit Kondensator an AREF nutzen " ... wie sauber ist avcc? solltest mal : uin, ad, avref, + spg. am ad-in-pin messen
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
Und UNBEDINGT L und C benutzen, die malen das Filter nicht umsonst mit in die Application notes!
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.