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
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?`
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.
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.
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
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.
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.
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.
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.
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.
@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.
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,...
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!
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
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.
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.
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
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.
@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.
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).
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.
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.
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.
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...
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...