- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 15

Thema: Abfrage Ultraschallsensor HC-SR04 unter BASCOM

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    An der Zeitmessung stören mich verschiedene Dinge. Vor allem, daß im Hauptprogramm immer alles gemacht wird bzw stockt und auf die ISR gewartet wird, die wiederum die ganze Pulslänge lang wartet.

    Hab mir also zunächst mal ein Datenblatt zum SRF04 gesucht. Es gibt viele davon und es lohnt sich mehrere anzuschauen. Ich hab mir das hier ausgesucht: http://www.roboter-teile.de/datasheets/srf04.pdf
    Falls es nicht zu Deinem Sensor paßt, verlinke bitte das passende.

    Aus dem Datenblatt entnehme ich:
    -daß der Sensor einen maximalen Meßbereich von 3cm bis 300cm haben soll
    -daß der Triggerimpuls mindestens 10µs und nicht länger als 200µs lang sein soll
    -daß die Länge des Impulses vom Echo Output Pin proportional zur Enfernung ist
    -daß die Länge des Impulses von 100µs bis 18ms reichen kann.
    -daß die Länge des Impulses, wenn kein Objekt erkannt wurde, ungefähr 36ms ist
    -die Formel zum Umrechnen der Zeit in Entfernung - mit Erklärung.

    Du möchtest recht genau messen. Was bedeutet das für Dich?

    Für mich ist 1mm Auflösung schon sehr genau. Was bedeutet das in Impulslänge?
    Nach der Formel im Datenblatt: s = 344m/s * ti / 2 bedeutet 1mm Abstand eine Impulslänge von:
    ti = s / 344m/s * 2
    ti = (1mm / 344000mm/s) * 2 = 0,000005814s

    also etwa 5,814µs, heißt, wenn ich eine Auflösung bei der Zeitmessung von 5µs habe, kann ich theoretisch Abstände mit einer Genauigkeit von weniger als 1mm messen.

    Heißt auch, daß nach Beginn des Sendens des Triggerimpulses bei 3cm Abstand das Echosignal frühestens nach
    (1000000µs / 344000mm) * 2 * 30mm = 174,4µs erwartet werden kann.

    Du nimmst den Timer1 für die Zeitmessung. Wär auch meine Wahl, nur der Prescaler von 1 gefällt mir jetzt nicht.

    Mit den 16Bit des Timers kann man von 0 bis 65536 zählen. Die Impulslänge kann von 100µs bis 18000µs (36000µs) reichen.
    Das schreit ja fast danach, den Timer so einzustellen, daß ein Schritt um 1µs bedeutet. Geht bei 8MHz Systemtakt auch noch prima.

    Prescaler auf 8. Timer läuft mit 1Mhz. 1 / 1000000Hz = 0,000001s = 1µs. Ein Timerschritt also genau 1µs.
    Auflösung: s = 344m/s * 1µs / 2 = 0,172mm (noch genauer als ich wollen würde )

    Das macht das Programm einfacher und man braucht sich nicht mit den Timerüberläufen zu quälen

    Der Programmablauf in Anlehnung an Dein Konzept könnte dann so aussehen:
    Das Programm mißt ständig. Für Meßintervalle könnte man 4.1.2 gesondert behandeln.
    Eine Einheit des Meßwertes (Timerstep) entspricht 0,172mm bei 8MHz Systemtakt und Timer1 mit Prescaler = 8
    Es wird nicht in der ISR gewartet bis der Echoimpuls vorbei ist, sondern die ISR zweimal für eine Messung aufgerufen.
    Sichern des Messergebnisses findet in der ISR statt und nur wenn eins vorhanden ist (Messung beendet), in der Hauptschleife berechnet und ausgegeben.
    Das Ergebnis der allerersten Messung ist unsicher, da man nicht weis, ob Timer1 schon durch die steigende Flanke des Echosignals initialisiert war.
    Ohne Gewähr und Logikfehler nicht ausgeschlossen Bild hier  

    1. Initialisierung
    -Header, Variablen, Timer, Interrupt, usw.
    -INT0 mit STATE=CHANGE
    2. Hauptschleife Anfang
    3. Messung Starten Flag = JA ? Abfrage
    3.1. JA
    3.1.1. 15µs Triggerimpuls senden
    3.1.2. Messung Starten Flag auf NEIN setzten
    3.1.3. Messung Beendet Flag auf NEIN setzten
    4. Messung beendet = JA ? Abfrage
    4.1. JA
    4.1.1. PRINT Meßergebnis (hier die Sicherung aus der ISR berechnen bzw direkt ausgeben)
    4.1.2. Messung Starten Flag auf JA setzten
    5. Hauptschleife Ende

    1. INT0 Isr
    2. Ist Triggerimpulspin = high?
    2.1. Ja
    2.1.1. Timer1=0
    2.2. NEIN (dann muß der Pin low sein)
    2.2.1. Meßergebnis=Timer1 (Meßergebnis sichern)
    2.2.2. Messung Beendet Flag auf JA
    3. RETURN (INT0 Isr Ende)

    Bin gespannt wie es hinhaut. Mit der Formel sollte es doch kein Problem sein, die Anzeige in cm zu machen? Wahrscheinlich muß man noch Kalibrieren, weil die Schallgeschwindigkeit von der Temperatur abhängig ist, auch Toleranzen des SRF04 und Sonstiges.

    Gruß
    Searcher
    Geändert von Searcher (14.11.2012 um 06:18 Uhr) Grund: Luftdruckabhängigkeit der Schallgeschwindigkeit gelöscht
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #2
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    19.05.2012
    Ort
    Sigmaringen
    Beiträge
    169
    Also... der Sensor ist ein anderer... nicht der srf04 sondern der hc-sr04 http://kt-elektronic.de/wawi11/artik...hreibung_3.pdf

    Was mir dabei etwas sorgen macht ist, das er auf dem Echo pin erstmal ein 40khz Signal sendet, bevor er dauernd auf High bleibt bis zum empfang des Echo.
    Denke daher wird es nicht richtig sein den Interrupt über Change laufen zu lassen.
    Möglich, das der während dem Burst Signal schon den wechsel erkennt und garnicht erst bis zum eigentlichen Echo kommt.

    Aber was den Ablauf des Programms betrifft hast schon recht.
    Ist an sich schon blöd die ganze Wartezeit in der ISR zu hängen. Das blockiert das Programm komplett.

    Überlegung von mir...

    ---Hauptprogramm--
    xxxx
    Subroutine (wenn messwert gebraucht wird)
    print ergebniss
    ---Subroutine------
    do
    if Echopin = 0 then
    Triggersignal = 0
    waitus 15
    Triggersignal = 1
    else
    waitus 15
    endif
    loop until echopin = 0
    timer1 start
    ---ISR(Falling)--------------
    timer1 stop
    Ergebniss= timer1
    Return


    Bin nur gerade etwas beschaftigt und noch nicht dazu gekommen das zu testen.
    Geändert von JoeM1978 (13.11.2012 um 20:08 Uhr)

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Zitat Zitat von JoeM1978 Beitrag anzeigen
    Also... der Sensor ist ein anderer... nicht der srf04 sondern der hc-sr04 http://kt-elektronic.de/wawi11/artik...hreibung_3.pdf
    Das ist ziemlich egal, die sind vom Aufbau und Verwendung praktisch identisch.

    Zitat Zitat von JoeM1978 Beitrag anzeigen
    Was mir dabei etwas sorgen macht ist, das er auf dem Echo pin erstmal ein 40khz Signal sendet, bevor er dauernd auf High bleibt bis zum empfang des Echo.
    Tut er nicht, siehe folgende Grafik
    Klicke auf die Grafik für eine größere Ansicht

