Forum: Mikrocontroller und Digitale Elektronik Ungenaue Spannungs Messung Atmega644


von Jan N. (jan_n497)


Lesenswert?

Guten Abend,
Ich habe ein kleines Problem, und zwar möchte ich nebenbei auf mein 
Server noch die Spannungen von denn einzelnen Geräten messen. Dafür habe 
ich mir ein Spannungsteiler gebastelt, der es mir ermöglicht bis zu 20 
VDC am Atmega zu messen.

Als Formel habe ich diese verwendet:
Vout = (R2 / (R1 + R2)) * Vin

Vout = (10K / (30K + 10K)) * 20v

Vout = 5V

Zum Messen nutze ich denn ADC des Atmega644. Der ADC hat ja 1024 Steps(0 
- 1023). Das wäre dann ja 0,00488v je Step die ich an Spannung messe.

Wenn ich also eine Spannung von 12 V anlege dann bekomme ich am ADC eine 
Spannung von 3V

12 Volt / 4 Ratio(Vin / Vout = 4) =  3 Volt am ADC Eingang.

Um dieses wider umzurechnen habe ich die 3 Volt die ja vom ADC kommen 
mal 0,00488 genommen, und dann noch mal denn Ratio genommen:

3v / 0,00488 = 615(ADC Value aufgerundet)

pinVoltage = 615 * 0,00488;
totalVoltage = pinVoltage(3,0012) * Ratio(4);
totalVoltage = 12,0048 Volt.

Wenn man dann nur zwei Stellen nimmt dann kommt da in der Theorie 12.00 
Volt wieder raus.

Wenn ich das aber in der Praxis anwendete bekomme bei 12.02 
Volt(Eingang) ca. 12.27 Volt raus. Also immer mehr.

R2 hat ein gemessen Widerstand von 9.93 Kiloohm(bei 10K).
R1 hat ein gemessen Widerstand von 29.7 Kiloohm(bei 30K).

Als Referenzspannung beim ADC nutze ich Avcc mit 100 nF Kondensator an 
ARef.

Auch wenn ich z.B die Mess Leitung an eine 5V Schiene des TFT Displays 
anklemme. Die Leitung hat ca. 4,11 Volt am TFT. Der Atmega sagt aber es 
wäre 4,57 Volt. Also mehr.

Liegt das daran das die Widerstände nicht exakt 10K und 30K Ohm haben?.

Mfg jan.

von Karl M. (Gast)


Lesenswert?


von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jan N. schrieb:
> Als Referenzspannung beim ADC nutze ich Avcc mit 100 nF Kondensator an
> ARef.

Zusätzlich zu den Fehlern durch die o.a. Innenwiderstände der 
Spannungsteiler muss dann auch VCC sehr genau bei 5V liegen, sonst 
stimmen deine Rechnungen nicht.

von Joachim B. (jar)


Lesenswert?

benutze lieber eine interne Referenz, die ist dann wenigstens von VCC 
unabhängig und einemal ausgemessen auch stabil als Ref abzuspeichern.

Ich mache das immer so, Referenz intern wählen, Spannungsteiler 
berechnen und an 2 Messpunkten mit Labornetzteil einstellen und DVM 
messen und ADC ausgeben an 2 Punkten habe ich eine Geradengleichung mit 
Steigung m = dY/dX und den Offset +b

Damit kann ich aus jedem ADC Wert rel. genau die Spannung rechnen.

Wer es noch genauer will macht mehrere Bereiche oder maximal eine 
Tabelle aus 0-1023 ADC Werten zu gemessener Spannung.

von Jim M. (turboj)


Lesenswert?

Jan N. schrieb:
> Liegt das daran das die Widerstände nicht exakt 10K und 30K Ohm haben?.

Hats Du mal mit den gemessen Werten für die Widertände nachgerechnet?

Außerdem ist der ADC bei Atmegas vergleichsweise niederohmig (~15kOhm 
IIRC) und belastet deinen Spannungsteiler. Ich würde dem auf jeden 
Fall mal 100nF parallel zum ADC Eingang spendieren.

von Karl M. (Gast)


Lesenswert?

Jan ,

hat schon abgeschaltet. Ich setze meisten noch einen sot23 Puffer OPV 
mit Zero Offset vor den ADC Eingang.
Damit wird die Spannungsquelle so gut wie nicht belastet.

