- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 104

Thema: Ultraschall - Entfernunsmessung mit Ultraschall Interface aus RN

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Zählschleife hätte zumindest den Vorteil, das man da keine Fehler bei einigen Werten bekommt (wenn gerade ein Interrupt dazwischenfunkt). So ganz langsam sollte es selbst mit Bascom nicht werden, zumindest wenn man passende Variablen (WORD) nimmt. Als ein Nachteil ist die Zeit je Schleifendurchgang möglicherweise von der Compilerversion abhängig - lösen läßt sich das wohl nur mit ASM. Zumindest mit etwas ASM für die Schleife wäre das besser als die Lösung mit dem 8 Bit-Timer.

    Bei der einfachen Hardware kann man ohnehin kaum mit einer Genauigkeit von besser als 1 Wellenlänge/Periode rechnen - wenn man besser werden wollte müsste man für ein konstante Amplitude des Echos sorgen oder breitbandigere Transducer nehmen. Das heißt man kommt eigentlich mit 25 µs Zeitauflösung aus. Mit passendem Vorteile könnte dann ggf. auch der 8 Bit timer mit dem Overflowbit (aber ohne Zählen !) auskommen. Das würde bis etwa 2 m reichen. Es gäbe für den 8 Bit Timer noch eine etwas komische Möglichkeit: man macht das Hochzähler (nur 8 Bit Byte!) der Overflows nicht im Interrupt, sonder in einer Schleife per Polling. Den Fall das Overflow und Interrupt dicht zusammen kommen muss man ohnehin extra berücksichtigen.

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Mein Hai-Smile wird bei roboterbastler.de gehostet und da ACU grad an seinem Server rumschraubt können wohl kurzzeitige Ausfälle auftreten:
    https://www.roboternetz.de/community...(ohne-Werbung)

    Eine so geringe Auflösung mit der Zählschleife hätte ich nicht erwartet. Hier mal ein ungetesteter Beispielcode:
    Code:
    'Ultraschall Entfernungsmessung messprogramm
    
    'Test mit Zählschleife
    
    $regfile "M48def.dat"
    $crystal = 1000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    $baud = 2400
    
    Dim Struser As String * 10              ' die Eingabevariable des Users
    Dim Countperiodes As Byte               ' die Perioden des Us bursts werden gezählt
    Dim Entfernung As Word
    
    'portd.3 als ausgang definieren, das ist der Start in Pin
    Config Portd.3 = Output
    Portd.3 = 1
    
    Print "Ultraschall Entfernungsmessung Online"
    Print "(mit Zählschleife)"
    
    Do
       Input Struser                        ' warten bis Eingabe erkannt
       If Struser = "" Then
          Entfernung = 0
    
    '################# den Sendebrust generieren ##########
          Countperiodes = 0
          Do
             Portd.3 = 0                    ' man kommt so genau auf 40khz
             Countperiodes = Countperiodes + 2
    
             Portd.3 = 1
             Countperiodes = Countperiodes - 1
    
          Loop Until Countperiodes > 20
          Portd.3 = 1
    '######################################################
    
          Do                                ' Warten und zählen bis Echo empfangen wird
             Entfernung = Entfernung + 1
          Loop Until Pind.2 = 1
    
          Print Entfernung                  ' Entfernung ausgeben (per UART)
    
          While Pind.2 = 1
          Wend
    
       End If
    Loop
    End
    Ganz schön schlank, oder? :)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Finde den thread auch toll und weil noch ein Programm zur Zeitnahme mit dem ICP fehlt, hab ich mich mal versucht. Ist zwar nicht ganz schlank geworden, enthält aber noch eine alternative Bursterzeugung.

    Gruß
    Searcher


    Code:
    '###################################################
    'File: US-Meßprogramm_ICP.bas
    'IDE: BASCOM-AVR DEMO Version 2.0.5.0
    'Meßprogramm zum Messen von US-Laufzeit mit RN Wiki US-Interface
    'Messung wird erst gestartet, wenn der Burst komplett gesendet wurde
    'Messung wird gestoppt mit Eintreffen des 0 nach 1 Wechsel auf PA7 (ICP)
    '
    'ATtiny24
    'PB2 : Mit Taster den Burst und Messen starten
    'PA7 : (ICP) - Meßpulsempfang vom Interface
    'PA3 : SW UART #2 , 40kHz Burst Ausgang zum Interface
    'PB0 : SW UART #1 , für Ausgabe der Meßwerte an 4 fach 7-Segmentanzeige
    '#######################################################
    
    $regfile = "attiny24.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 36
    $crystal = 8000000                      'interner Oszillator
    
    '##### Definitionen und Initialisierung für 7segment ausgabe ######
    Dim Num_to_disp As Word
    Dim Y As Byte
    Dim Helperbyte As Byte
    Dim Index As Byte
    Dim Disp_string As String * 6
    Dim Digit_char As String * 1
    Declare Sub Display_value(num_to_disp As Word)
    Open "comb.0:115200,8,n,1" For Output As #1       'comb.0 -> TX ist Pin PB0
    Helperbyte = Lookup(17 , Segmentpattern)       'segment g
    For Y = 1 To 5 : Put #1 , Helperbyte : Next       '7 segment initialisieren
    '#### Ende Definitionen und Initialisierung für 7 Segmentausgabe #######
    
    
    Dim Flag_ausgabe_fertig As Byte
    Dim Flag_messung_fertig As Byte
    Dim Inputcapture_wert As Word
    Porta = Porta Or &B11110111             'alle Pullips auf porta einschalten, Ausnahme PA3
    Portb = Portb Or &B11111110             'alle Pullups auf portb einschalten, Ausnahme PB0
    
    Config Timer1 = Timer , Capture Edge = Rising , Prescale = 8       'Timer mit 1Mhz und ICP gestartet (8Mhz Systemclk)
    On Capture1 Isr_zeitnahme               'Bei Input Capture Event zur ISR für Zeitnahme
    Open "coma.3:80000,8,n,1" For Output As #2       'coma.3 -> 40kHz Burst auf PA3 mit SW-UART
    Enable Interrupts
    
    Do                                      'Beginn Hauptprogramm
      Do                                    'Warten auf Tastendruck (PB2 nach GND Wechsel)
        Debounce Pinb.2 , 0 , Start_mit_burst
      Loop
    
    Start_mit_burst:
      Print #2 , "UUUU" ;                   'Burst Erzeugung (Jedes U erzeugt 5 Pulse)
      Flag_ausgabe_fertig = 0
      Flag_messung_fertig = 0
      Timer1 = 0                            'Timerzähler (TCNT1) mit 0 initialisieren, Meßzeit beginnt
      Set Tifr1.icf1                        'Eventuell anstehendes Input Capture Flag löschen
      Enable Capture1                       'Input Capture Interrupt scharf machen
    
      Do                                    'Schleife zum Warten auf Meßende/Ausgabeende
        If Flag_messung_fertig = 1 Then
          Call Display_value(inputcapture_wert)
          Flag_ausgabe_fertig = 1
        End If
      Loop Until Flag_ausgabe_fertig = 1    'Ende Warterei wenn Anzeige des Meßwertes erfolgt ist
    Loop                                    'Loop Hauptprogramm
    
    Isr_zeitnahme:                          'Ansprung bei Input Capture Event an PA7
      Inputcapture_wert = Capture1          'Inputcapture Register sichern
      Flag_messung_fertig = 1               'Indication für Anzeige kann erfolgen
      Disable Capture1                      'Input Capture Interrupts unterbinden
    Return
    
    
    '############ Folgende Zeilen bis zum Ende nur zur Datenausgabe über 7 Segmentanzeige #############
    Sub Display_value(num_to_disp As Word)  'gibt Dezimalzahlen bis 9999 aus
       Disp_string = Str(num_to_disp)
       For Y = Len(disp_string) To 3
          Helperbyte = Lookup(16 , Segmentpattern)
          Put #1 , Helperbyte
       Next
       For Y = 1 To Len(disp_string)
          Digit_char = Mid(disp_string , Y , 1 )
          Index = Val(digit_char)
          Helperbyte = Lookup(index , Segmentpattern)
          Put #1 , Helperbyte
       Next
    End Sub
    
    Segmentpattern:                         'darzustellende Zeichen (hex 0..F...)
    'Segmente abcdefg:                      ' ":" = Doppelpunkt in der Mitte
       Data &B00000011                      'Ziffer "0", 0 = segment ein, 1 = aus
       Data &B10011111                      'Ziffer "1"
       Data &B00100101                      'Ziffer "2"
       Data &B00001101
       Data &B10011001
       Data &B01001001
       Data &B01000001
       Data &B00011111
       Data &B00000001
       Data &B00001001
       Data &B00010001
       Data &B11000001
       Data &B01100011
       Data &B10000101
       Data &B01100001                      'Ziffer "E"
       Data &B01110001                      'Ziffer "F"
       Data &B11111111                      'dunkel
       Data &B11111101                      'nur Segment g eingeschaltet (-)
    
    '########### ENDE  US-Meßprogramm_ICP.bas  ##############################################
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Ultraschall-Interface
    Von e_f1986 im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 06.01.2008, 11:35
  2. Ultraschall Interface Problem
    Von NemesisoD im Forum Sensoren / Sensorik
    Antworten: 1
    Letzter Beitrag: 29.03.2007, 12:26
  3. Ultraschall-Interface will nicht...!
    Von BASTIUniversal im Forum Sensoren / Sensorik
    Antworten: 29
    Letzter Beitrag: 14.09.2006, 18:55
  4. Ultraschall Interface
    Von Eddi1984 im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 11.08.2006, 17:53
  5. Grundlagen Ultraschall Interface mit Analogausgang
    Von Manf im Forum Artikel / Testberichte / Produktvorstellungen /Grundlagen
    Antworten: 0
    Letzter Beitrag: 13.12.2004, 22:50

Berechtigungen

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

Solar Speicher und Akkus Tests