Forum: Mikrocontroller und Digitale Elektronik Sharp Distanzsensor 2Y0A21


von T.S. (Gast)


Lesenswert?

Hi,

ich habe gerade diesen Sensor:

http://sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a21yk_e.pdf

mit meinem Atmega48 im Funktionstest. Es handelt sich um einen 
Distanzsensor mit analogem Ausgang 10-80cm. Die Ausgangsspannung ist 
nicht linear zur gemessenen Distanz, siehe Seite 5.

Nun habe ich diese Site gefunden:

http://www.acroname.com/robotics/info/articles/irlinear/irlinear.html

auf der die Linearisierung sehr schön beschrieben ist und bin mit dieser 
Formel:

R = (6787 / (V - 3)) - 4


siehe weiter unten unter "The Results" auch zum Ziel gelangt, einfacher 
und schneller als erwartet (Betreibe den AD-Conv auch im 10Bit Modus).

Ich würde die Messergebnisse jedoch gern mal in mm sehen.

Für V wird der AD Wandler Wert in 0-1023 Schritten angegeben, und raus 
kommt "R" die Reichweite (range) in cm.

Doch wie bekomme ich das um den Faktor *10 genauso linearisiert. Ein AD 
Wandler Wert von 469 entspricht rund 10cm.

(6787/(469-3))-4= 10,5

Die Formel glänzt auch dadurch dass sie keinen Einsatz von float fordert 
und dennoch sehr gute Ergebnisse liefert.

T.
von Oktavian G. (Firma: Hochschule Karlsruhe) (tavin)


Angehängte Dateien:

Lesenswert?

das war meine Lösung des Problemms
von Tom (Gast)


Lesenswert?

T.S. schrieb:
> Für V wird der AD Wandler Wert in 0-1023 Schritten angegeben, und raus
> kommt "R" die Reichweite (range) in cm.

T.S. schrieb:
> Es handelt sich um einen Distanzsensor mit analogem Ausgang 10-80cm.

Das paßt so überhaupt nicht zusammen. Wenn die Formel stimmt, entspricht 
der Entfernungsbereich Wandlerwerten zwischen 84 und 485.
von Hans (Gast)


Lesenswert?

T.S. schrieb:
> Für V wird der AD Wandler Wert in 0-1023 Schritten angegeben, und raus
> kommt "R" die Reichweite (range) in cm.

Wenn du den Wert in cm hast, dann hast du ihn doch auch in mm. Oder geht 
es dir um die Genauigkeit? Also dass die Formel nur ganze cm ausspuckt?
von T.S. (Gast)


Lesenswert?

Hi,

ich habe die Ausgabe nun in mm:

R = (67870 / (V - 3)) - 40

Leider passen die Entfernungswerte doch nicht ganz, erstelle gerade eine 
Tabelle:

10cm 1,52V 310Ad
20cm 1,17V 239Ad
30cm 0,92V 189Ad
40cm 0,73V 148Ad   ((148/1023)*5V) =0,73V OK

Seltsamerweise passen meine Messwerte nicht zu denen aus dem Datenblatt.

Natürlich gehts um die Genauigkeit.

Gruß,
T.



Ps.: @Tom, warum sollte das nicht paßen->passen, der Ausgangsbereich 
erstreckt sich doch selbst laut Datenblatt nur von 2,3V@10cm bis 
0,4V@80cm...
von T.S. (Gast)


Lesenswert?

verrutscht:

10cm 2,39V 495Ad
20cm 1,52V 310Ad
30cm 1,17V 239Ad
40cm 0,92V 189Ad
50cm 0,73V 148Ad   ((148/1023)*5V) =0,73V OK

@tavin, ist dass ein code mit Kalibrierungsmöglichkeit? Haben die 
Sensoren eine große Streuung?

T.
von Tom (Gast)


Lesenswert?

