Forum: Mikrocontroller und Digitale Elektronik Sensorkennlinie


von Sensorius (Gast)


Lesenswert?

Hallo

mich würde interessieren wie ihr diese Kennlinie mit einem uC auswerten 
würdet.

http://www.dema.net/pdf/sharp/GP2Y0A41SK0F.pdf

MfG

von Purzel H. (hacky)


Lesenswert?

Da scheint nichts zu sein... weshalb nicht einfach die Funktion posten ? 
Mit einem Polynom wird es machbar sein.

von Christian (Gast)


Lesenswert?

Die Kennlinie wird wohl nur abschnittsweise auswertbar sein. Entweder 
der Bereich Distance < 2cm oder Distance > 4cm. Dazwischen würde ich 
mich nicht auf die Eindeutigkeit der Messung verlassen.

Distance > 4cm sollte entweder über eine Stützwerttabelle oder über eine 
mathematische Funktion machbar sein.
Die Funktion könnte ein Polynom oder eine gebrochen rationale Funktion 
sein. Mit dem "Curve fitting tool" von Mathlab kann man die Funktion 
bestimmt gut nachbilden.

von Sensorius (Gast)


Lesenswert?

Es geht um den Bereich >4cm.

von Feierabend (Gast)


Lesenswert?

Die de_utsche ma_schinenfabrik hat noch betriebsferien.

von Vlad T. (vlad_tepesch)


Lesenswert?

das problem ist ja aber, dass du sicherlich aus der Spannung die Distanz 
wissen willst, oder?

wenn du sicherstellen kannst, das das Objekt nicht näher als 4cm ist, 
ist es einfach. Die Kurve sieht so aus, als könnte ein Polynom 2. 
Ordnung reichen

von Vlad T. (vlad_tepesch)


Lesenswert?

wobei die nächste Seite gibt ja einen richtig guten Tip, wie du es mit 
einer Linearen approximation hinbekommst

von Sensorius (Gast)


Lesenswert?

>das problem ist ja aber, dass du sicherlich aus der Spannung die Distanz
>wissen willst, oder?

Eigentlich schon. Was ist das Problem.


>wenn du sicherstellen kannst, das das Objekt nicht näher als 4cm ist,
>ist es einfach. Die Kurve sieht so aus, als könnte ein Polynom 2.
>Ordnung reichen

Ich kann es nicht sicherstellen aber ich muss es einfach so hinnehmen. 
Messen erst ab >4cm.

Oder gibt es noch andere Möglichkeiten?


>Die Kurve sieht so aus, als könnte ein Polynom 2.Ordnung reichen

Wie könnte man das Polynom aufstellen, oder geht es nur mit einem 
Programm.

von Sensorius (Gast)


Lesenswert?

>Die de_utsche ma_schinenfabrik hat noch betriebsferien.

Hat das was zu bedeuten oder sind das noch immer die Folgen von Neujahr.

von Feierabend (Gast)


Lesenswert?

dema.net kann von hier/mir nicht gefunden werden, das soll es bedeuten.

von Volker Z. (vza)


Lesenswert?

Nix Pölynom.
Schau dir die zweite Kurve an.
Da steht alles was du brauchst.

von Feierabend (Gast)


Lesenswert?

ahh, muß es selbst eingeben...

von Sensorius (Gast)


Lesenswert?

Irgendwie steh ich auf dem Schlauch.

Ich komme nicht auf die Formel wie man die Länge berechnet.

von Thilo M. (Gast)


Lesenswert?

Wenn nichts hilft, dann kalibrier' das Ding.
Lass' ihn in 5mm-Abständen (je nach gewünschter Genauigkeit) eine 
Lookup-Table erstellen und interpoliere ggf. dazwischen. Ist einmal 
Aufwand, aber dafür recht genau. ;)

von yalu (Gast)


Angehängte Dateien:

Lesenswert?

Folgende Approximation wäre möglich:

  U = 15/(d+1.5)-0.05

bzw.

  d = 15/(U+0.05)-1.5

wobei d die Distanz in cm und U die Ausgangsspannung in V ist. Im
angehängten Bild habe ich den Plot obiger Funktion über das Original
gelegt.

