Forum: Mikrocontroller und Digitale Elektronik ADC Auflösung


von Thomas (Gast)


Lesenswert?

Hallo,

ich habe einen 14bit ADC und lese damit eine Gleichspannung ein, um 
daraus dann den fließenden Strom zu ermitteln. Jedoch schwankt das 
Messergebnis um 0-3 LSB (LSB = 0,375mV).

Um ein besseres Ergebnis zu erhalten, hätte ich mir überlegt z.B. 1000 
Messungen zu machen, die Messergebnise aufzuaddieren und dann durch die 
Anzahl der Messungen zu dividieren (1000) => arithmetischer Mittelwert

Kennt ihr vielleicht eine effizientere Mittelwermethode als der 
arithmetische Mittelwert?

lg
Thomas

von Holger (Gast)


Lesenswert?

Was meinst du mit effizienter? Wenn du 2^n Werte addierst, reicht es 
Rechtsshift statt Division.

von R. F. (rfr)


Lesenswert?

Hallo,

wenn ein lsb 0,375 mV darstellen, ist der Wandler bei Maximalstrom mit 
mehr als 6 V beaufschlagt, das erscheint sehr viel, da hier max 5 V 
zulässig sind.

Das maximale lsb beträgt ca 300 µV.

Die Mittelwertbildung erfolgt mit 8 aufsummierten Messwerten und einer 
Teilung durch 8. Im Allgemeinen reicht das.

Gruss

Robert

von Thomas (Gast)


Lesenswert?

danke für deine Antwort.
Mit effizienter meinte ich eine bessere bzw. genauere Methode.

D.h. ich würde 2^14 Werte addieren und dann Rechtsshift
Kannst du mir bitte erklären was du mit Rechtsshift meinst?

lg
Thomas

von Dirk K. (dekoepi)


Lesenswert?

Er meint das hier:
1
  for (int i=0; i<8; i++) {
2
    ADC_StartOfConversion(ADC1);
3
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
4
    light += ADC_GetConversionValue(ADC1);
5
  }
6
  light = (light >> 3);

von R. F. (rfr)


Lesenswert?

Shiften bedeutet das Verschieben eines Bitmusters in der Zelle in eine 
bestimmte Richtung. Arithmetisch gesehen entspricht das einer 
Multiplikation oder Division mit 2. Es ist idR in Maschinenbefehlen 
implementiert, findet sich aber auch in den meisten Hochsprachen wieder.

Robert

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> danke für deine Antwort.
> Mit effizienter meinte ich eine bessere bzw. genauere Methode.
>
> D.h. ich würde 2^14 Werte addieren und dann Rechtsshift
> Kannst du mir bitte erklären was du mit Rechtsshift meinst?

Wenn du in C programmierst, erledigt das der Compiler für dich.

Rechtsshift ist einfach nur eine Methode, wie man um eine explizite 
Division rumkommt, die für einen Prozessor recht aufwändig sein kann.

Äquivalent wäre in dem dir gewohnten Zehner-System eine Division durch 
10 (oder 100, oder 1000 oder ... ) bei der du nicht wirklich dividierst 
sondern einfach nur den Dezimalpunkt verschiebst. Um 47654 durch 100 zu 
dividieren musst du nicht rechnen, sondern kannst auch so direkt 
angeben, dass das Ergebnis 476 lautet.

Mach dir darum aber keinen Kopf, das erledigt der C Compiler für dich. 
Du sollst dir nur merken, dass du dem Compiler durch das Verwenden von 
2-er Potenzen eine Optimierung ermöglichst (und durch das Verwenden von 
unsigned Variablen). Daher preferierst du hier für die Anzahl der 
Messwerte eine 2-er Potenz wie 4, 8, 16, 32, 64, .... und nicht 
irgendwelche 10-er Einheiten.

: Bearbeitet durch User
von grüner Krauterer (Gast)


Lesenswert?

Ja, ich wuerd den exponentiellen Average verwenden, der ist einfacher. 
Siehe dessen Herleitung : 
http://www.ibrtses.com/embedded/exponential.html

von Anja (Gast)


Lesenswert?

Thomas schrieb:
> Jedoch schwankt das
> Messergebnis um 0-3 LSB (LSB = 0,375mV).

Hallo,

ich würde eher erst mal den Verdrahtungsfehler suchen (Sternverdrahtung 
Masse eingehalten, Tiefpaßfilter am ADC-Eingang, Schaltnetzteil?) bevor 
ich versuche irgendwelche mathematischen Korrekturen durchzuführen.