Dann noch eine Referenzspannungsquelle, je nach Aufgabenstellung und
wenn man noch 4-8 Messungen nacheinander macht, dann "steht" auch der 
Messwert.

Ein 2 Punkt Abgleich muss man noch machen, wie schon geschrieben, evtl. 
auch mit mehr als 2 Messpunkten.

von Mike J. (linuxmint_user)


Lesenswert?

Jan N. schrieb:
> Liegt das daran das die Widerstände nicht exakt 10K und 30K Ohm haben?
Eher daran dass die Vref nicht bei dem idealen Wert liegt.


Wo hast du die Referenzspannung von 1.1V/2.56V mit einbezogen?
Wie hoch ist deine Referenzspannung eigentlich?

Bei meinem letzten ATmega644 lag sie bei 1,114V.

Du solltest direkt an den ADC-Pin einen 10nF bis 100nF Kondensator 
setzen, damit dort einen Tiefpass entsteht und sich der 
Sample&Hold-Kondensator immer direkt aus dieser Quelle bedienen kann.

Die Rechnung ist eigentlich ganz einfach.

(Spannungsteilerverhältnis x Referenzspannung x ADC-Wert) / Max-ADC-Wert

also:
4 x 1100mV x (615/1024) = 2642mV
oder
4 x 2560mV x (615/1024) = 6150mV

Die Referenzspannung ist zwar extrem stabil und ganz toll, allerdings 
nicht sehr genau. So können die "2,56V" auch mal bei 2,79V oder 2,33V 
liegen, daher musst du die auch ein mal kallibrieren und den ermittelten 
Wert im AVR abspeichern. (der Wert ändert sich ja dann nicht mehr, wenn 
er ein mal auf 2,49V ĺiegt, dann bleibt das auch so)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Mike J. schrieb:
> Wo hast du die Referenzspannung von 1.1V/2.56V mit einbezogen?
> Wie hoch ist deine Referenzspannung eigentlich?

Jan N. schrieb:
> Als Referenzspannung beim ADC nutze ich Avcc mit 100 nF Kondensator an
> ARef.

Deswegen schrieb ich

Matthias S. schrieb:
> muss dann auch VCC sehr genau bei 5V liegen, sonst
> stimmen deine Rechnungen nicht.

von Mike J. (linuxmint_user)


Lesenswert?

Matthias S. schrieb:
> Deswegen schrieb ich
... dann war mein Text da oben unnütz.

Er sollte es aber so machen wie im Datenblatt des AVR beschrieben, also 
einen Tiefpass 2. Ordnung aufbauen um Avcc vor HF-Störungen aus dem 
Digitalteil zu schützen.

Ich nehme immer 10µH und 100nF+4,7µF+4,7µF.
fg = 1/(2*pi*sqrt(0,00001*0,0000095)) = 16,3kHz

10µH + 100nF sind im Datenblatt als empfohlener Wert angegeben.
fg = 160kHz

von Joachim B. (jar)


Lesenswert?

Mike J. schrieb:
> Ich nehme immer 10µH und 100nF+4,7µF+4,7µF.
> fg = 1/(2*pi*sqrt(0,00001*0,0000095)) = 16,3kHz

also ein PI Filter?
warum FG bei 16kHz?

ich würde bei L und C großzügiger sein, wüsste nicht warum 16kHz Impulse 
noch mit 70,7% f(U/fg) durchkommen sollen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Joachim B. schrieb:
> ich würde bei L und C großzügiger sein, wüsste nicht warum 16kHz Impulse
> noch mit 70,7% f(U/fg) durchkommen sollen?

Ich nehme meistens 100µH, aber hauptsächlich deswegen, weil ich die als 
Schüttgut in rauen Mengen habe. Damit sinkt die Grenzfrequenz dann 
nochmal deutlich ab und der ADC dankts einem.

von Joachim B. (jar)


Lesenswert?

Matthias S. schrieb:
> Ich nehme meistens 100µH, aber hauptsächlich deswegen, weil ich die als
> Schüttgut in rauen Mengen habe. Damit sinkt die Grenzfrequenz

ja ist klar, da bin ich voll bei dir, fg sollte so tief wie möglich 
sein, optimal bei 0 Hz

Die Frage ging ja an:

Mike J. schrieb:

: Bearbeitet durch User
von Mike J. (linuxmint_user)


Lesenswert?

Joachim B. schrieb:
> warum FG bei 16kHz

Ich gehe einfach davon aus dass die interne Referenzspannungsquelle dazu 
fähig ist diese recht niedrigen Frequenzen raus zu filtern.

