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.
:
Bearbeitet durch User
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 |
3 | GefilterterWert = GefilterterWert - AlterTeil + NeuerTeil; |
:
Bearbeitet durch User
Johnny B. schrieb: > Sinngemäss etwa so... Kennen wir aus dem Beitrag "PT1-Filter in C" Ich würde als Holzhammerallheilmethode einen Medianfilter vorschlagen.
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...
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.