T.S. schrieb:
> R = (67870 / (V - 3)) - 40
Die Formel ist etwas ungünstig, weil du den 16-Bit Zahlenbereich damit 
verläßt. Bei zeitkritischen Anwendungen würde man das vermeiden.

> Seltsamerweise passen meine Messwerte nicht zu denen aus dem Datenblatt.
Passen die gar nicht oder liegen sie nur etwas daneben? Was sagt die 
Fehlerrechnung?

> Natürlich gehts um die Genauigkeit.
Dann solltest du prüfen, ob die Werte stabil genug sind (Temperatur, 
???) und den Sensor kalibrieren. Umrechnen mußt du mit den zu deinem 
Sensorexemplar passenden Werten.

> Ps.: @Tom, warum sollte das nicht passen, der Ausgangsbereich
> erstreckt sich doch selbst laut Datenblatt nur von 2,3V@10cm bis
> 0,4V@80cm...

Eben. Deshalb hatte ich erwartet, dass die Wandlerwerte im Bereich 84 .. 
485 liegen. 0..1023 kann nicht sein. Sonst kämen da negative 
Entfernungen raus.
von T.S. (Gast)


Lesenswert?

so, ich habe das Problem gefunden, es hängt mit dem Messaufbau zusammen. 
Wenn man eine DIN A4 Seite als Relektionsmaterial nimmt dann passt es 
ziehmlich gut. Man darf den Messkanal nicht zu eng machen.

>>im Bereich 84 .. 485 liegen<<

Mit der 1023 wollte ich unterstreichen dass man das Wandlerergebniss 
direkt in diese Formel übernimmt, es bezog sich auf den Bereich des AD 
Wandlers nicht des Sharp Sensors.

Ich habe nun die Rechenergebnisse der Formel noch mal ermittelt:

10cm 2,35V 485ad
20cm 1,38V 284ad
30cm 0,97V 199ad
40cm 0,76V 157ad
50cm 0,62V 127ad
60cm 0,52V 108ad
70cm 0,45V  94ad
80cm 0,40V  83ad

das passt auch recht gut zur Grafik des Sensors.

T.
von T.S. (Gast)


Lesenswert?

>>Die Formel ist etwas ungünstig, weil du den 16-Bit Zahlenbereich damit
>>verläßt. Bei zeitkritischen Anwendungen würde man das vermeiden.

Ich habe hier gerade mal den AD Wandler Wert in eine Spannung 
umgerechnet:

uint16_t adc_val;

...(adc_val*125)/256...

an der Stelle musste ich natürlich etwas nachhelfen:

...((uint32_t)adc_val*125)/256...

Da es ansonsten bei Zahlen größer (65535/125=>524) probleme gibt, 
logisch.

Aber an der Stelle:

R = (67870 / (V - 3)) - 40

habe ich erstmal keine Sorge. Der Compiler müsste anhand der größe der 
Zahl automatisch eine 32bit Rechnung daraus machen, ich könnte höchstens 
noch einen cast verwenden bei der Zuweisung, oder?

Eine 32bit op macht mir an der Stelle keine Probleme.

T.
von Oktavian G. (Firma: Hochschule Karlsruhe) (tavin)


Lesenswert?

T.S. schrieb:
> @tavin, ist dass ein code mit Kalibrierungsmöglichkeit? Haben die
>
> Sensoren eine große Streuung?

Das wurde noch nicht getestet, aber in dem Endsystem (LEGO 
Mindstorms)sollten verschiedenen Sensortypen vom Scharp, die es da gibt, 
zum Einsatz kommen - 3-30cm, 10-80cm und 15-150cm. Deswegen hab ich das 
konfigurierbar gemacht. Sowie um die Streung zu Testen, allerding das 
ist jetzt die Aufgabe der Studenten die sich bald mit dem Projekt 
befassen werden.
von Tom (Gast)


Lesenswert?

T.S. schrieb:
> ...(adc_val*125)/256...

Wenn das so ausgeführt wird, dürfte dich das ein Bit vom Wandlerergebnis 
kosten.
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.