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
Ich denke bei einer so hohen Auflösung von 10 Bit ist die Frage nach Temperaturdrift und Lanzeitstabilität hinfällig
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
Hi Schon mal bei Atmel nachgesehen? AVR120: Characterization and Calibration of the ADC on an AVR MfG Spess
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
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.