Joachim B. schrieb:
> also ein PI Filter?
Eigentlich nur einen einfachen LC-Filter der die HF von der Vcc in 
Richtung Vref dämpfen soll, aber auf der anderen Seite der Spule gibt es 
natürlich auch Kondensatoren (Kerkos+Elkos).

Joachim B. schrieb:
> ich würde bei L und C großzügiger sein

Ich mach das alles in SMD und von den 10µH Spulen habe ich günstig eine 
ganze Rolle bekommen.
Von den 4.7µF Kerkos habe ich auch noch ein paar Rollen und könnte die 
Platinen damit zupflastern, aber der Platz ist dann doch limitiert.

von Joachim B. (jar)


Lesenswert?

Mike J. schrieb:
> Ich gehe einfach davon aus dass die interne Referenzspannungsquelle dazu
> fähig ist diese recht niedrigen Frequenzen raus zu filtern.

der erste gemachte Fehler ist stets eine falsche Annahme, aber ich 
akzeptiere das mal so.

Mike J. schrieb:
> Ich mach das alles in SMD und von den 10µH Spulen habe ich günstig eine
> ganze Rolle bekommen.
> Von den 4.7µF Kerkos habe ich auch noch ein paar Rollen

das ist ein nachvollziehbares Argument, aber wer eh kaufen muss und 
Platz hat könnte ja auf niedrigere FG gehen.

von M. K. (sylaina)


Lesenswert?

Jan N. schrieb:
> Liegt das daran das die Widerstände nicht exakt 10K und 30K Ohm haben?

Hier musst du einfach nur mal Nachrechnen:

Du hast also deinen Spannungsteiler:

Zu R1 liegt aber noch der Widerstand des ADCs parallel

Deine Referenzspannung sei Vcc, die Auflösung bestimmt sich dann zu

Und jetzt rechnen wir uns die Counts mal aus:

Ideal angenommen strebt der Innenwiderstand des ADC gegen Unendlich, Vcc 
ist konstant auf 5 V, R1 bei 10 kΩ und R2 bei 30 kΩ. Dann erhält man bei 
12.02 V am Eingang 615,4... Counts, mit Runden durch Abschneiden also 
615 Count müsste der Atemega auf 12.01 V kommen.
Jetzt lassen wir erstmal Vcc um 1 V sinken, außerdem nehmen wir an, dass 
wir Vcc fest einprogrammiert haben, der Atmega also gar nicht merkt, 
dass Vcc nicht mehr 5 V sondern nur noch 4 Volt sind.
Jetzt bekommen wir 769 Counts, der Atmega glaubt, dass die Spannung nun 
15,02 V beträgt (obwohl wir immer noch 12,02 V am Eingang haben). Das 
muss man also offenbar auf jeden Fall abfangen, der Fehler ist riesig.
Gleiches Spiel, nur statt Vcc setzten wir nun die richtigen Werte für 
die Widerstände ein. Wir erhalten so 616 Counts und der Atmega misst 
12,03 V. Ist ja praktisch nicht erwähnenswert, kann man natürlich 
dennoch berücksichtigen.
Nun berücksichtigen wir noch den internen Widerstand des ADC-Eingangs, 
wir nehmen ihn mal zu 50 kΩ an. Hier kommen nun statt 615 Counts nur 535 
Counts heraus, die gemessene Spannung beträgt 10,45 V. Das sollte man 
auch abfangen, am besten durch einen Puffer-OPV, man kanns aber auch 
rechnerisch auffangen.

Betrachten wir uns also diese drei Fehlerfälle ist am 
wahrscheinlichsten, dass dein Vcc falsch ist. Du hast wahrscheinlich 
nicht 5 V als Vcc sondern nur 4,9 V, gff. in Kombination mit dem 
Innenwiderstand des ADCs. Noch nicht betrachtet wurden hier Offsetfehler 
des ADCs sowie dessen Linearität, die beide ebenfalls für signifikante 
Abweichungen sorgen können.

Jan N. schrieb:
> Als Referenzspannung beim ADC nutze ich Avcc mit 100 nF Kondensator an
> ARef.

Das ist übrigens ein Fehler. An ARef gehört nur ein Kondensator gegen 
GND und, falls vorhanden, eine externe Referenzspannungsquelle. AVcc und 
auch Vcc gehören nicht an den ARef-Pin, die haben da nichts zu suchen.

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.