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