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.

[ATMega][Bascom] Licznik prędkości

wicy 27 Lip 2009 20:34 3945 6
  • #1 27 Lip 2009 20:34
    wicy
    Poziom 22  

    Postawiłem sobie zadanie opracowania licznika prędkości. Powiedzmy, że do roweru. Konstrukcję i jej sens odłóżmy na razie na bok :)
    Zadanie dla procesora niby banalnie proste - liczyć prędkość przez badanie impulsu na pinie.
    I teraz zaczynają się schody. Mogę to zrobić na kilka sposobów (te które znam):
    1) mierzenie czasu między impulsami
    2) mierzenie liczby impulsów w czasie,
    dodatkowo zmodyfikowane sposobem pomiaru impulsów: Tx, INTx lub zwykły PINx.
    Nie wiem, który sposób jest najlepszy, przy założeniu, że procesor powinien mierzyć prędkość "w tle" (czyli raczej opcja przerwań), podawać wynik (wstępnie na zwykły lcd 16x2) a w międzyczasie kalkulować inne obliczanki jak "rasowy" licznik i jeszcze obsługiwać w trakcie jakieś proste menu nastawcze.
    Jak do tego podejść?
    Wstępnie wybrałem opcję pomiaru czasu między impulsami na przerwaniu INTx z timerem.

    Code:

    Config Int1 = Falling                                'wejscie czujnika
    Config Timer1 = Timer , Prescale = 256
    On Int1 Przerwanie
    On Timer1 Przepelnienie
    Enable Int1
    Enable Timer1
    Enable Interrupts

    Nie mam przyrządu pomiarowego (koła z czujnikiem halla) go generowania jednostajnych przerwań, ale proste zwieranie styku do masy ma chyba 2 wady.
    Po 1, mierzy czas między dwoma impulsami, czyli co drugi obrót koła, po 2, podawane dwa kolejne wyniki strasznie różnią się między sobą.
    Code:

    Przerwanie:
       Toggle Pomiar
       If Pomiar = 1 Then           'jezeli flaga zezwolenia pomiaru ustawiona to
          Timer1 = 0                   'wyzeruj timer1
          Przepelniacz = 0           'flaga przepelnienia licznika
          Start Timer1                                         
       Else                               
          Stop Timer1                 'zatrzymaj timer1
          Disable Int1                 'zablokuj przerwanie zeby sie nie wlaczylo w czasie obliczen
          Flaga_pomiaru = 1       'ustaw flage pomiar dokonany - obliczenia w petli glownej do..loop
      End If
    Return

    Czy w ogóle ta metoda pomiaru ma rację bytu przy w/w założeniach?

    0 6
  • #2 27 Lip 2009 21:25
    Pittt
    Poziom 31  

    Dobry sposób wybrałeś, jest najdokładniejszy liczenie czasu pomiędzy impulsami na wejściu INT. Kontrakton jest bardzo złym źródłem sygnału dla procesora, stąd prawdopodobnie masz zakłócenia.

    0
  • #3 27 Lip 2009 21:37
    wicy
    Poziom 22  

    Zastanawiam się jeszcze, czy przerwania od INTx nie zastąpić sprawdzaniem pinu. Instrukcja DEBOUNCE w sumie ma eliminować drgania zestyków i jeśli będzie odpowiednio skonfigurowany czas Debounca (CONFIG DEBOUNCE) to

    Code:

    DEBOUNCE pinx.y, 0, przerwanie, sub

    powinno zadziałać chyba dokładnie tak jak
    Code:

    On INT1 przerwanie

    Jedyna wada jest taka, że jeśli procesor ma coś wykonać w "międzyczasie", może nie odebrać impulsu :(

    Jest jakaś rada na stabilizację drgań z kontraktony, przełącznika, czy czegokolwiek na wejściu INTx lub Tx? Rezystor podciągający i kondensator do masy (nie wiem, strzelam)??

    0
  • #4 27 Lip 2009 22:07
    Pittt
    Poziom 31  

    Może - korzystając z INT - znajdź czas dla prędkości maksymalnej. A wszystko co jest krótszej niż ignoruj.

    0
  • #5 27 Lip 2009 22:35
    wicy
    Poziom 22  

    Czy dobrze zrozumiałem?
    INT włącza Timer, który dla max prędkości zliczy np. 2000 taktów, więc w pętli głównej gdzie dokonuje obliczeń po ustawieniu flagi (dokonaniu pomiaru) powinien być warunek, żeby program nie obliczał jeśli timer<2000?
    Coś w stylu:

    Code:

    do
       if flaga then
          if timer1>2000
             tu robi obliczenia i wyswietla predkosc
    ...
    loop

    0
  • Pomocny post
    #6 27 Lip 2009 23:04
    Pittt
    Poziom 31  

    Tak. Tylko mniej świadomość że procek będzie odrywany od pracy wieloma nieprzydatnymi impulsami.
    Ewentualnie po pierwszym impulsie na INT, wyłącz przerwania na czas drgań.
    Jak teraz masz podłączony kontrakton ? INT podciągnięty pod +5V ?
    Jak INT wyzwalasz ?
    W docelowym projekcie koniecznie czujnik kontraktonowy zamień na jakiś halotron albo transoptor szczelinowy, czujnik odbiciowy - nadajnik i fototranzystor IR + odbiciowy marker.

    0
  • #7 27 Lip 2009 23:14
    wicy
    Poziom 22  

    Teraz nie mam pod ręką niczego co jednostajnie i stabilnie może dawać sensowne impulsy zdatne do jakichkolwiek testów prędkości.
    Mam impulsator z rolki myszki, ale nie mam za specjalnie czym nim kręcić (w rozsądnych prędkościach).
    Nie wiem jak to jest rozwiązane w oryginalnych licznikach, ale zdaje się, że jest tam zwykły kontaktron i działa.
    Rozwiązań pomiaru jest pewnie bez liku. Jeśli projekt naprawdę się rozwinie zastanowię się nad zastosowaniem zegara RTC, który daje int co 1s i można oprócz podania godziny na licznik zliczać impulsy w czasie i co 1s kalkulować prędkość.
    Będę jeszcze kombinował. Dzięki za zainteresowanie tematem i podpowiedzi.

    0