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
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
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
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
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.
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
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
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.
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
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.
Als Spannungsquelle wird der DAC8512 mit einer Auflösung von 1mV
verwendet. Seinne Ausgangsspannung habe ich schon überprüft, die ist
stabil.
lg
Thomas
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.
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
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
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"
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 ;-)
> 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...
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.