www.mikrocontroller.net

Forum: Analoge Elektronik und Schaltungstechnik Einfachen Spannungsteiler für A/D Wandlung optimieren


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwas passt nicht: Der ADC ist weitesgehend linear und Widerstände 
auch.
Der Fehler muss daher immer gleich groß sein.

Autor: Til (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mein Code (ATmega32). Die ADC Werte sind reproduzierbar, so weit 
mein grob regelndes Netzteil das mitmacht. Ich hoffe, das ist 
verständlich:
  double     komma; 
  uint8_t    i;
  uint16_t  result = 0;      

  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);      // Frequenzvorteiler: setzen auf 64 (8 MHz / 64 = 125 kHz) und ADC aktivieren 
  ADMUX = 0x00;        // Kanal waehlen (ADC0)
  ADMUX |= (1<<REFS0);     // externe Referenzspannung AVCC mit Kondensator an AREF nutzen 

  /*   nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
    also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) );     // auf Abschluss der Konvertierung warten 

  // Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen um Meßfehler/Schwankungen zu eliminieren
  for(i=0;i<4;i++)
  {
    ADCSRA |= (1<<ADSC);        // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) );     // auf Abschluss der Konvertierung warten
    result += ADC;            // Wandlungsergebnisse aufaddieren (ggf. ADCW)
  }
  result /= 4;    // Summe durch vier teilen = arithm. Mittelwert

  komma = result * 5.0 / 1024.0;      // A/D-Wert in Spannung umrechnen (AREF=5V, 10 Bit A/D-Wandler: 2^10=1024)

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch was: Das sind Standard-Kohleschichtwiderstände. Ich habe schon mit 
versch. Wertekombinationen bei gleichem Teilungsverhältnis 
experimentiert. Immer gleich schlecht.

Autor: alfsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"externe Referenzspannung AVCC mit Kondensator an AREF nutzen "
...
wie sauber ist avcc?
solltest mal : uin, ad, avref, + spg. am ad-in-pin messen

Autor: Andreas Croonenbroeck (acdc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und UNBEDINGT L und C benutzen, die malen das Filter nicht umsonst mit 
in die Application notes!

Autor: Tommy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> "(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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :-)

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: alfsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
haste auch vom ad-in auf gnd 100nf ?

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.