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

Atmega32 - Pomiar czasu między zboczami narastającymi na ICP1

13 Lis 2013 19:59 2499 12
  • Poziom 10  
    Witam.

    Chciałbym zmierzyć czas pomiędzy dwoma impulsami (stanami wysokimi) występującymi na pinie ICP1. Używam do tego celu timera1 oraz kodu znalezionego w internecie, zmodyfikowanego na własne potrzeby:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Według mnie kod powinien działać poprawnie, lecz na wyświetlaczu LCD odświeżana jest przez cały czas liczba z przedziału 322**-322** (nie widać dwóch ostatnich cyfr ze względu na ciągłe odświeżanie). Według mnie jest coś nie tak z funkcją "pomiar gotowy", ponieważ, gdy w pętli głównej programu ustawię "if (pomiar_gotowy==0)", wyświetlacz przez cały czas jest pusty. Proszę o pomoc w poprawieniu kodu tak, abym mógł odczytywać na wyświetlaczu czas pomiędzy dwoma impulsami.
  • Poziom 10  
    Usunąłem linie

    Kod: c
    Zaloguj się, aby zobaczyć kod


    które są u mnie zbędne, więc zamiast

    Kod: c
    Zaloguj się, aby zobaczyć kod


    mam

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Usunąłem także zmienne "czas_jednego_obrotu" oraz "obrotow_na_sekunde", gdyż nie są potrzebne w moim projekcie. Myślę, że program powinien teraz działać poprawnie, lecz jest tak jak opisałem to dwa posty wyżej. Czy ktoś może mnie naprowadzić dlaczego program nie działa prawidłowo oraz skąd biorą się takie wartości na wyświetlaczu? Kiedy wyświetlam ilość przepełnień na wyświetlaczu widzę, że działa to poprawnie, gdyż liczba przepełnień cały czas rośnie.
  • Poziom 14  
    Nie:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    a:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    potem zamiast itoa(); użyj ultoa();

    Pozdrawiam.
  • Poziom 10  
    Faktycznie, mój błąd. Postanowiłem jeszcze raz napisać kod od początku:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pod port PD6 mam podpięty kontaktron (teraz w fazie testów microswitch). Jedna nóżka jest podpięta do portu PD6, druga do masy. Dodałem do kodu również linię:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli chodzi o kod, to zamieniając linię

    Kod: c
    Zaloguj się, aby zobaczyć kod


    na

    Kod: c
    Zaloguj się, aby zobaczyć kod


    na wyświetlaczu mam ciągle 0, czyli do zmiennej czas1 nie zapisuje mi się aktualny czas wystąpienia impulsu zapisany w ICR1. Gdy podmienię zmienną na czas2, podczas wystąpienia impulsu wartość zostaje wyświetlona na wyświetlaczu. Co może być nie tak w tym przypadku?
  • Poziom 17  
    Witam. Ja jak budowałem obrotomierz do swojego auta to też miałem problem z liczeniem czasu między impulsami. Po prostu za dużo zakłóceń było co kontroler traktował jako impuls. Zastosowałem przerzutnik monostabilny (74HC123) i obrotomierz działa już ponad dwa lata.

    Do czego służy twój projekt?
  • Poziom 10  
    Docelowo ma mierzyć prędkość wiatru. Kontaktron mam już zabudowany w wirniku i zaklejony tak więc na nim chciałbym oprzeć ten projekt.

    Postanowiłem wykonać taki test:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i obie wartości (wynik oraz tym) pokazują to samo na wyświetlaczu - czyli "czas2". Widać, że działanie nie wykonuje się. Co zrobić w tej sytuacji?

    Prawdopodobnie funkcję:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    należy zmienić na:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    tak, aby cykl==1 ustawił się dopiero po złapaniu czasu, czy dobrze myślę?
  • Poziom 17  
    Nie bawiłem się z kontaktronami ale nie ma tam tak czasem zjawiska drgania styków?

    Jeśli występuje to musisz je wyeliminować programowo lub sprzętowo. Sprzętowo to możesz zastosować wspomniany przeze mnie wcześniej multiwibrator monostabilny 74hc123. Jeśli go nie wyeliminujesz to będzie Ci kontroler cuda zliczać.
  • Moderator Mikrokontrolery Projektowanie
    johnny99 wskazał Ci główny problem: http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html
    marrrtyn napisał:
    Docelowo ma mierzyć prędkość wiatru. Kontaktron mam już zabudowany w wirniku i zaklejony tak więc na nim chciałbym oprzeć ten projekt.

    Z jaką prędkością maksymalną obracać się będzie wirnik?
    Od tego wiele zależy.
  • Poziom 17  
    marrrtyn napisał:

    Kontaktron mam już zabudowany w wirniku i zaklejony tak więc na nim chciałbym oprzeć ten projekt.

    Mimo to rozważ użycie czujnika Halla (np. TLE4906L, SL353) zamiast kontaktronu.
  • Poziom 10  
    Dziękuję za wszystkie porady, udało mi się już wszystko zrobić. Kontaktron działa jak należy, ustawiłem dość duży prescaler, więc drgania styków nie są wyłapywane przez mikrokontroler (przy małym prescalerze faktycznie dało się zauważyć drgania styków). Pozdrawiam
  • Specjalista - Mikrokontrolery
    Ja tylko dodam dwie uwagi:

    1. Oczywiście można każde dwie linie kodu (np. te, które ignorowałyby drgania styków) zastąpić przerzutnikiem czy uniwibratorem. Idąc w tym kierunku można wyrzucić mikrokontroler, wstawić kilkadziesiąt układów logicznych i mamy to samo, bez kłopotów z programowaniem. Pozostaje tylko kwestia sensowności takiego rozwiązania - jeśli już mamy uC, to lepiej dopisać te 2 linie.

    2. Pokazany kod nie działa poprawnie, gdy odstęp pomiędzy impulsami przekracza 65000. Programowe zliczanie przepełnień timera zawsze jest obarczone ryzykiem błędu - zgubienia lub nadmiarowego policzenia przepełnień. Należy zagwarantować, że okres obrotu będzie mniejszy od okresu timera, albo przewidzieć dwa tryby pomiarów - dla małych obrotów/zatrzymania i dla większej prędkości.
  • Poziom 10  
    BlueDraco napisał:
    Należy zagwarantować, że okres obrotu będzie mniejszy od okresu timera.


    Dokładnie, w moim przypadku okres obrotu zawsze będzie mniejszy od okresu timera. Dziękuję jeszcze raz za wszystkie odpowiedzi.