Erst wenn das "Rauschen" dem Datenblattwert entspricht (und auch eine 
Gaußsche Verteilung hat) dann kann man anfangen mit Mittelwertbildung.

Bei 0.375 mV sollte der ADC noch einwandfrei sauber auf einem Wert 
stehenbleiben außer man befindet sich tatsächlich genau zwischen 2 
ADC-Werten.

Gruß Anja

von Klaus (Gast)


Lesenswert?

Thomas schrieb:
> Um ein besseres Ergebnis zu erhalten, hätte ich mir überlegt z.B. 1000
> Messungen zu machen, die Messergebnise aufzuaddieren und dann durch die
> Anzahl der Messungen zu dividieren (1000) => arithmetischer Mittelwert

Was aber dazu führt, daß du Änderungen im Strom, die kürzer als die 
tausend Zyklen sind, gnadenlos wegmittelst.

MfG Klaus

von thomas s (Gast)


Lesenswert?

Alles gut und richtig, aber noch ist nicht klar, wo die 3 LSB überhaupt 
herkommen.

Schwankt der Strom um 3 LSB, kommt es vom Verstärker oder ist wirklich 
nur der ADC die Ursache? Wie ist eigentlich die Digitalisierungsrate? 
Bringt eine geringere Rate bessere Ergebnisse? Ich würde am Eingang des 
ADC beginnen mit der Suche, diesen erstmal kurzschließen.

von Max H. (hartl192)


Lesenswert?

Welchen ADC verwendest du eigentlich?

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Vielen dank, jetzt habe ich verstanden was mit rechtsshift gemeint ist.

Als ADC verwende ich den MAX1032. Er wurde so beschaltet wie im Anhang. 
Der Strom muss konstant sein, da er durch einen konstanten R fließt.
Die Ergebnise sind schwanken eig. großteils nur um 1 LSB. Aber ab und zu 
treten dann zufällig Werte auf, die um mehr als 1 LSB schwanken.

lg
Thomas

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:

> Als ADC verwende ich den MAX1032. Er wurde so beschaltet wie im Anhang.
> Der Strom muss konstant sein, da er durch einen konstanten R fließt.

Das heisst noch lange nichts.
'Der Strom' kommt ja nicht irgendwo her, sondern von einer Stromquelle / 
Spannunsquelle. Schwankt die Spannung (sprich: dein Netzteil kann die 
Spannung nicht ganz konstant halten) ein wenig, dann schwankt auch der 
Strom durch den R.

> Die Ergebnise sind schwanken eig. großteils nur um 1 LSB.

1 LSB ist praktisch immer drinn.
Und um 3 LSB würde ich mir (speziell bei einem 14 Bit ADC) noch 
überhaupt keine Gedanken machen.

> Aber ab und zu
> treten dann zufällig Werte auf, die um mehr als 1 LSB schwanken.

Solange du dein Netzteil, welches den R mit Strom versorgt nicht 
ausschliessen kannst, kann das Problem auch dort zu suchen sein.

von Thomas (Gast)


Lesenswert?

Als Spannungsquelle wird der DAC8512 mit einer Auflösung von 1mV 
verwendet. Seinne Ausgangsspannung habe ich schon überprüft, die ist 
stabil.

lg
Thomas

von c-hater (Gast)


Lesenswert?

Thomas schrieb:

> ich habe einen 14bit ADC und lese damit eine Gleichspannung ein, um
> daraus dann den fließenden Strom zu ermitteln. Jedoch schwankt das
> Messergebnis um 0-3 LSB (LSB = 0,375mV).

Also ca. ein mV. Nennenswert darunter kommt man auch nur bei sehr 
sorgfältigem elektrischen Aufbau, also völlig normal.

> Um ein besseres Ergebnis zu erhalten, hätte ich mir überlegt z.B. 1000
> Messungen zu machen, die Messergebnise aufzuaddieren und dann durch die
> Anzahl der Messungen zu dividieren (1000) => arithmetischer Mittelwert

Das ist der übliche Ansatz.

> Kennt ihr vielleicht eine effizientere Mittelwermethode als der
> arithmetische Mittelwert?

Das Problem ist hier nicht der arithmetische Mittelwert an sich, sondern 
die ungünstige Wahl der Zahl der Meßwerte. Wenn du dafür eine 
Zweierpotenz nimmst (hier würde sich z.B. 2^10=1024 anbieten), sparst du 
die teure Division und kannst sie durch Bitschieben ersetzen. Das geht 
fast auf jedem System viel bis sogar sehr viel schneller als Dividieren.

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> Als Spannungsquelle wird der DAC8512

