- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Optische Abstandsmessung mit Atmega8 - wie programmieren ?

  1. #1

    Optische Abstandsmessung mit Atmega8 - wie programmieren ?

    Anzeige

    Powerstation Test
    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 ) 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

    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!!

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    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

  3. #3
    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!

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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.

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Hier habe ich gezeigt, 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.
    Ciao sagt der JoeamBerg

  6. #6
    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!

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    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.
    Ciao sagt der JoeamBerg

  8. #8
    Zitat Zitat von the_Ghost666
    ... 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.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143

    Eine Tabelle erstellen

    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.

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686

    Re: Eine Tabelle erstellen

    Zitat Zitat von Mitch64
    ... 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.

    Zitat Zitat von Mitch64
    ... 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.

    Zitat Zitat von Mitch64
    ... Ablesefehler des Spannungs-Entfernungs-Diagramms ...
    Hihihi - Ablesefehler. Wie oben gesagt.
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen