Forum: Mikrocontroller und Digitale Elektronik ADC - Methoden zur Mittelwertbildung


von HansPeter (Gast)


Lesenswert?

Hallo zusammen!

Im Rahmen meiner Bachelorarbeit bin ich auf der Suche nach dem besten 
Verfahren (Mittelwerberechnung, digitaler Tiefpass, ...) um eine 
DC-Spannung mittels eines ADC's zu messen. Im Internet finde ich dazu 
einige Themen, die aber nur sehr allgemein gehalten sind (meist nur 
Lösungsansatz ohne Erklärung wieso das eine gute Methode sein soll). In 
fach-einschlägiger Literatur habe ich leider auch nichts wirklich 
relevantes gefunden.

Ich würde mich freuen wenn ihr kurz eure Erfahrungen mit den besten 
Berechnungsmethoden mit mir teilen könntet (dabei ist die Genauigkeit 
der Effizienz vorzuziehen). Über Fachbegriffe (die als Grundlage für 
eine weiter Recherche dienen) oder Erläuterungen wieso das eine gute 
Messmethode sein soll würde ich mich natürlich sehr freuen.
Auch Hinweise zu verwendbarer Literatur wären erfreulich.

Kurz zu meinem Setup:
Gemessen wird mit einem 12bit-SAR-ADC (interner ADC des 
STM32F105VCT6-µCs), mit einem vorgeschalteten 1/14,9-Spannungsteiler: 
(1k + (10k+3k9) mit jeweils 0,01% Toleranz).
Da der Messbereich (0-48V) relativ groß ist, ist meine LSB-Spannung 
natürlich verhältnismäßig groß (~12mV).

Was ich bisher herausgefunden habe:
-> Für den Spannungsteiler Widerstände verschiedener Hersteller/Chargen 
verwenden (damit fertigungsbedingte Toleranzen nicht so einen großen 
Einfluss haben -> wurde bereits umgesetzt).
-> Mehrfache Messungen durchführen und Mittelwert bilden (die Anzahl 
sollte aufgrund von Effizienz einem vielfachen von Zwei entsprechen).
Aussortieren der größten und kleinsten Messwerte (damit Ausreißer nicht 
die Mittelwertbildung beeinflussen)

Vielen Dank im Voraus!
Schöne Grüße
HansPeter

von Peter II (Gast)


Lesenswert?

HansPeter schrieb:
> Für den Spannungsteiler Widerstände verschiedener Hersteller/Chargen
> verwenden (damit fertigungsbedingte Toleranzen nicht so einen großen
> Einfluss haben -> wurde bereits umgesetzt).

soll das wirklich etwas bringen oder ist das Woodoo?

Wenn die Widerstände mit einer Genauigkeit von 0,01% gekauft werden, 
dann ist es doch egal von welchem Hersteller sie sind. Wenn man es noch 
genauer will, dann muss man sie selber ausmessen. (oder noch genauer 
kaufen).

Ich vermisste die Angabe zur Referenzspannung, was ist dort verbaut und 
wie genau ist diese?`

von Christian M. (chrigi001)


Lesenswert?

HansPeter schrieb:
> Kurz zu meinem Setup:
> Gemessen wird mit einem 12bit-SAR-ADC (interner ADC des
> STM32F105VCT6-µCs), mit einem vorgeschalteten 1/14,9-Spannungsteiler:
> (1k + (10k+3k9) mit jeweils 0,01% Toleranz).

Du solltest parallel zu deinem 1k Widerstand noch einen 
Keramikkondensator schalten. Normalerweise sollte die Zeitkonstante die 
sich dann ergibt, grosser als die Samplezeit aber kleiner als die Zeit 
zwischen den Samples des ADCs sein. Du kannst den Kondensator aber auch 
grösser machen, dann hast du deine Mittelwertberechnung schon grob in 
Hardware.

Weiter ist die Kapazität des "Sample and Hold" im ADC zu 
berücksichtigen. Bei einem so hochohmigen Spannungsteiler und kurzer 
Samplezeit ist es gut möglich, dass die Hold Kapazität nicht schnell 
genug geladen wird und deine Messwerte konstant etwas zu tief sind. 
Dieses Problem kann man aber mit einem zusätzlichen OpAmp als BufferAmp 
oder einer noch grösseren Kapazität am Spannungsteiler lösen.

: Bearbeitet durch User
von HansPeter (Gast)


Lesenswert?

Peter II schrieb:
> soll das wirklich etwas bringen oder ist das Woodoo?
>
> Wenn die Widerstände mit einer Genauigkeit von 0,01% gekauft werden,
> dann ist es doch egal von welchem Hersteller sie sind. Wenn man es noch
> genauer will, dann muss man sie selber ausmessen. (oder noch genauer
> kaufen).

Logisch klingt das Ganze zumindest. Ein Herstellungsverfahren oder ein 
für eine Charge verwendetes Material kann ja z.B. eher zur unteren 
Toleranz neigen. Natürlich liegen diese Werte aber trotzdem innerhalb 
der Toleranz. Wenn die Wert aller Widerstände in die gleiche Richtung 
abweichen, wird der Fehler größer. Wenn sie in verschiedene Richtungen 
abweichen, kann es sein, dass sich die Fehler gerade aufheben.
Das heißt die Chance, dass der Fehler kleiner wird, ist bei 
verschiedenen Widerständen größer. Ob es tatsächlich was bringt ist eher 
schwer zu sagen.

Peter II schrieb:
> Ich vermisste die Angabe zur Referenzspannung, was ist dort verbaut und
> wie genau ist diese?`

Das habe ich komplett verschwitzt:
Referenzspannung ist 3,3V mit 0.05% Toleranz.

von JoJo (Gast)


Lesenswert?

HansPeter schrieb:
> mit einem vorgeschalteten 1/14,9-Spannungsteiler:

Was du damit meinst, ist mir nicht ganz klar.

Peter II schrieb:
> Ich vermisste die Angabe zur Referenzspannung, was ist dort verbaut und
> wie genau ist diese?`

Wichtige Frage, unbedingt klären - zusätzlich zu den Nichtlinearitäten 
des ADC(INL/DNL) der größte Fehlereintrag.

Vielleicht hilft Dir hier auch das Stichwort ratiometrische Messung 
weiter.

Zusätzlich dazu noch Referenzwiderstände aufs Board packen. Damit haust 
Du schon mal Verstärkungsfehler und Offset der Messchaltung raus. Damit 
Du hier nicht sonderlich genau sein musst(sonst müsstest Du für jeden 
Aufbau die Werte der Referenzwiderstände sehr genau bestimmen, 
unpraktikabel) nochmals einen Abgleich mit externer Beschaltung 
vornehmen und eine zweite Korrekturgerade in SW berechnen 
lassen(Kalibrierung).
Grüße und viel Erfolg

von Peter II (Gast)


Lesenswert?

HansPeter schrieb:
> Das habe ich komplett verschwitzt:
> Referenzspannung ist 3,3V mit 0.05% Toleranz.

dann ist es wohl reichlich egal on die 0,01% ihren am Limit ihrer 
Toleranz sind.

von JoJo (Gast)


Lesenswert?

JoJo schrieb:
> Zusätzlich dazu noch Referenzwiderstände aufs Board packen. Damit haust
> Du schon mal Verstärkungsfehler und Offset der Messchaltung raus.

Wären zwei zusätzliche Kanäle, die Du in jedem Messzyklus mitmessen 
musst.

von Achim S. (Gast)


Lesenswert?

HansPeter schrieb:
> Wenn die Wert aller Widerstände in die gleiche Richtung
> abweichen, wird der Fehler größer. Wenn sie in verschiedene Richtungen
> abweichen, kann es sein, dass sich die Fehler gerade aufheben.
> Das heißt die Chance, dass der Fehler kleiner wird, ist bei
> verschiedenen Widerständen größer.

Das gilt (theoretisch) für die beiden 10k und 3k9, die du in Serie 
schaltest. Für den 1k, der das andere Ende des Teilers bildet, gilt 
genau das Gegenteil: er sollte möglichst in die selbe Richtung abweichen 
wie die 10k+3k9, damit der Fehler des Teilerverhältnis minimal wird.

Wie aber schon beschrieben wurde, ist das praktisch irrelevant. Schon 
auch deshalb, weil der 10k und der 1k auch beim selben Hersteller 
natürlich nicht aus der selben Produktionscharge stammen.

von HansPeter (Gast)


Lesenswert?

Christian M. schrieb:
> Du solltest parallel zu deinem 1k Widerstand noch einen
> Keramikkondensator schalten. Normalerweise sollte die Zeitkonstante die
> sich dann ergibt, grosser als die Samplezeit aber kleiner als die Zeit
> zwischen den Samples des ADCs sein. Du kannst den Kondensator aber auch
> grösser machen, dann hast du deine Mittelwertberechnung schon grob in
> Hardware.

Gute Idee. Leider sind Hardwareänderungen im Moment eher schwierig 
umzusetzen.


Christian M. schrieb:
> Weiter ist die Kapazität des "Sample and Hold" im ADC zu
> berücksichtigen. Bei einem so hochohmigen Spannungsteiler und kurzer
> Samplezeit ist es gut möglich, dass die Hold Kapazität nicht schnell
> genug geladen wird und deine Messwerte konstant etwas zu tief sind.
> Dieses Problem kann man aber mit einem zusätzlichen OpAmp als BufferAmp
> oder einer noch grösseren Kapazität am Spannungsteiler lösen.

Meine Sampelzeit liegt im Moment bei ~3,5us.
Samplekapazität ist 8pF. Das heißt meine "Einschwingzeit" dürfte 
irgendwo bei 20ps liegen -> das sollte also kein Problem sein
Auch hier ist eine Hardwareänderung in Form eines OPV leider eher 
schwierig, da ich eine vorgegebene Hardware nutzen muss und bestenfalls 
Bestückungsänderungen vornehmen kann.

von Christian M. (chrigi001)


Lesenswert?

HansPeter schrieb:
> Gute Idee. Leider sind Hardwareänderungen im Moment eher schwierig
> umzusetzen.

HansPeter schrieb:
> bestenfalls
> Bestückungsänderungen vornehmen kann.


Ich nehme mal an du hast alles in SMD. Du könntest also, wenn du doch 
noch einen Kondensator parallel schalten möchtest, diesen einfach auf 
den SMD Widerstand oben drauf löten.

von Hermann (Gast)


Lesenswert?

@HansPeter
Für mich sind das unnötige Aufwände an der falschen Stelle.
0,01%-Widerstände, 0,05%-Referenz, Widerstände verschiedener Hersteller 
...
Wichtig ist die Temperaturkonstanz und die Langzeitstabilität. Alle 
anderen Abhängigkeiten kann man kalibrieren und mit entsprechendem 
Faktor in der Software korrigieren. Lieber Widerstände aus einer Charge, 
da sich der Teilerfaktor bei gleichen Abhängigkeiten nicht ändert.

Ich mache das so: Mittelung mit einem digitalen Tiefpass. Bei dem großen 
Teilerfaktor messe ich mehrfach mit unterschiedlichen Teilern und wähle 
per Software aus, welche Messung innerhalb des Messbereichs ist. Man 
kann auch die Spg. mit einer Zenerdiode heruntersetzen. Ein LM385 kommt 
schon mit 10µA aus.

von A. S. (Gast)


Lesenswert?

Du brauchst einen analogen Tiefpass vor dem ADC. Grenzfrequenz >> 
Abtastrate.

Ohne Erklärung was du wozu misst, ist alles vodoo.

Kalibrierung, Mitteilung, Verhalten bei Messwert- Änderungen,...

von HansPeter (Gast)


Lesenswert?

Achim S. schrieb:
> Das gilt (theoretisch) für die beiden 10k und 3k9, die du in Serie
> schaltest. Für den 1k, der das andere Ende des Teilers bildet, gilt
> genau das Gegenteil: er sollte möglichst in die selbe Richtung abweichen
> wie die 10k+3k9, damit der Fehler des Teilerverhältnis minimal wird.
>
> Wie aber schon beschrieben wurde, ist das praktisch irrelevant. Schon
> auch deshalb, weil der 10k und der 1k auch beim selben Hersteller
> natürlich nicht aus der selben Produktionscharge stammen.

Das habe ich mir auch schon überlegt. Die beiden größeren Widerstände 
haben den größeren Einfluss, weshalb ich mich dann doch für diese 
Schaltung Methode entschieden habe.
Du (bzw. ihr) habt aber natürlich recht, dass das im Verhältnis zur 
Referenzquelle nicht einen allzugroßen Einfluss hat. Soweit habe ich 
leider nicht gedacht.

Christian M. schrieb:
> Ich nehme mal an du hast alles in SMD. Du könntest also, wenn du doch
> noch einen Kondensator parallel schalten möchtest, diesen einfach auf
> den SMD Widerstand oben drauf löten.

Für die Einzelfertigung wäre das sicherlich eine Lösung. Sobald die 
Stückzahlen aber in die 1000e gehen, wird das ganze eher unmöglich.


Danke nochmal für die ganzen Antworten!

von Hermann (Gast)


Lesenswert?

HansPeter schrieb:
> Im Rahmen meiner Bachelorarbeit bin ich auf der Suche nach dem besten
> Verfahren (Mittelwerberechnung, digitaler Tiefpass, ...) um eine
> DC-Spannung mittels eines ADC's zu messen. In
> fach-einschlägiger Literatur habe ich leider auch nichts wirklich
> relevantes gefunden.
Zum Oversampling hat Atmel diese Info:
http://www.atmel.com/images/doc8003.pdf

von Christian M. (chrigi001)


Lesenswert?

HansPeter schrieb:
> Für die Einzelfertigung wäre das sicherlich eine Lösung. Sobald die
> Stückzahlen aber in die 1000e gehen, wird das ganze eher unmöglich.

Bei solchen Stückzahlen währe aber dann ein Re-designe das 
Prototypen-PCBs (Ich hoffe in dem Status bist du noch) angebracht.

Denn wie Achim S. schrieb:
> Du brauchst einen analogen Tiefpass vor dem ADC. Grenzfrequenz >>
> Abtastrate.

Alles andere ist einfach nur schlechtes Designe.

von Reinhold (Gast)


Lesenswert?

Standardmäßig verwende ich eigentlich immer Median-Filter um Messwerte 
von DC-Größen zu glätten. Also mehrmals messen, die Messpunkte nach 
Größe sortieren und dann den mittleren der sortierten Werte nehmen. 
Damit spielen einzelne Ausreißer, im Gegensatz zum arithmetischen 
Mittel, überhaupt keine Rolle mehr.
Im Prinzip hast du das ja mit "Aussortieren der größten und kleinsten 
Messwerte" schon selbst vorgeschlagen.

Aufpassen muss man beim Median-Filter halt immer, wenn Dynamik und 
Frequenzgang eines Signals wichtig sind, also der Messwert zum Beispiel 
in einer Regelschleife verwendet wird.

von Johnny B. (johnnyb)


Lesenswert?

HansPeter schrieb:
> Mehrfache Messungen durchführen und Mittelwert bilden

Das ist meistens eine gute Idee um Störungen rauszukriegen und die
Auflösung zu erhöhen (oversampling).
Bisher benutzte ich dazu meist ein IIR-Filter:
https://de.wikipedia.org/wiki/Filter_mit_unendlicher_Impulsantwort

Der Wikipediaartikel erscheint zwar ein wenig kompliziert, aber man kann
sowas sehr einfach in zwei/drei kurzen Zeilen C-Code implementieren.
Wenn man es geschickt anstellt, braucht es nicht mal
Fliesskommazahlen/Divisionen, sondern kann alles mit Schiebeoperationen
gemacht werden.
Bei der folgenden Variante muss man nicht mal mehrere Messwerte
zwischenspeichern, wie das bei einem FIR-Filter der Fall wäre.

Sinngemäss etwa so...

Jedes mal wenn ein neuer Messwert (ADCWert) verfügbar ist:
1
AlterTeil = GefilterterWert / Filterkonstante; // Minus alter Anteil
2
NeuerTeil = ADCWert / Filterkonstante; // Plus neuer Anteil
3
GefilterterWert = GefilterterWert - AlterTeil + NeuerTeil;

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Johnny B. schrieb:
> Sinngemäss etwa so...
Kennen wir aus dem Beitrag "PT1-Filter in C"

Ich würde als Holzhammerallheilmethode einen Medianfilter vorschlagen.

von Achim S. (Gast)


Lesenswert?

HansPeter schrieb:
> Die beiden größeren Widerstände
> haben den größeren Einfluss, weshalb ich mich dann doch für diese
> Schaltung Methode entschieden habe.

Rechne das lieber noch mal nach, bevor du so etwas in deine 
Bachelorarbeit reinschreibst.

von Gustl B. (-gb-)


Lesenswert?

@HansPeter:

Vielleicht habe ich das ja überlesen, aber was willst Du genau messen?

Eine DC Spannung von 0 ... 48V?
Wie genau?
Wie schnell? Also wie weit (Zeit) dürfen die einzelnen Messerte 
auseinander liegen?
Was soll die höchste Frequenz sein die Du noch messen können willst?

Mittelwertbildung durch Tiefpass wäre auch eine Idee.

von HansPeter (Gast)


Lesenswert?

Gustl B. schrieb:
> Vielleicht habe ich das ja überlesen, aber was willst Du genau messen?
>
> Eine DC Spannung von 0 ... 48V?
> Wie genau?
> Wie schnell? Also wie weit (Zeit) dürfen die einzelnen Messerte
> auseinander liegen?
> Was soll die höchste Frequenz sein die Du noch messen können willst?

Schlussendlich werden z.B. die Versorgungsspannungen anderer Geräte 
gemessen. Das heißt mein Messsignal sollte über die Messzeit (abgesehen 
von Rauschen, Störungen, ...) konstant sein. Die höchste vorkommende und 
zu Messende Frequenz geht dementsprechend gegen Null.

Zum Thema Geschwindigkeit:
Da das Signal konstant sein sollte, werden keine großen Anforderungen an 
die Abstände zwischen den Messungen gestellt. Es soll außerdem nur der 
Momentanwert festgestellt werden (also keine Langzeitmessungen, dass die 
Spannung über einen bestimmte Zeitdauer konstant ist)
Aus praktikablen Gründen sollte die Messung aber nicht zu lange dauern 
(<0.5 Sekunden ist auf jeden Fall anzustreben).

von Peter II (Gast)


Lesenswert?

HansPeter schrieb:
> Schlussendlich werden z.B. die Versorgungsspannungen anderer Geräte
> gemessen.

und dafür der Aufwand? Meist sind die Versorgungsspannung mehr +-5% 
definiert.

8bit und 1% Widerstände würden vermutlich auch reichen.

von HansPeter (Gast)


Lesenswert?

Peter II schrieb:
> und dafür der Aufwand? Meist sind die Versorgungsspannung mehr +-5%
> definiert.
>
> 8bit und 1% Widerstände würden vermutlich auch reichen.

Dachte mir schon, dass sowas kommt. Trotzdem danke für die Antwort.

Versorgungsspannungen sind nur ein Beispiel. Es kommen wirklich nur 
konstante Spannungen vorkommen (deshalb habe ich dieses Beispiel 
verwendet). Es können auch genauere Ergebnisse benötigt werden.

von Gustl B. (-gb-)


Lesenswert?

HansPeter schrieb:
> Es kommen wirklich nur
> konstante Spannungen vorkommen (deshalb habe ich dieses Beispiel
> verwendet).

Wenn die zu messende Spannung konstant ist, genügt es diese einmalig zu 
messen zu einem beliebigen Zeitpunkt.

Wie genau Du messen willst/sollst weiß ich immer noch nicht ... aber 
egal. Einen ADC nehmen und vorher einen krassen Tiefpass bauen.

von Jacko (Gast)


Lesenswert?

Ein Spannungsteiler 48 V über 14,9 k und 1 k nach Masse
ist schon mal nicht hochohmig, wie manche Schlauköpfe hier
verbreiten!

Der Innenwiderstand ist < 1 k, womit auch ein Sample-C von
30 pF in 0,3 µs mit 10 x tau auf 12 Bit Genaugkeit geladen ist.

Packst du noch einen hochwertigen C von 0,1 µF parallel zu
den 1 k, hast du gerade mal einen TP mit 1,6 kHz (-3dB).
- Netzbrumm kriegst du damit nicht weg. > 10 kHz schon.

Für die gewünschte "absolute" Spannungsmessung ist
ratiometrische Messung auch das falsche Stichwort.

Dann lieber "schlau" filtern:
Z.B. 8 Messungen über 20 ms (Abstand = 2,5 ms) summieren
und durch 8 teilen, schon "kürzen" sich regelmäßige 50 und
100 Hz Störungen raus...

Ansonsten: Haben die 0,01% Widerstände etwa den gleichen TK
- manchmal ändert der sich (siehe Datenblatt!) beim gleichen
Hersteller mit dem Wertebereich - dann geht das schon OK.

Schließlich hat ja auch der ADC so seinen Temperaturgang und
Unlinearitäten...

von Edi M. (Gast)


Lesenswert?

Das mit den Widerstandschargen ist ziemlicher Unfug. Woher kommt denn 
die Idee?

Mittelwertbildung geht auch etwas intelligenter.

>bachelor
Volle Deckung

Wo und wie hast du recherchiert? Das Netzt ist voll mit Filtern und 
Mittelwertberechnern, samt Gewichtung, Grenzfrequenz etc...

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.