Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Pomiar prędkości Auta RC Atmega8 Bascom

seba.kacz 04 Jan 2009 19:52 5145 27
Optex
  • #1
    seba.kacz
    Level 10  
    Witam po długim poszukiwaniu w sieci natknąłem sie na taki układzik do pomiaru prędkości pocisku. Pierwsza myśl była żeby go przerobić do potrzeb modelarskich, przeróbka Hardware nie ma problemu.
    ale przy programowaniu bym potrzebowałem pomocy.
    Mam tylko fragment kodu w bascom który powinien mierzyć czas pomiędzy dwoma fototranzystorami na porcie d2 i 3 Przelatującego pocisku przez bramkę IR.
    -w jakiej jednostce (s ms. ns ) jest wyświetlony na lcd (zmienna A)
    -jak to napisać żeby LCD pokazywał km/h (odległość pomiędzy fototranzystorami 10cm.
    Za odpowiedzi z góry dziękuje.
    a tu kod w bas>
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    Set Portd.2
    Set Portd.3
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Timer0 = Timer , Prescale = 1
    Config Int0 = Falling
    Config Int1 = Falling

    Dim Zm1 As Long
    Dim A As Single
    Dim B As Integer
    Dim C As Single

    On Timer0 Dodaj
    On Int0 Poczatek
    On Int1 Koniec

    Const St_czasowa = 0.000001
    Enable Interrupts
    Enable Int0
    Enable Int1
    Enable Timer0
    Do
    Cls
    Loop

    Poczatek:
    Zm1 = 0
    Return

    Koniec:
    A = Zm1 * St_czasowa
    B = 256 - Counter0
    C = B * St_czasowa
    A = A + C
    Cls
    Wait 2
    Lcd "* CHRONO *"
    Lowerline
    Lcd A
    Wait 10
    Cls
    A = 0
    B = 0
    C = 0
    Zm1 = 0
    Return
    Dodaj:
    Zm1 = Zm1 + 32
    Return
    End


    Przeniosłem z Programowanie Ogólne - krzychoocpp
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • Optex
  • #2
    wader_669
    Level 28  
    podaj zrodlo chetnie bym to zobaczyl na zdjeciach. Na twoim miejscu bym zrobil to troche inaczej i od poczatku napisal kod. Pytanie jeszcze czy to co mierzy ta predkosc jest na ziemi czy zamontowane w samochodzie.
    Jak bedzie zamontowane na samochodze to najlepiej zastosowac jakis enkoder, jak na ziemi to jakies bramki
  • #3
    seba.kacz
    Level 10  
    Sorry zapomniałem link:
    http://e-tawerna.pl/viewtopic.php?t=2099&postdays=0&postorder=asc&start=0
    Dzięki za szybka odpowiedź.
    Urządzenie stoi na ziemi
    Mój plan był taki żeby zamiast diod IR użyć dwie diody laserowe do przejazdu autem potrzeba mi min. 1m miejsca pomiędzy urządzeniem nadawczym a odbiorczym . .
    Pod podanym linkiem znajdziecie schemat i oryginalny wsad do urządzenia w pełnej wersji.
  • Optex
  • #4
    wader_669
    Level 28  
    no wlasnie chcialem ci zapodac pomysl z laserami. Najlepiej zrob to na komparatorze tylko musisz go dobrze ustawic zeby nic innego nie zaklucalo.

    Zaraz postaram ci sie napisac jakis kod. Tylko napisz w jakim odstepie beda te bramki, jaki rezonator chcesz uzyc i jaki procesor?
  • #5
    seba.kacz
    Level 10  
    Odstęp pomiędzy bramkami będzie 10 cm ale w kodzie można to zawsze zmienić albo ?
  • #6
    wader_669
    Level 28  
    nie daje glowy ze kod dziala. Mozliwe ze jest duzo bledow.
    Nigdy nie bawilem sie z star i stop timer1 wiec to moze byc zle.
    Poza tym nie wiemcz czy obliczenia nie beda sprawialy problemow i dekleracja zmiennych.

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Set Portb.1
    Set Portb.2
    Set Portb.3

    Bramka_start Alias Portb.1
    Bramka_stop Alias Portb.2
    Przycisk Alias Portb.3

    Config Lcd = 16 * 2                                         'tutaj ustaw lcd
    Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0       ' tutaj ustaw jak chcesz

    Config Timer1 = Timer , Prescale = 256

    On Timer1 Czas

    Dim Sekundy As Byte , Minuty As Byte , Godziny As Single , Godziny1 As Single , Godziny2 As Single
    Dim Predkosc As Single

    Const Droga = 0.0001                                        'jak chcesz zmienic droge to tutaj, jest podana w km

    Enable Interrupts
    Enable Timer1

    Counter1 = 34286
    Stop Timer1

    Cls
    Do
    If Bramka_start = 0 Then Start Timer1

    If Bramka_stop = 0 Then
    Stop Timer1

    Godziny1 = Sekundy * 0.02
    Godziny2 = Minuty * 2.78
    Godziny = Godziny1 + Godziny2

    Predkosc = Droga / Godziny

    Lcd Sekundy
    Lowerline
    Lcd "predkosc: " ; predkosc
    End If

    If Przycisk = 0 Then
    Sekundy = 0
    Minuty = 0
    End If



    Loop
    End

    Czas:

    Counter1 = Counter1 + 34286
    Incr Sekundy

    If Sekundy = 60 Then
       Sekundy = 0

       Incr Minuty

       If Minuty = 60 Then
          Minuty = 0
       End If
    End If

    Return
  • #7
    seba.kacz
    Level 10  
    Ok Dzięki będę na dniach testował. Napisze puzniej co z tego wyszło.
  • #8
    wader_669
    Level 28  
    wszystko wiesz jak podlaczyc ? musisz miec zewnetrzny kwarc 8mhz nie zapomnij przestawic fusebitow.

    Jak bede mial czas to tez sprawdze czy dziala, bo mam duze watpliwosci moze ktorys z kolegos mnie poprawi jak sa bledy.

    Tak poza tym temat bym przeniosl to do dzialu robotyka. Wydaje mi sie ze bardziej jest z tym zwiazane. Chociaz wystarczy teraz kod napisac jak wszystko wiesz jak podlaczcy
  • #10
    wader_669
    Level 28  
    nie, schemat masz prawie caly zle

    poczytaj datasheeta 7805 (bo masz zle kondensatory. Jeden byl spolarayzowany a drugi nie, jak sie nie mysle) i atmega8 jakie kondensatory dobrac do zew. kwarca.
    Zmien 10mhz na 8mhz przeciez pisalem!!!!
    Co to jest za rezystor przy wlaczniku. tam nic nie ma. Wewnetrznie jest pociagany.
    Dlaczego areff i avcc sa podlaczone i dlaczego polaczone?
    Zle masz kontrast podlaczony przy lcd, Vee do potencjometra a rw do masy.

    Jeszcze nie masz komparatora dodanego.
    Tu masz schemat:
    http://www.kmitl.ac.th/~kswichit/LFrobot/LFrobot.htm
    (nawet masz przyklad ze stabilizatorem 7805)
    Masz taki sam schemat jak w tym przykladzie tylko wywalasz diody ir.



    Jeszcze dodaj jeden kondensator filtrujacy jak najblizej zasilania procka 100nF w sumie kazdego uklady wiec komparatora tez
  • #11
    seba.kacz
    Level 10  
    czemu zle
    ------
    Mówiłem że szybki schemacik. Wartości były najpierw mało ważne ale poprawiłem. Możesz jeszcze raz zerknąć. Pod tym samym Linkiem
  • #12
    wader_669
    Level 28  
    bo tak. Poczytaj troche wiecej postow na elektrodzie.

    p.s. zmienilem wczesniejszy post
  • #13
    snow
    Level 29  
    Można robić pomiar w aucie i przekazywać przez jakiś moduł do jednostki stacjonarnej. Wtedy prędkość łatwiej chyba zmierzyć - np przez pomiar napięcia podawanego na silniki napędowy (w przypadku auta elektrycznego) - jedynie trzebaby prędkość wyskalować sobie jakoś. Można spróbować wykorzystać sobie do tego celu akcelerometr. Transmisja radiowa i wtedy nie trzeba za wiele kombinować ;) Chociaż może w praktyce będzie więcej roboty z tym - no ale zabawa w programowanie i elektronikę gwarantowana :)
  • #14
    wader_669
    Level 28  
    tez bym jakos to rozwiazal jak snow mowi (jeszcze mozna za pomoca gpsa zrobic :D , ale to chyba przy wiekszych pojazdach. Chyba gps nie jest tak dokladny). No ale jak kolega ma problem z programowanie i narysowaniem konkretnego schematu to nie ma mowy o akceleromierzach i transmisji radiowej.
    Juz latwiejsze jest uzyc jakiegos enkodera i dokladniejsze niz mierzenie napiecia na silniczku, jednak ciekawe rozwiazanie ale moim zdaniem malo dokladne.
  • #15
    snow
    Level 29  
    To można na wał napędowy - o ile ten jest dostępny dać magnesik i zrobić a'la licznik rowerowy :) obwód koła, znamy, średnicę wału silnika to mamy później już samą matematykę i prędkość gotowa :) Pare wzorków przekształcić. Myślę że to będzie dokładniejsze niż pomiary laserami modelu jadącego z 70km/h (spalinowe podobno tyle wyciągają) to będzie trudno żeby się w niego wcelować :) Pomiar powinien być raczej dokonywany na obiekcie którego prędkość chce się znać a jakoś pośrednio.
  • #16
    seba.kacz
    Level 10  
    Mówiłem że szybki schemacik. Wartości były najpierw mało ważne ale poprawiłem. Możesz jeszcze raz zerknąć. Pod tym samym Linkiem.

    Dodano po 21 [minuty]:

    To co proponujecie. Auto ma silnik spalinowy 3 konie, w skali 1:8 3,5kg jechał ze starym silnikiem 74km/h(raz było mierzone radarem), teraz ma silnik 3 konny większa zębatkę na sprzęgle, czyli powinien powyżej 80 kmh jechać.
    Może macie jakieś inne pomysły.
  • #17
    snow
    Level 29  
    Najprościej zmierzyć czas przejazdu między dwoma punktami o znanej odległości między nimi.
  • #18
    wader_669
    Level 28  
    hahhahaa ale bajer ja tez chce taki samochodzik!!!

    w takim razie polecam ci akceleromierze, ale dla ciebie najlatwiej by bylo zrobic te bramki, przynajmniej podstaw sie nauczysz. Pozniej mozesz robic projekty bardziej zawansowane.

    Teraz schemat powinien tobie dzialac (z tego co widze, bo ostrosc sie zmniejszyla). Jednak lepiej dolacz do pinu rw z lcd "-". Dodaj jeszcze ten kondensator filtrujacy 100nF pomiedzy vcc a gnd, jak najblizej procesora.
    Chyba to wszystko
  • #19
    seba.kacz
    Level 10  
    wader_669>OK i bede testował

    snow >
    I właśnie to chciałem robić przy pomocy urządzenia które próbujemy z kolega wader_669 tu sklepać. W orginalnym projekcie tego urządzenia z tego co czytałem na tamtym forum (mój 1 post) jest bardzo dokładne
  • #20
    wader_669
    Level 28  
    le kurde. Moze do lepszego dzialania mierzenia czasu mozna podlaczyc wyjscia od komparatora do przerwan (czyli do pinad.2 i pinad.3)
  • #22
    wader_669
    Level 28  
    moze podlacz wyjscia od komparatora do pinad.2 i pinad.3 (napewno to nie zaszkodzi) . Tak jak pisalem polepszy to dokladnosc mierzenia czasu.
  • #23
    snow
    Level 29  
    Przerwania rzeczywiście są lepszym pomysłem. Ustaw na zbocze opadające albo narastające w zależności jaki sygnał masz gdy nie ma żadnego obiektu w barierze. Jeżeli coś wjedzie w bariere to wygeneruje zbocze i ty na to zbocze powinieneś się wyzwolić - jeżeli normalnym stanem pracy jest stan wysoki na INT0 to wyzwalasz opadającym jak stan niski to narastającym.

    wader_669 -> co to są pinad.2 i pinad.3? ;)
  • #24
    wader_669
    Level 28  
    no pin 1 i 2 portu d :D sorry ze tak glupio napisalem. Co do tego zbocza masz racje ale nie wiem czy to bedzie dzialac przy przyciskach albo wyjsciu z komparatora itp. od niedawna sie tym zajmuje i nie wiem tego. Jednak cos czytalem ze ludzie tak to rozumieja podobnie jak ty ale chyba nie maja racji bys musial poczytac.

    p.s. jeszcze dla pewnosci podlacz 100nF do komparatora podobnie jak w atmega8
  • #25
    seba.kacz
    Level 10  
    Witam wreszcie znalazłem chwile czasu. czyli ma podleczyć START i STOP po portd.1 i portd.2 i kod zmienić ->
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    Set Portd.1
    Set Portd.2
    Set Portd.3

    Bramka_start Alias Portd.1
    Bramka_stop Alias Portd.2
    Przycisk Alias Portd.3

  • #26
    snow
    Level 29  
    Musisz to na przerwaniach zrobić. Jak w bascomie się przerwania obsługuje to w Helpie powinno być opisane
  • #27
    emarcus
    Level 38  
    seba.kacz wrote:
    Witam wreszcie znalazłem chwile czasu. czyli ma podleczyć START i STOP po portd.1 i portd.2 i kod zmienić ->
    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000

    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    Set Portd.1
    Set Portd.2
    Set Portd.3

    Bramka_start Alias Portd.1
    Bramka_stop Alias Portd.2
    Przycisk Alias Portd.3



    Nie bardzo widze potrzebe komplikowania tak prostego projektu!

    Nie trzeba wcale uzywac czegos takiego jak 'Start', 'Stop' - do niczego to nie jest potrzebne w procesie pomiaru predkosci poruszajacego sie objektu.

    Przycisk tez do niczego nie sluzy, - program sam sie wyzeruje i bedzie gotowy do pomiaru.

    Jest to program na doslownie kilka linii w Bascomie.

    Jedynie co potrzeba to skonfigurowanie timera 1 (albo 0 ?); oraz Int0 i Int1.
    Z taktowania uC i prescalera oraz odleglosci pomiedzy punktami kontrolnymi (odleglosc pomiedzy twoimi fotosensorami, cokolwiek), wyliczysz staly wspolczynnik do kalkulacji predkosci objektu (powiedzmy A). Tu kalkuluj wszystko w odniesieniu do jednostek w jakich ma byc wynik, czyli kilometry i godziny.

    Skonfigurowany w programie timer (nie wazne ktory), biegnie nieskonczene od chwili wlaczena ukladu i liczy impulsy (twoja zmienna N) - w tej czesci programu nikomu nie przeszkadza ze wystapi OVF i wyzerowanie.
    Na Int0 (sensor #1) zerujesz timer(X) czli N=0, a na Int1 (sensor drugi) odczytasz wartosc timera(X) (N impulsow)i daj to do rachunku do obliczenia predkosci.

    V = A/N
    Wyslij to do LCD: - najprosciej
    ...
    Cls
    Lcd "V= " ; v ; "km/h"

    return
    End

    Praktycznie w tym momencie, twoj uklad jest gotowy do nastepnego pomiaru pomimo ze na display w dalszym ciagu jest 'stary' wynik.
    \
    Do tego projektu wystarczy ci jakikolwiek Atmel aby mial dostateczna ilosc linii I/O (z powodzeniem wystarczy ATtiny 2313).
    - 6 linii portu B do display i 2 linie portu D na interrupty.
    Przy dokladnosci jaka tobie potrzebna (w zaokragleniu do liczb calkowitych) nawet nie musisz stosowac zew. rezonatora kwarcowego - wystarczy wew. RC -1 MHz).
    Uwaga: Nalezy dolozyc uwagi na wybor prescalera aby miescic sie bezpiecznie w przedziale mierzonej wartosci V i nie dopuscic do przepelnienia licznika (OVF).
    Jezeli potrzebujesz wyswietlic wynik z miejscami 'po przecinku' wtedy uzyjesz funkcji 'format' i/albo zwiazanej z tym "fusing" -szczegoly w Bascom-HELP.\

    Glowny program to:
    -------------------------
    do

    loop
    -------------------------
    czyli processor nie robi nic!!! (pusta petla)


    emarcus
  • #28
    matrix0606
    Level 15  
    słuchajcie panowie, ja coś popełniłem w BASCOM8051. nie napisałem jeszcze żadnego programu którego działanie sprawdziłem w praktyce, bo nie mam programatora. wszystko tylko symulowane programowo.
    chciałem zrobić COŚ TAKIEGO. jest to coś w rodzaju hamowni, tylko u mnie służyło by tylko do pomiau prędkości modelu. na jedenj z rolek byłoby koło z otworem i przez ten otwór przekazywane byłyby impulsy podawane na P3.0.
    teraz soft. jest to tylko liczenie impulsów i zamiana ich na km/h po uprzednim uwzględnieniu obwodu koła. bez deklaracji wszystkich potrzebnych zmiennych itp. chodziło mi tylko o test czy to liczy impulsy podawane na P3.0 jak potrzeba. trzeba dodać zerowanie zmiennej PRED co sekundę. w teorii mogło by działać. co o tym sądzicie?
    oto soft:
    Code:

    Config Lcd = 16 * 2
    declare sub ustawienia
    dim d as byte                                                 'przejechana droga
    dim v as single                                               'predkosc modelu
    dim o as byte                                                 'obwod kola modelu
    dim pred as string * 10                                       'definicja pomocnicza
    Deflcdchar 0 , 14 , 4 , 4 , 4 , 4 , 4 , 2 , 32                ' litera l
    Deflcdchar 1 , 2 , 4 , 14 , 17 , 17 , 17 , 14 , 32            ' literka o
    reset d
    o = 200

    call ustawienia

    do
       if p3.0 = 0 then                                           'impuls z czujnika
       set p3.0
       incr d                                                     'zwieksz droge przejechana
       v = o * d                                                  'predkosc modelu rc
       v = v * 3.6
       v = v / 1000                                               'predkosc pojazdu zamienia z m/s na km/h
       cls
       pred = fusing(v , #.#)                                     'ograniczam wyswietlanie do dwoch miejsc po przecinku
       lcd pred ; "km/h"                                          'wyswietlam predkosc pojazdu w km/h
       reset v
       end if

         if p3.1 = 0 then                                         'po nacisnieciu p3.1 wchodze do menu ustawien
         set p3.1
         call ustawienia
         end if

    loop

    sub ustawienia
    stop TIMER0
    disable TIMER0
    disable INTERRUPTS

    cls
    lcd "Podaj obw"
    lcd chr(1)
    lcd "d ko"
    lcd chr(0)
    lcd "a"                                                       'w gornej lini wyswietlam napis
    lowerline
          lcd o ; "mm"                                            'w dolnej warosc obwodu klola w mm
       do
        if p3.2 = 0 then                                          'jak nacisne p3.2 to
        set p3.2                                                  'zwiekszam wartosc obwodu kola
        incr o                                                    'i wyswietlam ja
        locate 2 , 1
        lcd o ; "mm"
        end if
         if p3.3 = 0 then                                         'a jak nacisne p3.3 to
         set p3.3                                                 'zmniejszam wartosc obwodu kola
         decr o
         locate 2 , 1
          lcd o ; "mm"                                            'i wyswietlam to
         end if                                                   'jak nacisne p3.4 to
          if p3.4 = 0 then                                        'wychodze z menu ustawien
          set p3.4
          cls
          exit do
          end if
       loop
       v = 0
      lcd v ; "km/h"                                              'wyswietlam wartosc predkosci
      end sub