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

[XMEGA][QDEC] Jak poprawnie skonfigurować enkoder inkrementalny?

pawel1730 02 Cze 2019 19:13 702 11
REKLAMA
  • #1 17992945
    pawel1730
    Poziom 15  
    Chciałem skonfigurować enkoder inkrementalny z użyciem QDEC na Xmega jednak coś jest nie tak.

    1. Czy czegoś brakuje?
    2. Ile teoretycznie można maksymalnie skonfigurować enkoderów (2 sygnały/enkoder) w Xmega128A4U ?

    Obecny kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 17996103
    percol
    Poziom 12  
    Xmega serii A i AU mają 3 enkodery na pokładzie, można je użyć jednocześnie - praktycznie, z tym że każdy enkoder wymaga osobnego timera (nieistotne jest czy typu TC0 czy TC1 itd).

    Co do programu, timer musi być odpowiednio skonfigurowany i włączony. Dlaczego konfigurujesz jedynie rejestr TC0.CTRLD?

    W konfiguracji portów dodaj: "| PORT_OPC_PULLUP_gc" jeśli używasz enkodera z microswitch-ami.

    A to już zupełna bzdura!
    " EVSYS.CH0MUX = EVSYS_CHMUX_PORTA_PIN0_gc;"
    powinno być: " EVSYS.CH0MUX = EVSYS_CHMUX_PORTD_PIN0_gc;"

    Dodaj koniecznie linię:
    "TCD0_CTRLA=TC_CLKSEL_DIV1_gc"

    Możesz też ustawić odpowiedni TOP licznika: (ilość linii enkodera - 1), chociaż jeśli nie używasz indeksu to nie masz takiego obowiązku.

    Działa? ;-)
  • REKLAMA
  • #3 18008840
    pawel1730
    Poziom 15  
    Dzięki za podpowiedź, działa taka wersja, czasem potrafi zgubić kroki ale działa w miarę dobrze:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Natomiast jeśli chcę użyć CH1 to nie działa(potrzebuję do 2 enkodera):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #4 18009207
    tmf
    VIP Zasłużony dla elektroda
    Przeczytaj notę - do enkodera potrzeba dwóch kanałów EVSys, przy czym pierwszy musi być parzysty. W nocie masz szczegółową procedurę:
    Kod: Text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 18009460
    pawel1730
    Poziom 15  
    Nie jestem pewien czy dobrze Cię zrozumiałem ale skoro potrzebuje 2 EVSys nie zabardzo rozumiem jak to może działać skoro konfiguruję tylko 1 EVS. Używam tylko 2 pinów oraz krok 6 jest opcjonalny dla QINDX, którego nie mam więc z tej noty rozumiem, że wystarcza tylko 1 kanał?

    Natomiast jestem w stanie użyć EVSYS.CH2 zamiast EVSYS.CH1 i wygląda, że działa. Czy to miałeś na myśli?

    Czy da się jakoś poprawić detekcję kroków poza ustawieniem maksymalnej ilości EVSYS_DIGFILT_8SAMPLES oraz takiego podłączenia wyjścia z enkoderów:

    [XMEGA][QDEC] Jak poprawnie skonfigurować enkoder inkrementalny?
  • REKLAMA
  • #6 18009662
    tmf
    VIP Zasłużony dla elektroda
    pawel1730 napisał:
    Natomiast jestem w stanie użyć EVSYS.CH2 zamiast EVSYS.CH1 i wygląda, że działa. Czy to miałeś na myśli?

    Nie czytasz dokumentacji. Wybierasz nr kanału n, drugi kanał to będzie automatycznie n+1, n musi być parzyste - 0, 2, 4 itd.
    pawel1730 napisał:
    Czy da się jakoś poprawić detekcję kroków poza ustawieniem maksymalnej ilości EVSYS_DIGFILT_8SAMPLES oraz takiego podłączenia wyjścia z enkoderów:

    Tak, wywalić te dziwne filtry. Przy enkoderze zasadniczo żaden filtr nie jest potrzebny. Przeanalizuj co się stanie jak będą ew. drgania na linii A lub B i jaki to ma wpływ na odczytany stan enkodera - w skrócie żaden.
  • #7 18009825
    pawel1730
    Poziom 15  
    tmf napisał:
    Przeanalizuj co się stanie jak będą ew. drgania na linii A lub B i jaki to ma wpływ na odczytany stan enkodera - w skrócie żaden.

    Połączyłem bezpośrednio enkoder do uC i po kilku obrotach lewo/prawo pozycja "0" a fizyczne "0" różnią się, nie jest to jakaś duża różnica ale, więc chyba muszą mieć wpływ.

    Jaka powinna być wartość dla filtra cyfrowego 1 próbka czy maksymalna ilość 8 ?

    Natomiast pojawiła się następna nieznana rzecz. Gdy timer TCD0 zlicza ze znakiem to już podmiana na TCE0 liczy w zakresie 0-2400 ? Wydaję mi się że je tak samo konfiguruję?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 18010305
    tmf
    VIP Zasłużony dla elektroda
    pawel1730 napisał:
    Połączyłem bezpośrednio enkoder do uC i po kilku obrotach lewo/prawo pozycja "0" a fizyczne "0" różnią się, nie jest to jakaś duża różnica ale, więc chyba muszą mieć wpływ.

    Ciekawe jak to jest możliwe?:) Rozrysuj te sygnały i zastanów się jaka sytuacja mogłaby to spowodować? W twoim przypadku zapewne winowajcą jest użycie wewnętrznego podciągania. Ten "rezystor" ma stosunkowo dużą wartość - kilkadziesiąt kOm, daj np. podciąganie zewnętrzne rzędu 4k7 i problem pewnie zniknie. Kolejna sprawa - jeśli oczekujesz, że pozycja się nie zmieni, to użyj enkodera z indeksem. Zwykłe enkodery służą do tego, aby podać liczbę kroków od ostatniego odczytu. Jeśli zgubią krok, albo licznik się przepełni to pozycja się przesunie, normalne. U ciebie się przesunęła, bo gubisz kroki na skutek zbyt słabego podciągania.
    pawel1730 napisał:
    Natomiast pojawiła się następna nieznana rzecz. Gdy timer TCD0 zlicza ze znakiem to już podmiana na TCE0 liczy w zakresie 0-2400 ?

    A jak ustawiasz to "liczenie ze znakiem"? Timer zlicza impulsy w górę lub w dół. To jak interpretujesz jego licznik to wyłącznie twoja sprawa. BTW, nigdzie nie ustawiasz rejestru PER, zakładasz, że ma domyślną wartość? Zwykle ma 0xFFFF, ale jeśli wcześniej gmerałeś przy timerze to już niekoniecznie. W jaki sposób stwierdzasz, że timer liczy tylko do 2400?
  • #9 18010349
    pawel1730
    Poziom 15  
    Dzięki za odpowiedź.
    tmf napisał:
    W jaki sposób stwierdzasz, że timer liczy tylko do 2400?

    Wysyłam sobie wartość na UART.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i drugi enkoder:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W przypadku TCE0 mam wartości własnie w zakresie 0-2400 natomiast TCD0 chciało mi uzyskać wartości od -3000 do ponad 2500 (zapewne można więcej). Myślisz, że to wina nie ustawionego rejestru PER?

    Możesz podesłać jakiś przykładowy link z takim enkoderem z indeksem?
  • #10 18010669
    tmf
    VIP Zasłużony dla elektroda
    pawel1730 napisał:
    Możesz podesłać jakiś przykładowy link z takim enkoderem z indeksem?

    No, są w darmowych przykładach do książek o XMEGA z mojej stopki :)
    Skoro używasz USB, to sprawdź, czy czasem nie masz wyłączonego taktowania niektórych podsystemów.
    Te wartości ujemne biorą się stąd, że dokonujesz konwersji int. Powinieneś mieć wartości w całym przedziale - od 0 do 0xffff, chyba, że to ograniczysz rejestrem PER.
  • #11 18010695
    pawel1730
    Poziom 15  
    tmf napisał:
    Możesz podesłać jakiś przykładowy link z takim enkoderem z indeksem?


    Miałem raczej na myśli jakieś fizyczne urządzenie, na botland nie mogę takiego znaleźć.
  • #12 18025633
    pawel1730
    Poziom 15  
    Co do różnicy timer'a po kilkudziesięciu testach i analizie kodu okazało się, że była gdzieś ukryta instrukcja TCE0.PER = 2400 teraz oba liczniki działają tak samo ;)
    Masz rację, @tmf, dzięki za pomoc :)


    Odnośnie enkoder to pozbyłem się całkowicie elektroniki i aż jestem zaskoczony jak dobrze działa. @tmf, dzięki za pomoc :)
REKLAMA