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
Was meinst du mit effizienter? Wenn du 2^n Werte addierst, reicht es Rechtsshift statt Division.
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
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); |
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.
:
Bearbeitet durch User
Ja, ich wuerd den exponentiellen Average verwenden, der ist einfacher. Siehe dessen Herleitung : http://www.ibrtses.com/embedded/exponential.html
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.
Thomas schrieb: > Als Spannungsquelle wird der DAC8512 Auch der ist nur so gut wie seine Spannungsversorgung.
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...
Nebenbei gibt es 24bitter mit 600kSample ... Die Messung kann allenfalls verbessert werden indem man die Signale soweit moeglich differentiell fuehrt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.