Nabend lieben User,
ich plane ein Messsystem zur Messung von Strömen und Spannungen mittels
ADC.
Nun möchte ich die Messungen so genau wie möglich durchführen (bei
10bit). Da meine Referenzspannung, meine Widerstände, meine Verstärker
und auch der ADC des Controllers (AtMega8 / C) Toleranzbehaftet ist,
möchte ich eine Funktion in C implementieren, welche eine
softwaretechnische Kalibrierung des Systems durchführt bzw. den Messwert
korrigiert.
Hat vielleicht jemand eine Idee oder eine Anregung, wie man so etwas
bewältigen könnte?
Wäre für jeden Anreiz dankbar
LG Laz
Hallo Lazley,
meist ist eine linearisierung über den Messbereich ausreichend.
Beispiel Spannung soll 24 Volt Bereich 20 bis 28 Volt
Du brauchst 2 Punkte am besten an den Rändern.
Spannung anlegen (genaue Messung extern) und Intern ( 10 Bit wert)
Aus den Zwei Punkten dann Offset und Faktor berechnen (Geradengleichung
Aufstellen).
Danach gilt für Messungen: Messwert = Faktor * 10 bit Wert + Offset
Faktor und Offset (evtl. Einheit z.B. mA,A) für den Messkanal in EEProm
speichern.
Gut mit PC über RS232 zu Automatisieren.
Gruß Hans
Hi Lazley,
Wäre ja zu schön wenn man durch simple Mathematik Messfehler korrigieren
könnte.. Das Problem ist, du kennst die Toleranzgrenzen aber nicht deren
reale Grösse somit bleibt dir nur eins... Dein Messergebnis mit einem
Eichgerät zu kalibrieren.
Zwei Grössen kannst du dennoch in deine Berechnung einfließen lassen ->
Du kennst die grösse deines Shunt's und den Eingangswiderstand deiner
Messspannungsschaltung... Die bügeln dir aber nicht die
Bauteiltoleranzen weg
Gruss Chris
Die o.a. Linearisierung findet nicht nur auf dem Papier statt!
Es wird genau die Hardware verwendet die anschliesend auch die Messwerte
liefern soll. Daher auch das genaue Messen extern!
Wenn dann die Einsatzbedingungen später nicht zu stark abweichen
sind die Ergebnisse durchaus brauchbar.
z.B. die Toleranzen eines Spannungsteilers können genau für diesen einen
Messkanal erfast werden. Die Werte sind natürlich nicht übertragbar auf
andere Messkanäle bzw. Aufbauten.
Daher jeden Kanal bei jedem gerät einzeln einmessen (deshalb auch
automatisieren).
Durch das geschickt wählen der Messpunkte wird der Messwert im
erwartungsbereich noch genauer (Bsp. oben 20 und 28 Volt und nicht
0 bis 30)
Diese Variante hat schon Audits überstanden!!
Gruß Hans
Hallo Lazley
Es geht im Prinzip so, wie Hans schreibt. Es wird zur Kalibration eine
Referenz benötigt, die möglichst ein wenig genauer ist, als das spätere
Messergebnis.
Lineare Korrektur:
Es werden mindestens 2 Messpunkte benötigt. Ein Punkt in der Nähe des
Nullpunktes und einer in der Nähe des Vollausschlages. Alternativ können
auch mehrere Messpaare aufgenommen werden. Es wird die sogenannte
Umkehrfunktion benötigt. Dazu kannst du in einer Exceltabelle in die 1.
Spalte den AD-Wert und in die 2. Spalte den Referenzwert eingetragen.
Nun stelle die Kurve in der XY Darstellung dar und füge eine lineare
Trendlinie ein. Bei Eigenschaften der Trendlinie kannst du die Funktion
einblenden.
Diese Funktion mit der Form y = m*x + b musst du nun nur noch in dein C
Programm übertragen. Damit lassen sich durch simple Mathematik die
meisten Messfehler korrigieren.
Nichtlineare Fehlerkorrektur.
Falls die Kurve stark gekrümmt ist, muss zur Korrektur eine Parabel bzw.
eine Funktion gewählt werden, mit welcher die Messwerte in der Tabelle
möglichst genau nachgebildet werden können. Häufig sind auch Polynome 2.
3. und 4. Ordung, quadratische oder logarithmische Funktionen oder
Wurzelfunktionen.
Zuletzt musst du den Vorgang, welchen du mit Excel durchgeführt hast, in
dein C Programm übertragen. Die Software bekommt ein paar Messpunkte und
errechnet die Korrektur. Stichwort: Methode der kleinsten
Fehlerquadrate.
Gruss, Bernd
Vielen Dank für die Beiträge. Werde mich mal ein wenig mit den
Suchbegriffen auseinander setzen und mich bald melden... Vielen Dank
noch einmal für die Tips...
Hi,
also wäre es möglich, dass ich einmal genau ein paar Messwerte erfasse
(oder sind 2 Wertepaare an den Rändern für die Anwendung die bessere
Lösung?) und diese dann im EEPROM speichere? Oder kann ich die Werte als
Kontanten in mein Programm integrieren?
Danach stelle ich mit Hilfe der kleinsten Fehlerquadrate meine
Geradengleichung auf bzw errechne die Ausgleichsgerade. Oder muss ich
einfach eine Geradengleichung mittels der 2 Wertepaare aufstellen?
Wahrscheinlich macht die Methode der kleinsten Quadrate bei mehreren
Messwerten Sinn, was bei mir wegen dem linearen Zusammenhang überflüssig
wäre (liege ich da richtig)?
>Danach gilt für Messungen: Messwert = Faktor * 10 bit Wert + Offset
Ist das dann mein korrigiertes Messergebnis (ADC-WERT) und ich kann die
dann wie gewohnt in V bzw A umwandeln???
Welche Einflüsse sind dann kompensiert? Nur Toleranzen?
Klar dass da die Tempkorrektur etc nicht drin ist, aber grundsätzlich
geht es mir erst einmal um die Art und Weise wie man da rangeht und da
habt ihr mir schon sehr geholfen.
Besten Dank für die Mühe...
Laz Monet
Hallo,
ja hab ich mir intensivst angeschaut, aber leider finde ich nicht zu all
meinen Fragen eine Antwort. (habe auch schon anderweitig gesucht) Und
leider wird auf den mathematischen Kram nicht eingegangen. Stehe
immernoch vor dem Problem, vielleicht hat noch jemand eine Idee oder
eine Antwort auf meine Fragen?
Habe zuvor leider noch nicht mit dem EEPROM gearbeitet, werde mich aber
wohl dran begeben, wenn ich weiss, wie genau die Mathematik der Thematik
aussieht. In der Appnote120 steht, dass ich einen Gain und
Offset-Abgleich benötige. Damit ist nur der Achsenabschnitt meiner
Trendlinie und die Steigung der Geraden gemeint? Ich denke, dass ich
linear Approximieren werde, da wegen dem Ohm´schen Gesetz mein Messwert
durchaus linear sein sollte? Will ja nur Spannungen und Ströme messen
(sollte im idealfall doch eine Gerade sein???).
Kann mir vielleicht jemand bei der Aufgabe "unter die Arme greifen"?
Verstehe noch nicht ganz, was ich im EEPROM ablegen muss und wozu das
ganze gut ist. Ich könnte ja auch die beiden Korrekturdaten (wenn ich
denn die Ablegen muss) in mein Quellcode bzw die Kalibirierroutine
einbinden (als Konstanten) und dann quasi in den Flash programmieren?
Ist das nur so üblich, dass man "die" Parameter im EEPROM ablegt oder
hat das auch einen näheren Sinn?
Würde mich über jede Hilfe sehr freuen.
Schönen Abend und einen netten Sonntag
Laz
Hallo Lazley,
wenn du nach dem Rezept von oben vorgehst hast du gleich den
kpl. Messwert.
Bei meinem Beispiel hast du für 20 Volt (genauer Wert extern überprüft)
einen Messwert von 200 erhalten (vom µc), für 28 Volt 800.
Daraus ensteht die Gleichung Messwert = 1/75 * 10 Bit Wert + 17,333
(20 Volt = 200 * Faktor + Offset
28 Volt = 800 * Faktor + Offset aufgelößt
-> Faktor = 1/75 Volt Offset = 17,333 Volt )
Es ist alles enthalten.
Wenn jetzt dein Wandler den Wert 555 liefert einfach einsetzen und
du weist: Spannung ist 24,73 Volt.
Dadurch das du die Berechnung mit den echten Werten (Volt,A,mA etc.)
durchführst hast du alles incl. Einheit in einer Rechnung.
Daher auch das Speichern der Einheih als Option.
Gruß hans