Geschickter ist es aber wahrscheinlich, eine Lookup- Tabelle anzulegen.
Da die Sensoren eine sehr hohe Exemplarstreuung aufweisen, füllst du
diese am besten, wie von Thilo vorgeschlagen, mit selbst gemessenen
Werten.

Für das Einlesen der Messwerte sind die obersten 8 Bit des ADC völlig
ausreichend, der Rest ist nur Rauschen und Messfehler. Diesen 8-Bit-Wert
kannst du direkt als Index auf die Tabelle nehmen, die somit maximal 256
Werte enthält. Nimmst du 5V als Referenzspannung für den ADC, genügen
auch schon 150 oder 160 Werte, da der Spannungswert 3V nicht wesentlich
überschreitet.

In die Tabelle schreibst du die jeweiligen Distanzen in mm. Dafür
sollten 8 Bits pro Wert reichen. Der Messbereich geht dann bis 255mm.
Wenn du bis 300mm messen möchtest (die Genauigkeit wird aber mit
größerer Distanz rapide schlechter), kannst du auch von allen
Distanzwerten 45mm subtrahieren, da die ersten paar cm sowieso
uninteressant sind.

Die Tabelle belegt also etwa 160 Bytes und das Auslesen des Distanzwerts
erfolgt sehr schnell. Mit der obigen Formel brauchst du (je nachdem, wie
geschickt du im Programmieren bist) wahrscheinlich ähnlich viel
Speicher, die Berechnung dauert aber deutlich länger, allein schon wegen
der Division.

von Sensorius (Gast)


Lesenswert?

Hallo

danke für die Antworten.

Die Look-Up Tabelle wäre eine Möglichkeit aber bei Zwischenergebnissen 
macht das dann wieder Probleme.

Deshalb hätte ich lieber eine Formel nach der ich das berechnen kann.

@yalu

Wie bist du auf diese Formel gekommen. Mit einer Mathe-Software?

Float belegt ja bei uC recht viel Speicher. Sollte man das lieber 
weglassen oder kann man es ruhig verwenden?

von Realist (Gast)


Lesenswert?

"Die Look-Up Tabelle wäre eine Möglichkeit aber bei Zwischenergebnissen
macht das dann wieder Probleme."

Nein, das macht keine Probleme, denn so genau ist der Sensor sowieso 
nicht, z.B. abhängig von der Oberfläche des reflektierenden Objektes. 
Ich würde, wenn ich das ausbaue, eine Umschaltmöglichkeit für 
verschiedene Oberflächenmerkmale geben, oder gleich eine Teachfunktion 
einbauen.

von Realist (Gast)


Lesenswert?

"Float belegt ja bei uC recht viel Speicher. Sollte man das lieber
weglassen oder kann man es ruhig verwenden?"

Also ich würde hier Festpunktarithmetik verwenden. Einfach mit 
brauchbarem Faktor skalieren und die Gleichung so auswerten, dass kein 
zu großer Genauigkeitsverlust entsteht.

von yalu (Gast)


Lesenswert?

Sensorius schrieb:
> Wie bist du auf diese Formel gekommen. Mit einer Mathe-Software?

Durch Nachdenken, Gnuplot und Probieren ;-)

Vlad Tepesch schrieb:
> wobei die nächste Seite gibt ja einen richtig guten Tip, wie du es mit
> einer Linearen approximation hinbekommst

In diesem Diagramm ist auf der x-Achse statt der Distanz deren Kehrwert
aufgetragen. Dadurch wird die Kurve fast linear. Die Ausgangsspannung
ist also näherungsweise umgekehrt proportional zur Distanz.

Zu dieser Erkenntnis kommt man auch, wenn man sich die Funktionsweise
des Sensors vor Augen hält: Der ausgesandte Lichtstrahl wird an einem
Objekt reflektiert und gelangt unter einem distanzabhängigen Winkel zum
Empfänger, der gegenüber dem Sender seitlich versetzt ist und aus einer
Linse und einem PSD (Position Sensitive Device) besteht. Mit etwas
Strahlensatz kann man die Position ausrechnen, an der der Strahl auf das
PSD trifft. Diese Position y ist bei geeigneter Wahl des Nullpunkts

  y = f·b/d

