PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mathematische Sensor-Linearisierung



BlueNature
06.12.2009, 12:06
Servus,

ich tüftle derzeit an einer Sensor-Linearisierung herum und komme empirisch auf keine saubere Lösung. Das Problem ist, ich habe keine lineare Funktion. Der Sensor an sich ist ein LDR mit einem Trimmpotentiometer, welcher über einen ADC digitalisiert wird in 10-Bit-Auflösung (0...1023). LDR ist gegen GND, das Poti ist gegen Uref geschaltet.

Die Funktion des LDR's zum ADC-Wert:

ADC = (LDR * 1024) / (LDR * R1)

Umgestellt nach LDR (um aus dem ADC-Wert den LDR-Wert zu errechnen):

LDR = (R1 * ADC) / (1024 - ADC)

Nun habe ich durch mehrfache Messungen sehr genaue Referenzwerte ermittelt. Diese sind an vier Stützstellen (im 1/3-Raster) ermittelt worden.

512 => 3/3 (1,000)
559 => 2/3 (0,666)
679 => 1/3 (0,333)
983 => 0/3 (0,000)

512 ist halbe ADC-Referenzspannung. Das wurde mit dem Potentiometer (R1) bei exakt 100% Lichtstärke einjustiert. Der Rest ist über exakte Zu- und Abschaltung am Messobjekt ausgemessen worden.

http://wiesolator.gotdns.org/rn/Licht-Kurve.PNG

Hier mein Versuche es in der Tabellenkalkulation anzunähern:

http://wiesolator.gotdns.org/rn/funktion.png

Weiß jemand ein Verfahren bzw. eine Vorgehensweise, wie man aus solchen (vier) Stützstellen eine saubere Gleichung ermitteln kann, die alle Zwischenpunkte (ADC-Werte) errechnen kann?

Grüße Wolfgang

Vitis
06.12.2009, 13:30
nennt sich Polynomregression, kann z.B. Matheass

oberallgeier
06.12.2009, 13:44
... ein Verfahren bzw. eine Vorgehensweise, wie man aus solchen (vier) Stützstellen eine saubere Gleichung ermitteln kann, die alle Zwischenpunkte (ADC-Werte) errechnen kann ...Mal ganz im Geheimen: mit zwei Stützpunkten geht das total einfach. Ok, dann weiter ohne OT: ich habe so eine wilde Messwertkurve für einen Sharp IR-Sensor aufgenommen. In Excel eingetragen - und das Excel hat mir (auf meinen Befehl natürlich) eine Regression ermittelt. Die Art der Regression ist wählbar. Ich habe aus der Kurve eine einfache Ersatzgleichung bestimmt, habe damit eine Kontrollkurve errechnet und die zur Kontrolle der Güte der Anpassung im Messblatt dargestellt. Siehe hier (klickdrauf) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=384168#384168). WENN man nicht genau die von Excel vorgeschlagene Gleichung nimmt (ist im Posting mit Beispielcode hinterlegt), dann kann man auch annähernd recht praktische, sprich schnell berechenbare, Ersatzkurven bekommen.

PS: Verschiedene Berechnungsverfahren sind möglich. Die Ergebnisse treffen entweder die Stützpunkte GENAU - dann könnte die Kurve aber ziemlich "schwingen", oder der Fehler (die Abweichung an den Stützpunkten) ist mehr oder weniger gering - dann kann die Kurve recht einfach werden. Da muss man wählen, was nach den eigenen Anforderungen an Genauigkeit und Verwendbarkeit am besten passt. Das o.g. Beispiel ist von der letzteren Art: möglichst einfache Rechnung bei guter Genauigkeit (mit Anpassung nach der Methode der kleinsten Quadrate...).

BlueNature
06.12.2009, 15:11
@Vitis
Mathe-Ass kam mir vorher auch wieder in den Sinn, hatte ich damals zu Uralt-DOS-Zeiten (vor über 15 Jahren) gehabt, eben hab ich es damit noch probiert:

Polynom-Regression

y = + 5,0751679
- 0,011188183 x
+ 6,132321E-6 x^2

Bestimmtheitsmaß = 0,98590114
Korrelationskoeff. = 0,99292555
Standardabweichung = 0,088502526

@Oberallgeier
Das mit Excel hatte mir jemand netterweise gezeigt, aber mich interessierte auch unter Hintergrund der Herleitung wie es methodisch hergeleitet wird. Mein Gedankengang war beispielsweise über eine Methode zum Hochlauf des µC eine ganze Tabelle zu errechnen über Konstanten, welche nach Bedarf einfach mitcompiliert werden. So könnte ich eben ohne externe Tools einfach eine Kalibrierung durchführen lassen.

Danke noch an Alle hier für die Tips, bin für Anregungen in der Art immer sehr erfreut :)

dennisstrehl
06.12.2009, 15:20
Die einfachste Mögliochkeit ist, ein Polynom dritten Grades in allgemeiner Form herzunehmen, also:
y = a*x^3 + b*x^2 + c*x + d

In dieses Polynom setzt man jeweils die x- und y-Werte eines Punktes ein und erhält eine Gleichung. Macht man das mit 4 Punkten, erhält man ein Gleichungssystem mit 4 Gleichungen und 4 Variablen, das man lösen kann.

Es gibt noch Wege, die sich wahrscheinlich einfacher implementieren ließen, die sind aber auch ein wenig komplexer...
http://de.wikipedia.org/wiki/Polynominterpolation

oberallgeier
06.12.2009, 16:07
... mich interessierte auch unter Hintergrund der Herleitung ...... und den hast Du mit MatheAss bekommen? Hmmmm.

Die "genaueste" Approximation, sprich eine "stützpunkttreue" Kurve, bekommst Du mit Splines.

................http://de.wikipedia.org/w/thumb.php?f=Spline%20interpolation.svg&width=200px

Das funktioniert etwa so, als würdest Du eine recht biegsame Latte an allen Stützpunkten annageln. Zwischen den Punkten kann sich die Latte frei bewegen und um die Punkte/Nägel kann sie sich reibungsfrei drehen. (Stimmt im Prinzip nicht ganz, EINE KANTE der Latte wird mit den Punkten zur Deckung gebracht). Die Verbindungskurve ist dann die "Biegelinie" der Holzlatte - und die ist mathematisch/physikalisch eindeutig definiert (*ggg* - wenn das Holz absolut gleichmässig ist *ggg*). Die Schiffsbauer nehmen das z.B. um die Schiffskörper möglichst "glatt" zu machen (Stichwort: mehrfach ableitbare Funktion). Deine Lösung mit Matheass gehört zu den Näherungen der zweiten Art (von der ich oben gesprochen hatte - die an den Stützpunkten vorbeigeht). Alles zusammen gehört zur Numerischen Mathematik. Ein interessantes Gebiet.

BlueNature
06.12.2009, 18:13
@Dennisstrehl
Ich habe jetzt reale Tests gefahren mit einem Polynom 3. Grades mit Ausblendung der unrelevanten Bereiche mit einer selektiven Berechnung. Das Resultat war im praktisch akzeptablen Bereich für die Anwendung und ich werde es einmal über längere Zeit auf die Praxistauglichkeit testen. Ich habe es mit einigen verschiedenen Stützwerten und Polynom-Graden getestet und habe nun vorerst eine passende Gleichung dafür gefunden.



' Licht-Interpolation
' *******************
' y = 20,367924 - 0,078266092 x + 0,00010096023 x^2 - 0,000000042928788 x^3
LichtInterpolation:
' AD-Messung durchführen
ADCWert = GetADC(LDR)
' Grenzwerte beachten
If ADCWert < 700 Then
' Quadrat errechnen
TmpWert1 = ADCWert
TmpWert2 = TmpWert1 ^ 2
TmpWert3 = TmpWert1 ^ 3
' 1. Teil
TmpWert4 = 20.367924
' 2. Teil
TmpWert5 = TmpWert1 * 0.078266092
' 3. Teil
TmpWert6 = TmpWert2 * 0.00010096023
' 4. Teil
TmpWert7 = TmpWert3 * 0.000000042928788
' Summe
LichtWert = TmpWert4 - TmpWert5
LichtWert = LichtWert + TmpWert6
LichtWert = LichtWert - TmpWert7
' Lichtfläche itegrieren
LichtMenge = LichtMenge + LichtWert
Else
LichtWert = 0
End If
Return


@Oberallgeier
Das mit der Herleitung gibt Mathe-Ass ja leider nicht an, da war nicht auf den oberen Teil zu beziehen und galt lediglich dem Interesse an einer Methodischen Herleitung.
Das mit Splines hatte ich auch zuerst gedacht, aber das ufert zu komplex aus für einen kleinen AVR. Mit Splines werde ich mich in näherer Zeit eh noch einmal genauer beschäftigen. Muß mir ein Bekannter etwas unter die Arme greifen der davon mehr versteht wie ich.

Danke fürs Erste, habt mir sehr geholfen.
Grüße Wolfgang

mare_crisium
06.12.2009, 21:25
Wolfgang,

wenn es Dich interessiert, warum die Methode der kleinsten Abweichungsquadrate funktioniert :-) : Im angehängten pdf findest Du eine kurze Ableitung am Beispiel eines Polynoms 2. Grades.

Ciao,

mare_crisium

Edit: Anhang gelöscht wg. Upload-Quota