Auch der ist nur so gut wie seine Spannungsversorgung.

von Anja (Gast)


Lesenswert?

c-hater schrieb:
> Also ca. ein mV. Nennenswert darunter kommt man auch nur bei sehr
> sorgfältigem elektrischen Aufbau, also völlig normal.

Wobei ich mir bei meinen 24 Bit ADCs sorgen mache wenn das Rauschen mal 
über 20 uV ansteigt. Bei sorgfältigem Aufbau (und Batterieversorgung) 
sind auch 10uVpp Rauschen möglich.

c-hater schrieb:
> Wenn du dafür eine
> Zweierpotenz nimmst (hier würde sich z.B. 2^10=1024 anbieten), sparst du
> die teure Division und kannst sie durch Bitschieben ersetzen. Das geht
> fast auf jedem System viel bis sogar sehr viel schneller als Dividieren.

Bei Schaltungen die mit Netzfrequenz (50 Hz) zu tun haben und ggf ein 
entsprechender Restbrumm auf dem Signal ist würde ich eher so viele 
Meßwerte mitteln wie in 20 ms (oder vielfache davon) passen.
Z.B. 20 Meßwerte im 1 ms Interrupt/Trigger gemessen alle 20 ms 
gemittelt.
Multiplikation mit dem Kehrwert ist auch oft "schneller" als dividieren.

Gruß Anja

von Harald W. (wilhelms)


Lesenswert?

Thomas schrieb:

> Mit effizienter meinte ich eine bessere bzw. genauere Methode.

Durch Mittelwertbildung bekommst Du zwar eine höhere Auflösung,
nicht aber eine höhere Genauigkeit. Die bekommst Du nur durch
Verwendung eines genaueren AD-Wandlers. Allerdings muss dann
auch das analoge Frontend genauer arbeiten. Und für eine bessere
Genauigkeit als 1Promille braucht man schon sehr viel Erfahrung
auf dem Gebiet der Entwickluung von Präzisionsschaltungen haben.
Gruss
Harald

von Hermann (Gast)


Lesenswert?

Thomas schrieb:
> Kennt ihr vielleicht eine effizientere Mittelwermethode als der
> arithmetische Mittelwert?
Ich verwende bei ADC-Messungen einen digitalen Tiefpass. Das hat den 
Vorteil, dass nach jeder Wandlung ein aktueller geglätteter Wert zur 
Verfügung steht.
Wie das geht, habe ich schon mal hier beschrieben:
Beitrag "Re: gleitender Mittelwert"

von m.n. (Gast)


Lesenswert?

Anja schrieb:
> Wobei ich mir bei meinen 24 Bit ADCs sorgen mache wenn das Rauschen mal
> über 20 uV ansteigt.
....
> Multiplikation mit dem Kehrwert ist auch oft "schneller" als dividieren.

Ich denke, daß die ADC-Wandlung mit 24 Bit 1000 x langsamer ist als eine 
einzige Division ;-)

von ./. (Gast)


Lesenswert?

> Ich denke, daß die ADC-Wandlung mit 24 Bit 1000 x langsamer ist als eine
> einzige Division ;-)

Sigma-Delta-ADs schaffen das verdammt schnell.
(z.B. im Silabs F350)

Da sollte man also nicht sein Diplom drauf verwetten...

von Dunstknilch (Gast)


Lesenswert?

Nebenbei gibt es 24bitter mit 600kSample ...

Die Messung kann allenfalls verbessert werden indem man die Signale 
soweit moeglich differentiell fuehrt.

von Ulrich H. (lurchi)


Lesenswert?

Der einfache Mittelwert ist schon eine sehr gute Lösung: schnell und vom 
Rauschen her passend. Besser geht es vermutlich nicht. Die Frage wäre 
höchstens ob man vor dem ADC noch ein Antialiasing-Filter braucht.

Den wesentlichen Punkt hat Anja oben genannt: es kommt darauf an ein 
Vielfaches der 20 ms Netzperiode zu mitteln. Dafür sollte man ein paar 
µs mehr an Rechenzeit in Kauf nehmen und auch eine krumme Zahl 
akzeptieren.

Wenn aus irgendwelchen Gründen einzelne grobe Ausreißer bei den Werten 
möglich sind, wäre ein Robuster Mittelwert ähnlich dem Median besser, 
allerdings auf Kosten von deutlich mehr Rechenzeit und Speicher. Die bis 
3 LSB Abweichung sprechen allerdings eher nicht dafür.

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.