wobei f die Brennweite (bzw. der Abstand der Linse zum PSD), b der seit-
liche Abstand vom Empfänger zum Sender und d die Distanz zum Objekt ist.
Wenn man annimmt, dass die Auswerteelektronik eine zu y proportionale
Ausgangsspannung mit dem Proportionalitätsfaktor c liefert, ist

  U = c·f·b/d,  also  U ~ 1/d

Fasst man c·f·b zur Konstanten P, ergibt sich

  U = P/d

Für P=12 (das ist in etwa die Steigung der (Fast-)Gerade im zweiten
Diagramm) erhält man eine Kurve, die der im ersten Diagramm schon recht
nahe kommt, allerdings ist sie etwas zu stark gekrümmt.

Typischerweise haben solche Messsysteme sowohl einen Eingangs- als auch
einen Ausgangsoffset (d0 bzw. U0), der zur jeweiligen Größe addiert
werden muss, also:

  U+U0 = P/(d+d0)  =>  U = P/(d+d0)-U0

Jetzt müssen nur noch die drei Parameter P, d0 und U0 bestimmt werden.
Man könnte dies tun, in dem man die Messwerte aus dem Diagramm abliest
und nach der Methode der kleinsten Quadrate das Optimum der Parameter
bestimmt.

Dafür (vor allem für das Ablesen der Messwrte) war ich aber zu faul und
habe deswegen die Parameter nach Augenmaß geschätzt. Dazu habe ich die
Kurve für verschiedene Werte mit Gnuplot geplottet und das Ergebnis
jeweils mit dem Original verglichen.

Zuerst habe ich für d0=U0=0 den Parameter P beginnend mit dem Wert 12 so
lange erhöht, bis die Krümmung der Kurve gut gepasst hat, was bei P=15
schließlich der Fall war. Danach war die Kurve allerdings ein Stück in
d- und U-Richtung verschoben. Jetzt kommen d0 und U0 ins Spiel: Das sind
nämlich gerade die Verschiebungsparameter, mit denen die gesamte Kurve
ohne Änderung ihres Krümmungsverlaufs an eine beliebige Position im
Koordinatensystem gelegt werden kann. Die passenden Werte sind d0=1.5
und U0=0.05.

Am Schluss habe ich das Gnuplot-Diagramm auf die gleiche Größe wie das
Diagramm im Datenblatt skaliert, einen Screenshot gemacht, den weißen
Hintergrund durch eine transparente Fläche ersetzt und dem Diagramm im
Datenblatt überlagert. Fertig :)


Realist schrieb:
> "Die Look-Up Tabelle wäre eine Möglichkeit aber bei Zwischenergebnissen
> macht das dann wieder Probleme."
>
> Nein, das macht keine Probleme, denn so genau ist der Sensor sowieso
> nicht, z.B. abhängig von der Oberfläche des reflektierenden Objektes.

Vollste Zustimmung!

Diese Sensoren sind Schätzeisen, dafür kosten sie auch fast nichts.
Deswegen habe ich oben vorgeschlagen, eine Tabelle mit 8-Bit-Index zu
nehmen, so dass man ohne viel zu rechnen den Distanzwert direkt mit dem
ADC-Wert als Index auslesen kann. Die relativ grobe Auflösung bei dieser
Methode ist immer noch deutlich besser als die Messgenauigkeit des
Sensors.

von Sensorius (Gast)


Lesenswert?

>Deswegen habe ich oben vorgeschlagen, eine Tabelle mit 8-Bit-Index zu
>nehmen,

Mit einer Excel-Tabelle könnte und deiner Formel könnte ich sehr einfach 
die 256 Werte berechnen.

Aber wie würdest es programmieren?

255 If-else Zweige?

Die Festpunktarithemitk ist so eine Sache.

Ich muss ja rechnen 2,25*8bit/256

Wenn der Wert 1 ist bräuchte ich Faktor 1000 damit ein gescheiter Wert 
rauskommt wenn ich durch 256 dividiere.

Jedoch wenn der Wert 255 ist kommt 570.000. Da bräuchte ich auch 20 bit.

von Sensorius (Gast)


Lesenswert?

@yalu

Könnte es sein dass die Formel nicht

d = 15/(U+0.05)-1.5

sondern

d = 15/(U+0.05)-2.5

ist.

von Sensorius (Gast)


Lesenswert?

Die Formel stimmt schon, war mein Fehler.

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
Noch kein Account? Hier anmelden.