Hallo mich würde interessieren wie ihr diese Kennlinie mit einem uC auswerten würdet. http://www.dema.net/pdf/sharp/GP2Y0A41SK0F.pdf MfG
Da scheint nichts zu sein... weshalb nicht einfach die Funktion posten ? Mit einem Polynom wird es machbar sein.
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.
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
wobei die nächste Seite gibt ja einen richtig guten Tip, wie du es mit einer Linearen approximation hinbekommst
>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.
>Die de_utsche ma_schinenfabrik hat noch betriebsferien.
Hat das was zu bedeuten oder sind das noch immer die Folgen von Neujahr.
Irgendwie steh ich auf dem Schlauch. Ich komme nicht auf die Formel wie man die Länge berechnet.
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. ;)
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.
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?
"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.
"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.
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.
>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.
@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.
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.