logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

wicy 27 Lip 2009 20:34 4314 6
REKLAMA
  • #1 6828132
    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.
    
    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ą.
    
    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?
  • REKLAMA
  • #2 6828366
    Pittt
    Poziom 32  
    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.
  • REKLAMA
  • #3 6828434
    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
    
    DEBOUNCE pinx.y, 0, przerwanie, sub
    

    powinno zadziałać chyba dokładnie tak jak
    
    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)??
  • REKLAMA
  • #4 6828592
    Pittt
    Poziom 32  
    Może - korzystając z INT - znajdź czas dla prędkości maksymalnej. A wszystko co jest krótszej niż ignoruj.
  • REKLAMA
  • #5 6828731
    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:
    
    do
       if flaga then
          if timer1>2000
             tu robi obliczenia i wyswietla predkosc
    ...
    loop
    
  • Pomocny post
    #6 6828898
    Pittt
    Poziom 32  
    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.
  • #7 6828957
    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.
REKLAMA