Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Czujnik ultradźwiękowy Bascom program

janbernat 11 Paź 2009 11:44 3632 4
  • #1 11 Paź 2009 11:44
    janbernat
    Poziom 38  

    Zrobiłem taki układzik do pomiaru odległości od przeszkody:

    Czujnik ultradźwiękowy Bascom program
    Do tego zaczątek programu:


    Code:
    $regfile = "M8def.dat"
    

    $crystal = 16000000
    'Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5

    Config Portb = Output

    Enable Interrupts
    Ocr2 = 199                                        ' tak daje 40kHz
    Tccr2 = 25                                        'To daje CTC dla T2.Bascom nie chciał się tak ustawić więc dałem mu
                                                       'spokój i ustawiłem ręcznie
    Enable Oc2
    On Oc2 Licz                                       'Nosave

    Dim Paczka As Byte                                'ilość impulsów w paczce/2. Jak jest 1(czyli paczka=2) to dokładność
    Paczka = 0                                        'jest największa. Jak np.10 to czułość wzrasta ale sygnał odbity jest
    'Dim Interwal As Byte                              ' bardziej "rozmazany"
    'Interwal = 0
    Reset Portb.4

    Do

    Loop

    End

    Licz:
    'Incr Interwal
       'If Interwal > 6 Then
          'Interwal = 0
          Incr Paczka
          If Paczka < 4 Then                          'przy tych ustawieniach paczka powinna być parzysta
             Toggle Portb.4
             Elseif Paczka < 250 Then
             Set Portb.4
             Else
             Paczka = 0
          End If

       'End If

    Return



    Nawet działa:D
    Ale:
    Mierzyć mogę tylko do 0.53m-co wynika z prędkości dźwięku, pojemności licznika i generowanej częstotliwości.
    No i nie mam pomysłu jak wykorzystać ten sam licznik dwukrotnie:
    Raz- tak jak jest- do generowania częstotliwości z możliwością zmiany ilości wysyłanych impulsów.
    Dwa- wykorzystać ten sam licznik-bo dla reszty liczników planuję inne zastosowania- do zwiększenia czasu między paczkami impulsów.
    Może ktoś ma jakiś pomysł.

    0 4
  • #2 11 Paź 2009 12:43
    PiotrEtenM500
    Poziom 19  

    Bawię się właśnie "sonarem" kupiłem gotowca bo niewielkie pieniądze Nie ma do niego softu bo nie udostępniają ale jest tam ten sam problem. Sonar oddaje wynik dokładnie i ma 3 tryby pracy.

    tak jak Twoj
    1. 0-0,53m
    i dwa pozostałe
    2. 0,53-5,3m
    3. 5,3-9m (wiecej niz 9m błedy w odczycie odległości)

    zmianę wykonuje programowo i po zmianie resetuje sonar
    wiec jest to chyba jakiś mnożnik czasu programowy zapisywany do EEPROM


    zastanawia mnie tez w jakim celu na Twoim projekcie jest MAX232?
    przy zasilaniu 5V, uzyskasz odpowiednio wysoki poziom sygnału dla AD

    Zastanawiam sie czy nie zrobić modelu na bazie Twojego schematu, może podeślesz PCB i pełny kod, to by mi ułatwiło robotę i być może znalezienie rozwiązania

    0
  • #3 11 Paź 2009 13:13
    janbernat
    Poziom 38  

    Pcb do tego nie mam- zrobione na płytce uniwersalnej.
    MAX służy jako pompa napięciowa +-10V -razem 20Vp-p na nadajnik.
    Nadajnik podobno wytrzymuje 30V- ale to niesprawdzone pogłoski.
    Im większe napięcie- tym silniejszy sygnał.
    "Wzmacniacz" na MAX232 jest chyba najprostszy.
    Pierwotnie miał służyć także do zasilania wzmacniacza- ale za mała wydajność prądowa niestety.
    Zwłaszcza na -.
    Kod jak widać jest "in statu nascendi"-stąd temat.

    0
  • Pomocny post
    #4 12 Paź 2009 23:31
    atom1477
    Poziom 43  

    Może:

    Code:

    Licz:
        If Co_robic = 0 Then                 'Odliczanie przerwy
            Incr Licz_przerwe
            If Licz_przerwe > 1000 then
                Licz_przerwe = 0
                Co_robic = 1
            End If
        Else
            Incr Licz_impulsy
            If Licz_impulsy > 4 Then         'Odliczanie okresu przebiegu (4 - okres = czas 4 przerwań Timera)
                Toggle PortD.4

                Incr Licz_przerwe            'Odliczanie ilości impulsów (10/2 = 5 impuslów)
                If Licz_przerwe > 10 then           
                    Licz_przerwe = 0 
                    Co_robic = 0
                End If

                Licz_impulsy = 0
            End If
        End If
    Return




    W drugiej części programu zmienne Licz_impulsy i Licz_przerwe są zamienione miejscami. W rzeczywistości Licz_impulsy liczy przerwę, a Licz_przerwę liczy impulsy. Zmienne zamieniłem miejscami bo
    Licz_impulsy powinna być typu Byte, a Licz_przerwe typu Integer.

    Impulsów będzie mało, na pewno mniej niż 255 więc nie ma sensu wykorzystywać do tego zmiennej typu Integer.

    1
  • #5 17 Paź 2009 15:23
    janbernat
    Poziom 38  

    Niestety kod "by Atom" nie działa.
    No ale przy mojej znajomości programowania to pewnie nawet nie potrafiłem go dobrze wkleić.
    Ale ponieważ dzisiaj mam od wielu miesięcy pierwszą wolną sobotę to mogłem przy tym posiedzieć.
    I co znalazłem?
    Oczywiście moją bezdenną głupotę.
    Przecież zmienna "paczka" nie musi być rozmiaru 8 bitów.
    Ona tylko liczy przerwania.
    Nie jest ograniczona wielkością licznika T2.
    Tak, że miałem gotową procedurę mieszczącą się w przerwaniu.
    Wystarczyło zmienić rozmiar zmiennej "paczka" z byte na word aby uzyskać większy czas między paczkami impulsów.
    To jest kod obsługujący sprzęt do schematu j.w.

    Code:

    '$sim
    $regfile = "M8def.dat"

    $crystal = 16000000
    'Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5

    Config Portb = Output

    Enable Interrupts
    Ocr2 = 199                                        ' tak daje 40kHz
    Tccr2 = 25                                        'To daje CTC dla T2.Bascom nie chciał się tak ustawić więc dałem mu
                                                       'spokój i ustawiłem ręcznie
    Enable Oc2
    On Oc2 Licz                                       'Nosave

    Dim Paczka As Word                                'ilość impulsów w paczce/2. Jak jest 1(czyli paczka=2) to dokładność
    Paczka = 0                                        'jest największa. Jak np.10 to czułość wzrasta ale sygnał odbity jest
                                                       ' bardziej "rozmazany"

    Reset Portb.4

    Do

    Loop

    End

    Licz:

          Incr Paczka
          If Paczka < 18 Then                         'przy tych ustawieniach paczka powinna być parzysta
             Toggle Portb.4
             Elseif Paczka < 2250 Then
             Set Portb.4
             Else
             Paczka = 0
          End If


    Return

    Teraz trzeba uruchomić komparator i timer1 (16 bit) aby zmierzyć odległość od przeszkody.
    Na razie oscyloskop pokazuje że w pokoju mam mnóstwo przeszkód.

    0