mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sensorkennlinie


Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zwölf Mal Acht (hacky)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht um den Bereich >4cm.

Autor: Feierabend (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die de_utsche ma_schinenfabrik hat noch betriebsferien.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die de_utsche ma_schinenfabrik hat noch betriebsferien.

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

Autor: Feierabend (Gast)
Datum:

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

Autor: Volker Zabe (vza)
Datum:

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

Autor: Feierabend (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahh, muß es selbst eingeben...

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie steh ich auf dem Schlauch.

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

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: yalu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Realist (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Realist (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sensorius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Formel stimmt schon, war mein Fehler.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.