PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Optische Abstandsmessung mit Atmega8 - wie programmieren ?



ichbins86
01.12.2009, 09:04
Hallo zusammen!

Ich bin in der Technikerschule gerade mit noch 3 Anderen in eine Gruppenarbeit eingebunden:
Optische Abstandsmessung mit dem Atmega8.

Ziel dieses Projektes ist es in ein Modellauto (klein & rot :-b ) den Sonsor, ein LCD-Display sowie die Stromversorgung etc einzubauen.
Auf dem Display soll immer der aktuelle Abstand von Heck des Autos bis zur Wand o.Ä. angezeigt werden.

Wir haben folgenden Sonsor zur Verfügung: http://www.conrad.de/goto.php?artikel=185364
Natürlich ist der nicht ideal, weil die Spannungsveränderung nicht linear ist, aber von den Ultraschallsensoren hat keiner (auch nicht die Lehrer) Ahnung 8-[

Bascom und Programmierung mit Mikrokontrollern ist für mich noch neu, aber ich habe schon einige ganz kleine Programme geschrieben und gebrannt.
Hardware ist auch vorhanden (myAVR - mySmartUSB mit rowalt-Testumgebung).

Habt Ihr einen Tipp für mich, wie ich diese Abfrage des Spannungswertes über den AD-Wandler des AT8 im Display dargestellt bekomme ?
Macht es Sinn mit If/Else-Befehlen zu arbeiten um dann alle "5cm" eine Veränderung zu sehen, oder geht es auch mit stetiger Abfrage ?

Vielen vielen Dank für jede Hilfe!! O:)

021aet04
01.12.2009, 10:18
Du ließt die Spannung am Eingang einund bekommst einen Wert von 0-255 (8bit) oder 0-1023 (10bit). Diesen Wert kannst du dann weiterverarbeiten. Das Diagramm sieht aus wie eine e-Funktion. Damit wird es vermutlich sehr genau. Mit If Befehlen würde ich in diesem Fall nicht arbeiten. Der Code wird viel zu lang und zu ungenau. Ein Mittelweg zwischen der e-Funktion (viel Rechenleistung nötig, sehr genau) und der If Variante (relativ schnell, viel Code) ist, wenn du mit einem Array arbeitest.

MfG Hannes

ichbins86
01.12.2009, 10:44
Ok, danke erstmal für die schnelle Antwort!

Generell verstehe ich dein Vorhaben, aber wo definiere ich dass z.B. der Spannungsendwert des Sensors dann 255 ist ?

Hast du vielleicht ein Beispiel wie ein Array aufegbaut ist und welche Variabeln man dort nehmen kann? Finde jetzt auf die Schnelle leider nichts passendes.

Danke!

the_Ghost666
01.12.2009, 12:48
Was du mit Definieren meinst, machst du mit einer Kalibrierkurve. Einfach ein Objekt in bekannter Entfernung vor den Sensor halten und den Wert auslesen, das mit einer ganzen Reihe von Werten über den kompletten Messbereich machen.
Daraus kannst du dann entweder eine Funktion bauen, die halt mit mathematischen Formeln arbeitet, oder einer Tabelle, die die richtige Entfernung einem ADC Wert zuordnet.
Die erste Variante geht z.B. mit dem GCC Compiler einfach, da man auch komplexe Geschichten wie Multiplikation, Division und E-Funktionen über Bibliotheken machen kann. Nachteil ist, dass diese Routinen lange brauchen und auch etwas Speicherplatz benötigen. Variante 2 mit der Tabelle geht extrem schnell, verbraucht aber soviele Bytes Speicher, wie die Anzahl der Stufen x der Größe der Variable ist. Dh bei 10Bit und Float-Werten, die 4Byte belegen, müssen 4096 Byte also 4 KB nur für die Tabelle im RAM oder Flash frei sein. Das ist bei nem Mega8 ja schon fast nicht möglich, wenn da noch was anderes passieren soll. Externer Speicher wäre noch ne Lösung, aber verlangsamt die Geschichte etwas. Ich favourisiere die Variante mit der Formel, vor allem weil man auch die E-Funktion durch eine Potenzreihe höherer Ordnung gut annähern kann.
Wenn du deine Tabelle an Messwerten hast, Spannung über Weg im kompletten Messbereich mit genug Werten, z.B. 50-100, kannst du es in z.B. Excel als Grafik anzeigen lassen. Dann erstellst du ne Funktion mit der Form "a*x³ + b*x² + c*x + d" und variierst solange a,bc und d, bis eine schöne Näherung dieser Kurve an die aufgenommene Kurve entsteht.
Durch die Verwendung von einfachen Potenzen von X geht das mit integer Werten und der ALU vom Atmega8 sehr schnell.

oberallgeier
01.12.2009, 13:20
Hier habe ich gezeigt, (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=384168&sid=1e76af3c0d628bf076777c5153a038d5#384168) wie Messwerte von einem Sharp GP2D120 ausgewertet werden können. Die Regression ist recht simpel - das kommt der Geschwindigkeit beim Umrechnen (in meinen zeitempfindlichen Projekten) entgegen. Source in C (eigentlich Cäh) und Messergebnisse sind gleich dabei.

ichbins86
02.12.2009, 13:18
Ok, das mit der E-Funktion werde ich die Tage mal testen - komme vorher leider nicht dazu.
Hört sich interessant an, aber alles sehr gut nach zu vollziehen ;-)

Danke für die Infos!

oberallgeier
02.12.2009, 19:05
E-Funktion? Wo ist die denn her *grübelgrübelgrübel* ? Wie ist die hereingekommen? Bei meinen Sharp-Messungen ist es jedenfalls keine E-Funktion, auch wenn die Kurve abschnittsweise entfernt ähnlich aussieht. Ist aber auch im verlinkten Posting deutlich anders ausgedrückt.

ichbins86
03.12.2009, 07:04
... Die erste Variante geht z.B. mit dem GCC Compiler einfach, da man auch komplexe Geschichten wie Multiplikation, Division und E-Funktionen über Bibliotheken machen kann...
...Ich favourisiere die Variante mit der Formel, vor allem weil man auch die E-Funktion durch eine Potenzreihe höherer Ordnung gut annähern kann...

Da ich ja noch gar keine Ahnung habe, wie ich das programmiere wäre es schön zu wissen, ob es noch eine andere Lösung gibt ?!
Sicher werde ich die Formel hinbekommen, aber dass der Wert auch recht genau ist muss ich dann sehen.

Mitch64
03.12.2009, 18:50
Hi,

der Sensor ist nicht linear, das ist richtig. Aber im Datenblatt ist eine Kurve abgebildet mit den Spannungswerten und den dazugehörigen Entfernungen.

Mach einfach eine Tabelle in Form von Data-Zeilen. Die Spannung vom Sensor wird ja gemessen vom ADC-Converter. Dann schaust du in der Tabelle nach zwischen welchen Tabellen-Werten der gemessene Wert liegt. Zwischenwerte können interpoliert werden (Stichwort Steigung).

Je genauer und feiner du die Tabelle machst, desto genauer mißt das Teil.

Aber gewisse Mess-Ungenauigkeiten werden dennoch bleiben. Da sind Messfehler, Ablesefehler des Spannungs-Entfernungs-Diagramms, Toleranzen des Bauteils usw.

Aber es soll ja keine cm-genaue Messung erfolgen, oder?

Mitch.

oberallgeier
03.12.2009, 23:16
... Je genauer und feiner du die Tabelle machst, desto genauer mißt das Teil.
Aber gewisse Mess-Ungenauigkeiten ... bleiben ... Messfehler, Ablesefehler des Spannungs-Entfernungs-Diagramms, Toleranzen des Bauteils usw. ...Na ja, so kann man sich geschickt aus der Affäre ziehen. Das schlichte " usw." ist der Knackpunkt - der eben nicht erklärt wurde. Je nach der Steigung der Sensorkurve U=U(x) steht für das gleiche dU ein z.T. dramatisch unterschiedliches dx. ALSO ist die Berechnung nicht wegen Messungenauigkeiten fehlerhaft, sondern wegen dieses Kurvenverlaufes zusammen mit der maximal 10bittigen Auflösung des ADC. Das mag polemisch klingen, ist aber eine wesentliche Eigenschaft des Systems. Und bevor DEIN Controller eine solche Tabelle auswertet hat und vielleicht noch interpolieren muss, ist meiner mit der Berechnung schon längst fertig, weil er so rechnet, wie ich das oben erwähnt habe. Ganz deutlich: das Ergebnis konvergiert NICHT mit der Feinheit der Tabelle.


... Aber im Datenblatt ist eine Kurve abgebildet mit den Spannungswerten und den dazugehörigen Entfernungen ...Stimmt - und fährst Du mit den Testbedingungen nach denen das Datenblatt entstanden ist? Das glaub ich jedenfalls nicht. Ich habe meine Kalibrierung in meinem System unter Laufbedingungen gemacht - und kann im interessierenden Bereich mit rund 1 mm Genauigkeit messen.


... Ablesefehler des Spannungs-Entfernungs-Diagramms ...Hihihi - Ablesefehler. Wie oben gesagt.

guenter1604
04.12.2009, 08:32
Hallo miteinander,

Technikerschule:

Aufgabe 1:
Schließe den Sensor an 5V an und Oszilloskopiere den Ausgang und die Versorgungsspannung, verbessere mit RC LC-Gliedern den Störabstand und dokumentiere.

Aufgabe 2:
Ermittle mit Voltmeter, Meterstab die Kennlinie des Sensors und dokumentiere!

Aufgabe 3:
Dann tragen die angehenden Techniker Werte aus einer genäherten Formel (errechnet oder im Versuch ermittelt) in das Diagramm ein und veröffentlichen das Ergebnis hier im Forum!

Zusatzaufgabe:
In welchem Bereich sind genaue Messwerte zu bekommen, warum in anderen Bereichen nicht?

Günter

guenter1604
04.12.2009, 12:41
http://acroname.com/robotics/info/articles/irlinear/irlinear.html