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

Ogólne FPGA - Prezentacja danych dot. enkodera obrotowego

piotrva 26 Cze 2013 23:30 2364 6
  • #1 26 Cze 2013 23:30
    piotrva
    Moderator na urlopie...

    Witam serdecznie!


    Zachęcony tematem: https://www.elektroda.pl/rtvforum/viewtopic.php?p=12451267 oraz działaniami z układami FPGA postanowiłem stworzyć driver do mechanicznych enkoderów obrotowych.


    Aktualnie zaimplementowałem już eliminację drgań styków oraz dekodowanie 2 przebiegów z enkodera na bardziej zrozumiałe dla logiki sygnały (mam 2 wersje: albo 2 kanały podające impulsy dla każdego kierunku obrotów, albo 1 kanał informuje o kierunku a drugi o impulsach).
    Teraz została mi do zrobienia wisienka na torcie, czyli udostępnianie danych dla mikrokontrolera po magistrali SPI. Oczywiście sama implementacja SPI jest prosta, ale ciekawy jest problem formy prezentowania danych.


    I tu moje pytanie/a:


    1. Kol. @tmf wspomina o dedykowanych układach: https://www.elektroda.pl/rtvforum/viewtopic.php?p=12451267#12451267 - nie mogę jednak nic konkretnego znaleźć - byłbym wdzięczny za podrzucenie jakichś modeli.


    2. Jaki sposób prezentowania danych byście polecili? Ja wymyśliłem takie opcje:

    a) Enkoder sprzężony z licznikiem up/down, który dodatkowo sygnalizuje swoje przepełnienie oraz jego kierunek (czy podczas zliczania w dół, czy w górę)

    b) enkoder sprzężony z 2 prostymi osobnymi licznikami up i down - procesor odczyta sobie dane, odejmie 2 liczby i gotowe

    c) każdy krok zapisywany jako bit (to rozwiązanie zasobożerne, ale za to dające pełny obraz sekwencji od ostatniego odczytu).

    Oczywiście do każdej opcji dodać można sygnalizację zdarzenia (np. zmiana wartości któregokolwiek licznika) poprzez pin IRQ oraz obowiązkowo reset liczników (albo zawsze przy odczycie, albo za pomocą wysyłanej komendy).



    Z góry dziękuję za każdą doradę i sugestię.

    0 6
  • Arrow Multisolution Day
  • #2 26 Cze 2013 23:46
    kriss68
    Poziom 20  

    Pytanie jak często chcesz czytać dane z FPGA - cyklicznie, co jakiś event czy jak? Dla mnie SPI tutaj to przerost formy nad treścią ;)

    0
  • Arrow Multisolution Day
  • Pomocny post
    #4 27 Cze 2013 10:29
    kriss68
    Poziom 20  

    Według mnie najlepiej było by do procka doprowadzić dwie linie. Program i tak w 99% przypadków musi reagować na każdy przeskok enkodera więc wydaje mi się, że najlepszym rozwiązaniem było by wyprowadzenie sygnału impulsu oraz kierunku. Impulsy podpinamy pod przerwanie zewnętrzne mikroprocesora a w jego obsłudze sprawdzamy wejście odpowiadające za kierunek i podejmujemy wtedy odpowiednią decyzję ;)

    0
  • #5 27 Cze 2013 10:55
    piotrva
    Moderator na urlopie...

    No tak, nawet wtedy mogę jedno wyjście z układu zaprojektować jako IRQ i wtedy w przerwaniu sprawdzać zestaw pozostałych wyjść, z których dla każdego enkodera będzie para impuls+kierunek.

    A idąc w kierunku: minimalizacji ilości pinów i maksymalizacji enkoderów na jednym układzie - można te dane przesyłać za pomocą SPI - wtedy dla 8 enkoderów mamy 2 bajty, których transmisja po IRQ zajmie moment.

    0
  • Pomocny post
    #6 27 Cze 2013 11:09
    kriss68
    Poziom 20  

    Owszem jeśli chcesz mieć więcej enkoderów to bardziej opłacalne będzie SPI. Wtedy FPGA może obsługiwać wszystkie enkodery i przyciski. Można by tak jak mówisz wyprowadzić linię IRQ a statusy przycisków/enkoderów wyprowadzić po SPI jako bity.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Obracanie enkodera w daną stronę ustawia dany bit a zeruje bit komplementarny, dodatkowo odczyt rejestru powodował by zerowanie wszystkich bitów enkoderów. Dzięki temu IRQ masz zgłaszane co event a rejestr "statusu" mówi Ci co się stało, dzięki czyszczeniu rejestru po odczycie kolejny odczyt nie dawał by fałszywych zdarzeń. Musiał byś tylko przemyśleć co zrobić gdy np wystąpią dwa zdarzenia od jednego enkodera zanim procek odczyta rejestr.

    EDIT
    Można też wykorzystać port szeregowy do tego i po każdej zmianie jakiegoś enkodera przesyłać bajt statusu (np numer enkodera i co się z nim stało) wtedy procek musiał by mieć jakieś fifo żeby kolejkować sobie eventy (bo nie przychodziły by wtedy kiedy chce procek tylko asynchronicznie) ale wtedy wystarczyła by jedna linia (jeśli chcesz mieć tylko odczyt) bo nawet IRQ odpada ;)
    Tylko w tej wersji musiał byś też mieć kolejkę fifo w FPGA która trzymała by nowe dane zanim pójdą poprzednie no i dochodzi problem arbitrażu bo co jeśli wystąpią dwa enenty w dokładnie tym samym czasie?

    0
  • #7 27 Cze 2013 20:47
    piotrva
    Moderator na urlopie...

    I zrobiłem jak mi doradziłeś.
    Teraz mamy tak:
    Enkoder -> debouncing -> dekoder kwadraturowy (2 impulsy odpowiadające krokom w każdym z kierunków) -> pamięć impulsów -> zatrzask -> SPI
    I dodatkowo każdy impuls generuje IRQ.
    Procesor teraz przy każdym IRQ odczytuje dane z SPI (tym samym resetując pamięć impulsów) i na podstawie odpowiednich bitów dokonuje odpowiednich operacji.

    0