Name:	Ultra-Sonic-seq.JPG
Hits:	23
Größe:	38,3 KB
ID:	23723

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo JoeM1978,
    auch in Deinem letzten Ablauf muß das Hauptprogramm bzw Subroutine warten. Dort gibt es zB "loop until echopin = 0". Ein Taktzyklus ist bei 8Mhz Systemtakt 125ns lang. In der Zeit, in der der Prozessor zB 1ms wartet (und es kann ja auch noch viel länger sein), könnte er mehr als 4000 Maschinenbefehle ausführen (bei ca 2 Zyklen für einen Maschinenbefehl). Wenn das Programm mit anderen Funktionen erweitert wird, wird es also vermutlich hakeln, vor allem wenn da noch andere zeitkritische Aufgaben zu erledigen sind.

    Hab mir das Datenblatt angesehen. Chypsylon hat schon geschrieben, daß Du da keine Sorgen haben brauchst. Außerdem kannst Du ja beides ausprobieren.

    Der Sensor ist ja im Prinzip recht einfach. Man schickt auf der Triggerleitung ein Signal hin und erwartet auf der Echoleitung einen Impuls, dessen Länge man dann mißt.
    Das sind getrennte Leitungen. Auf dieser Echo-Leitung ist immer nur das Echo Signal vom hc-sr04 zu sehen. Das soll man nicht verwechseln mit dem Ultraschallecho, das zurückkommt, wenn der Sensor den 40kHz Ton gesendet hat. Das Ultraschallecho vearbeitet der Sensor und gibt daraufhin auf der Echoleitung den Gleichspannungsimpuls raus. Im Oszillogramm im Datenblatt unter "Single Shot Modus" gut zu sehen. Mit 40kHz hat man nichts zu tun. Das bearbeitet der hc-sr04 allein.

    Meinen Pseudocode kannst Du also trotzdem verwenden, gilt auch für den HC-SR04.

    Edit: Hab Dir Code angehangen, wie ich es mir bisher gedacht hatte. Nur probekompiliert, nicht getestet. Das "waitms 20" versuchen wir im nächsten Schritt wegzukriegen, wenn Du Dich für diese Variante entscheidest. Kann man auch über Timer machen.

    Mit welchem Takt läuft der Mega8 tatsächlich?
    In Deinem ersten Posting ist $crystal = 3686400 . Im zweiten ist $crystal = 8000000

    Gruß
    Searcher
    Angehängte Dateien Angehängte Dateien
    Geändert von Searcher (14.11.2012 um 11:04 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Hier nochmal ein Auschnitt aus einer Arbeit von mir, wo die Pegel der Pins beschrieben werden:
    Klicke auf die Grafik für eine größere Ansicht

Name:	31.jpg
Hits:	51
Größe:	27,6 KB
ID:	23728

    Oben siehst du auch die Formel zur Berechnung der tatsächlichen Entfernung.

  6. #6
    RN-Premium User Fleißiges Mitglied
    Registriert seit
    19.05.2012
    Ort
    Sigmaringen
    Beiträge
    169
    So... da ich dann gestern abend in der Wanne den kopf nicht frei bekommen hab
    bin ich noch dazu gekommen den Programmansatz von Searcher umzuwandeln in ein Laufendes Programm.

    Sieht jetzt so aus:
    Code:
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'Programmname:    Sensorabfrage.bas
    'Letzte Änderung: 13.11.2012
    'Funktion:        Abfrage des Ultraschallsensor hc-sr04
    '                 und Ausgabe über "Print"
    'Mikrocontroller: Mega8
    '
    'Input:           D2 - Echosignal
    '
    'Output:          C0 - Triggersignal
    '
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'Den Atmega mit den passenden Daten füttern.
    '-------------------------------------------------------------------------------
    $regfile = "m8def.dat"                                      'eingesetzter Mikrocontroller
    $crystal = 8000000                                          'eingestellte Taktfrequenz (8MHz)
    $hwstack = 100                                              'Standardwert
    $swstack = 100                                              'Standardwert
    $framesize = 100                                            'Standardwert
    '-------------------------------------------------------------------------------
    'Ports/Pins konfigurieren.
    '-------------------------------------------------------------------------------
    Config Portc.0 = Output                                     ' Trigger-Signal zum Sensor
    Config Pind.2 = Input                                       ' Echo-Signal vom Sensor
    
    '-------------------------------------------------------------------------------
    'Timer/OCR/PWM/INT usw. setzen
    '-------------------------------------------------------------------------------
    Config Timer1 = Timer , Prescale = 8                        ' ergibt 1.000.000 ticks/sekunde
    Config Int0 = Change                                        ' Interrupt bei wechselnder Flanke am Echosignal starten
    On Int0 Echowechsel                                         '
    Enable Int0                                                 ' Wenn auf Echo gewartet wird wechselt Echo-Signal auf High
    Enable Interrupts                                           '
    
    '-------------------------------------------------------------------------------
    'Variablen
    '-------------------------------------------------------------------------------
    Dim Messungstarten As Bit                                   ' Zeigt an, ob Messung gestartet werden soll
    Messungstarten = 1
    Dim Messergebniss As Long                                   ' Ergebniss der Messung in us
    Messergebniss = 0
    Dim Messungbeendet As Bit                                   ' Zeigt an, ob Messung beendet ist
    Messungbeendet = 0
    Dim Entfernung As Long                                      ' Entfernung in mm
    Entfernung = 0
    Dim Kalibrierwert As Integer                                ' Zum genauen einstellen
    Kalibrierwert = 0
    
    '-------------------------------------------------------------------------------
    'Hauptprogramm
    '-------------------------------------------------------------------------------
    Do
       If Messungstarten = 1 Then                               ' Abfrage, ob Messung gestartet werden soll
       Waitms 20
       Portc.0 = 1                                              ' Impuls von 10us an Triggerport senden
       Waitus 10
       Portc.0 = 0
       Messungbeendet = 0
       Messungstarten = 0
       End If
    
       If Messungbeendet = 1 Then                               ' Berechnung des Ergebniss, wenn Messung beendet ist
       Entfernung = Messergebniss + Kalibrierwert
       Entfernung = Entfernung * 172
       Entfernung = Entfernung / 1000                           ' Ergebniss in mm
    
       Print Entfernung                                         ' Ausgabe des Ergebniss
       Waitms 300                                               ' Pause zwischen Messungen (bessere lesbarkeit)
    
       Messungstarten = 1                                       ' neue Messung starten
       End If
    
    
    Loop
    
    End
    
    '-------------------------------------------------------------------------------
    'Interrupt
    '-------------------------------------------------------------------------------
    
    Echowechsel:                                                ' Interrupt startet bei Signalwechsel am Echopin
       If Pind.2 = 1 Then                                       ' Wenn Pin zu High wechselt soll Timer1 Zeit zu messen
          Timer1 = 0
          Start Timer1
        Else                                                    ' wenn Pin zu LOW wechselt, messung beendet und Wert in Variable speichern
          Messergebniss = Timer1                                '  Wert in Variable speichern
          Messungbeendet = 1                                    ' Anzeigen, das Messung beendet ist
       End If
    
    Return
    Direkt zum Ergebniss des Timers hab ich noch einen Kalibrierwert gesetzt und der scheint soweit auch schon zu passen.
    Ich hab 2 identische Sensoren hier und beide liefern mir exakt die selben werte.
    Wie es sich bei entfernungen grösser als 1m verhält muss ich noch testen.

    Und ja... der Atmega8 läuft jetzt mit 8MHz... und ich hab auch die fusebits so gestellt.

    Späther soll das ganze mal mit 2-3 Sensoren auf ein Fahr-Chassis kommen.
    Da werd ich vermutlich (um Pins zu sparen) die Sensoren abwechselnd messen lassen.
    Das sollte von der Geschwindigkeit gut ausreichen. Soll ja kein Rennwagen sein.

    Was mir in deinem Code aufgefallen ist:

    Der Timer wird nur auf 0 gesetzt... Startet der automatisch wieder ?
    und die Flags hab ich als normale Variablen gemacht... so kann ich sie schnell ändern und
    im Zweifelsfall mehrere verschiedene Zustände übergeben.

    Vielen Dank für eure Tips und Hilfestellung.

    Gruss,... JoeM
    Geändert von JoeM1978 (14.11.2012 um 19:35 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hi JoeM,
    Der Timer wird nur auf 0 gesetzt... Startet der automatisch wieder ?
    Der Timer wird mit "Config Timer", genauer mit der Angabe von Prescaler gestartet. Ich lasse den einfach immer durchlaufen und stoppe den nicht. Nur wenn die Messung beginnt, muß er natürlich initialisiert werden, weil man in dem Augenblick nicht weis, wo er gerade ist. Wenn dann die fallende Flanke kommt, wird einfach der augenblickliche Wert gesichert. Timer kann ruhig weiterlaufen. Um den auf 0 zu setzten muß er nicht stehen.

    Bei dem Sensor habe ich noch Unklarheiten. In dem von Dir verlinkten Datenblatt steht, daß wenn kein Objekt erkannt wurde, der Echoimpuls 200ms lang sein würde, man aber schon nach 20ms eine neue Messung starten kann. In anderen Datenblättern zum hc-sr04 findet man die Angabe von 38ms.
    Wie verhält er sich tatsächlich?

    Außerdem ist mir nicht klar, warum man nur 50 Messungen pro Sekunde machen können soll. Plausibler erscheint mir da, daß man nach Ende des Echoimpulses noch ca. 10µs warten soll, bevor man eine neue Messung starten kann.

    Also vor dem "perfekten" Programm sind noch ein paar Fragen zu klären. Zunächst aber erstmal überhaupt was sinnvolles, reproduzierbares messen. Falls Du was hast, poste mal ein paar Werte mit den dazugehörenden, per Zentimetermaß gemessenen Entfernungen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Ultraschallsensor selbst bauen (Bascom)
    Von Janigut im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 26.04.2011, 15:58
  2. Ultraschallsensor HC-SR04 Probleme ungenauigkeit
    Von anfaenger201 im Forum Sensoren / Sensorik
    Antworten: 4
    Letzter Beitrag: 04.08.2010, 14:06
  3. pin abfrage mit bascom
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 05.09.2008, 12:59
  4. UART Sendepuffer-Abfrage mit Bascom
    Von Heideltrudel im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 03.08.2007, 21:12
  5. wav out mit PWM unter bascom?
    Von sebastian.heyn im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 18
    Letzter Beitrag: 10.06.2005, 09:02

Stichworte

Berechtigungen

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

12V Akku bauen