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.
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.
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?
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...
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.
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.
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.
>>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.
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.