Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Funkcja do obsługi enkodera z książki Tomasza Francuza

squelch 18 Kwi 2017 20:57 1227 13
  • #1 18 Kwi 2017 20:57
    squelch
    Poziom 11  

    Witam mam problem ze zrozumieniem kodu z książki

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Rozumiem że z tego kodu wynika że zmienna dif jeżeli obracamy w prawo ma wartość >0 a jeżeli w lewo to <0 ale o co chodzi z tym warunkiem if(diff & 1) (Rozumiem że sprawdzamy najmłodszy bit ale po co) i jeszcze pytanie odnośnie tej linii enc_delta+=(diff & 2)-1;
    do enc delta jest dodawany bit 2 ale tez nie rozumiem czemu, jak to działa?

    Pozdrawiam

  • #2 18 Kwi 2017 21:27
    excray
    Poziom 38  

    Do obsługi enkodera stworzyłem kiedyś taki kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • Pomocny post
    #3 18 Kwi 2017 21:37
    tmf
    Moderator Mikrokontrolery Projektowanie

    @squelch Pozycja jest w zmiennej enc_delta. Reszta kodu to konwersja z kodu Graya na pozycję.
    diff & 2 przyjmuje wartość 2 dla obrotu w jedną stronę i 0 dla obrotu w przeciwną. W efekcie jeśli od tego odejmiesz 1, to uzyskasz odpowiednio 1 lub -1 w zależności od kierunku obrotu, a więc wartość, którą możesz dodać do zmiennej określającej liczbę obrotów enkodera.

  • #4 25 Kwi 2017 20:08
    squelch
    Poziom 11  

    witam
    Przepraszam ale miałem nawał pracy dlatego teraz dopiero mogę się tym zająć, ok dzięki teraz jasniej ale po co dodajesz to do zmiennej nie wystarczy taki zapis enc_delta=(diff&2)-1;
    Jest jeszcze jedna rzecz dla obrotu w lewo normalnie kiedy odejmiemy wcześniejsza poz. od akt. do dostaniemy -1 jednak dla przejścia z 01->11 otrzymamy 3-1=2 czyli czasem mogą być złe wskazania

    Pozdrawiam i dziękuje za pomoc

  • Pomocny post
    #5 25 Kwi 2017 20:30
    tmf
    Moderator Mikrokontrolery Projektowanie

    Idea funkcji ReadEncoder() jest taka, że jest wywoływana przy każdym obrocie enkodera. Dlatego jest enc_delta+=, a nie enc_delta= - dzięki temu nie gubisz kroków. Program wie ile użytkownik wykonał obrotów od czasu ostatniego sprawdzenia tej zmiennej. Dzięki temu jeśli pomiędzy kolejnym sprawdzeniami zrobisz 10 obrotów to program to zauważy, przy zwykłym przypisaniu miałbyś tylko info, że jest -1 lub +1, w efekcie gubiłbyś kroki. Co do przejść - wszystko jest poprawnie - przeanalizuj jeszcze raz :)

  • #6 25 Kwi 2017 20:52
    squelch
    Poziom 11  

    no to załóżmy że pomiędzy kolejnym wywołaniem funkcji zrobisz jeden obrót w prawo a jeden w lewo dostaniemy 0 co oznacza że tak naprawdę nie krecilismy enko

  • Pomocny post
    #7 25 Kwi 2017 20:56
    tmf
    Moderator Mikrokontrolery Projektowanie

    @squelch No i to całkiem prawidłowa reakcja. Jeśli z jakichś powodów program ma zauważyć, że użytkownik najpierw przekręcił w lewo a potem zrobił taką samą liczbę obrotów w prawo to albo częściej musisz sprawdzać stan zmiennej enc_delta, albo dodać sobie bufor pierścieniowy w którym będziesz przechowywał informacje o kolejnych dzianiach użytkownika. Jednak chyba w większości aplikacji istotne jest ile obrotów wykonano enkoderem, a nie sposób w jaki nim kręcono.

  • #8 25 Kwi 2017 21:00
    squelch
    Poziom 11  

    obrót w lewo
    1.00
    2.01
    3.11
    4.10

    załóżmy ze byliśmy w kroku 3 a potem w 4 to otrzymamy 3-4 co daje -1 ok ale teraz załóżmy że mamy krok 4 a potem 1 będziemy mieć 3-1=2 nie jest mniejsze od 0

  • #9 25 Kwi 2017 21:05
    tmf
    Moderator Mikrokontrolery Projektowanie

    To co pokazałeś do kod Graya z enkodera. Funkcja go przelicza i dopiero wynik używa do liczenia kroków. Odpal ją w symulatorze Atmel Studio i sprawdź dla poszczególnych stanów enkodera.

  • #10 08 Maj 2017 10:33
    squelch
    Poziom 11  

    Witam jakoś odpuściłem sobie tą tematykę ale teraz spróbuję jeszcze raz to opanować

    Przecież kiedy obracam enkoderem to dif ma wartość 1 lub -1 więc na drugim bicie jest zero co w wyniku operacji enc_delta+=(diff & 2)-1;da zawsze -1 po lewej stronie ale tak nie jest dlaczego?

  • #11 08 Maj 2017 10:38
    tmf
    Moderator Mikrokontrolery Projektowanie

    Skoro funkcja działa prawidłowo i nikt nie miał z nią problemów, to wynika z tego, że błąd musi leżeć w twoim rozumowaniu. Tak jak pisałem - przeanalizuj sobie wszystkie możliwe kombinacje na kartce, albo lepiej - odpal symulator i prześledź działanie programu i nastanie jasność :)

  • #12 08 Maj 2017 22:45
    squelch
    Poziom 11  

    Witam uruchomiłem sobie symulator i testuje sobie stany enkodera ale zaciekawiło mnie dlaczego enc_delta+=(diff & 2)-1;
    dla diff=-1 da nam enc_delta=1 ,skoro -1 to w U2 100000001maskujemy drugi bit czyli mamy 0,odjąć 1 powinno wyjść -1.

    Pozdrawiam

  • #13 08 Maj 2017 23:53
    Freddie Chopin
    Specjalista - Mikrokontrolery

    squelch napisał:
    skoro -1 to w U2 100000001

    nieprawda. W kodzie U1 może i byłaby to prawda, jednak U1 jest praktycznie nieużywany.

  • #14 12 Maj 2017 00:24
    squelch
    Poziom 11  

    Faktycznie zapomniałem sobie że w U2 bit 7 ma wage -128. Sprawdziłem sobie coś takiego oraz potwierdziłem symulatorem.
    0 0 ->enc_delat=0
    0 1 ->enc_delta=-1
    1 1 ->enc_delta=1
    1 0 ->enc_delta=1
    PB0 PB7
    Co może powodować błędne działanie ponieważ na początku otrzymujemy że nie kręcimy enkoderem, potem że kręcimy w lewo a potem że w prawo sprawdziłem jeszcze kombinacje kolejną czyli 0 0 i znowu wychodzi enc_delta=0. O co tu chodzi?

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME