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

Bascom: Jak zliczać impulsy enkodera 360 imp/st bez użycia flag?

IMEX 24 Maj 2013 17:28 5550 22
  • #1 12341169
    IMEX
    Poziom 20  
    Witam serdecznie

    Mam pewien dylemat, problem

    Sprawa dotyczy Bascoma
    Mam Encoder 360 imp / 360 st
    wyjścia A, a oraz B , b (A i B stan wysoki oraz a i b stan niski)
    Między A i B jest przesunięcie impulsu o 50%

    do zliczania impulsów poszły 1 liczniki INT0 oraz INT1

    Wszystko zlicza szybko itd

    Problem dotyczy rozwiązania a żeby bez zaprzęgania jakiejkolwiek Flagi impulsy były dodawane lub odejmowane - w prawo lub Lewo kręcąc encoderem

    pozdrawiam
  • #2 12341232
    piotrva
    VIP Zasłużony dla elektroda
    Jaki to enkoder?
    Jeśli mechaniczny to rzucam hasło pt. drgania styków.
  • #3 12341294
    IMEX
    Poziom 20  
    kolego nie zrozumiałeś mojego pytania

    ale po kolei
    encoder wysokoobrotowy - nie impulsator jako pokrętło
    optyczny - zasilany 5V - gotowe impulsy na wyjściu - do 6000 obr/min czyli 6000 * 360 = ??? impulsów potega ale nie w tym problem

    gdyby to był zwykły impulsator jako pokrętło to nie zaprzęgał był ITN0 & INT1 tylko jako przyciski ze wzorem
    if sw1 = 0 and sw2 = 1 then incr licz_prawo
    i odwrotnie i to wklepuje do flagi i śmiga

    niestety biorąc przerwanie do INT0 jako Incr (dodawanie) i do INT1 jako Decr ( odejmowanie) nie działa to w ogóle

    Robię urządzenie a nie chce robić jakiejś dodatkowej wartości która będzie zmieniała Incr na Decr i odwrotnie - chcę wykorzystać już wmontowane w Encoder przesunięcie impulsów (o 50%) między A i B

    Niestety zatrzymałem się na rozwiązaniu tego problemu

    A może z porównaniem wartości dodanej ?? hmm zaraz to przetestuje

    Dodano po 39 [minuty]:

    Problem rozwiązałem

    Bardzo proszę dla tych co będą się z tym zmagać jak ja Gapiąc się w kod i nagle olśnienie

    Kod: text
    Zaloguj się, aby zobaczyć kod


    zlicza rewelacyjnie
    Informacyjnie - Encoder zakupiony na portalu aukcyjnym za 260zł kwiecień 2013r
  • #4 12343267
    Dar.El
    Poziom 41  
    :arrow: IMEX
    Uzupełnij post w wielkie litery i kropki.
  • #5 12349344
    tmf
    VIP Zasłużony dla elektroda
    IMEX: to nie jest żadne przesunięcie impulsów, tylko masz enkoder, który na wyjściu ma kod Greya. W efekcie musisz go normalnie dekodować. Jeżeli chcesz go rzeczywiście rozkręcać na 6000 obr/min to masz prawie pół miliona impulsów na sekundę. AVR nie wyrobi się z tym. Znaczy zwyky AVR. Zastosuj XMEGA, gdzie masz sprzętową obsługę enkodera, liczbę impulsów odczytujesz po prostu z licznika. Na zwykłym AVR dekodowanie nie jest może super skomplikowane, ale powiedzmy to zajmie ze 100 taktów, realnie jesteś więc w stanie obsłużyć koło 200 tys. impulsów przy czym procesor będzie zarżnięty w 100%.
  • #7 12351059
    Konto nie istnieje
    Poziom 1  
  • #8 12351532
    SylwekK
    Poziom 32  
    Coś mi się wydaje, że pokazany tu programik jak najbardziej będzie zliczał, ale co drugi impuls. Przecież są jeszcze stany pośrednie 0-0,1-1, które też wypadało by policzyć jeśli już wiemy, w którym kierunku się wszystko kręci...
  • #9 12351671
    Romantello
    Poziom 14  
    Wystarczy ustawić sprzętowe przerwanie int0 np narastającym zboczem kanału A - w momencie przerwania sprawdzić stan kanału B enkodera i stosownie do jego stanu zmniejszyć lub zwiększyć stan licznika o 1.
  • #10 12352192
    tmf
    VIP Zasłużony dla elektroda
    Romantello napisał:
    Wystarczy ustawić sprzętowe przerwanie int0 np narastającym zboczem kanału A - w momencie przerwania sprawdzić stan kanału B enkodera i stosownie do jego stanu zmniejszyć lub zwiększyć stan licznika o 1.


    Niestety nie jest to takie proste. Jak pisałem wcześniej kod Graya się kłania, trzeba zrobić jego normalny dekoder.
  • #11 12364612
    Krzysiek16
    Poziom 24  
    Moja propozycja:
    Ustaw przerwanie tylko z jednej linii, np. A.
    Procedura obsługi przerwania:
    zmienna = zmienna+1
    jeżeli B=1 to zmienna = zmienna -2
    koniec przerwania
  • #12 12404333
    Marek_Gorecki
    Poziom 16  
    tmf napisał:
    Romantello napisał:
    Wystarczy ustawić sprzętowe przerwanie int0 np narastającym zboczem kanału A - w momencie przerwania sprawdzić stan kanału B enkodera i stosownie do jego stanu zmniejszyć lub zwiększyć stan licznika o 1.


    Niestety nie jest to takie proste. Jak pisałem wcześniej kod Graya się kłania, trzeba zrobić jego normalny dekoder.


    a czemu zaproponowana metoda przez "Romantelo" jest błędna? Ja dokłądnie tak samo zrobiłem i działa mi wyśmiecie?
  • #13 12413153
    Krzysiek16
    Poziom 24  
    Metoda jest jak najbardziej poprawna i w dodatku szybka.
  • #14 15452590
    mr.Mechatron
    Poziom 10  
    Witam
    Niestety tamten sposób - program miał wade, przykładowo kiedy jeden z kanałów zmienił swój stan kilkukrotnie stan licznika był zmieniany w jednym kierunku (w zależności od stanu drugiego kanału) prostymi słowy wahający się enkoder generował błędy
    rozwiązałem ten problem ustawiając wejście by reagowało na zbocze rosnące i opadające.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Przetestowałem programik na enkoderze z drukarki i działa idealnie
    zamierzam zbudować serwo więc o błędach nie może być mowy.
    Mama nadzieję że pomogłem.
    Pozdrawiam
  • #15 15452722
    kamyczek
    Poziom 38  
    100 cykli w przerwaniu to wieczność pominę już że sam bascom jest niezbyt przyjaznym do tego typu operacji przy 20MHz taktowania mikrokontrolera masz do dyspozycji 9 taktów zegara w przerwaniu można sobie wybić z głowy cokolwiek bo same odłożenie na stos i zdjęcie adresu programu to 4 takty zegara , kolejne 2 to blokada przerwań i jej skasowanie jeden takt skasowanie flagi a 2 takt to odczyt portu bo to kod 9 bitowy . Tu można jedynie dekodować kierunek i ilość pełnych obrotów najstarszym bitem kodu a po zatrzymaniu czytać część obrotu w stopniach . tak czy inaczej dla przerwania typu 100 taktów mamy 100*2160000czyli 216 MHz i z tym to sobie nawet arm nie każdy poradzi Takie zabawy to się bardziej nadają pod FPGA i inne programowalne układy logiczne . Dokładając tu LCD i jego obsługę można sobie wybić z głowy ten encoder .
  • #16 15453248
    jnk0le
    Poziom 18  
    kamyczek napisał:
    100 cykli w przerwaniu to wieczność pominę już że sam bascom jest niezbyt przyjaznym do tego typu operacji przy 20MHz taktowania mikrokontrolera masz do dyspozycji 9 taktów zegara w przerwaniu można sobie wybić z głowy cokolwiek bo same odłożenie na stos i zdjęcie adresu programu to 4 takty zegara , kolejne 2 to blokada przerwań i jej skasowanie jeden takt skasowanie flagi a 2 takt to odczyt portu bo to kod 9 bitowy . Tu można jedynie dekodować kierunek i ilość pełnych obrotów najstarszym bitem kodu a po zatrzymaniu czytać część obrotu w stopniach . tak czy inaczej dla przerwania typu 100 taktów mamy 100*2160000czyli 216 MHz i z tym to sobie nawet arm nie każdy poradzi Takie zabawy to się bardziej nadają pod FPGA i inne programowalne układy logiczne . Dokładając tu LCD i jego obsługę można sobie wybić z głowy ten encoder .

    80% to zrzucanie na stos wszystkich dostępnych rejestrów. W C ze wstawką można by to mocno ograniczyć ale 2160000 kroków(6k rpm = 100rps czyli tylko 36 0000 kroków co jest całkowicie osiągalne) i tak to nie obsłuży. samo wejście i wyjście z przerwania to 8 cykli.
  • #17 15629465
    tomaszdko
    Poziom 12  
    mr.Mechatron wielkie dzięki za wstawienie tego kodu !!
    Tyle co nakombinowałem się z pisaniem pod enkoder to głowa boli , szukalem na forach i bez skutku . Kody , które próbowałem dawały błędne wyniki aż do teraz :)

    Użyłem dwa silniki https://fmcc.faulhaber.com/resources/img/EN_1224_SR_FMM.PDF
    z enkoderami
    http://www.voti.nl/docs/mot-17-enc.pdf

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    sprawdzony przy 6V i bez problemu .
    Jeszcze raz dzięki
  • #18 15629898
    SylwekK
    Poziom 32  
    Odnośnie tego kodu proponuje pozbyć się "And" z warunków i zastąpić je rozpisanymi If'ami. Kod się zmniejszy, a co za tym idzie będzie zapewne szybciej wykonywany. Operacje warunkowe z "And" w Bascom są tragicznie kompilowane. Oczywiście są sytuacje gdzie ciężko się ich pozbyć, ale w tym przypadku nie ma żadnego problemu.
  • #19 15633128
    kamyczek
    Poziom 38  
    Tak na marginesie to w większości przypadków gdy coś działa źle , wolno lub program idzie w krzaki najlepszym rozwiązaniem jest pozbycie się tak z tematu jak i programu słowa BASCOM . Po prostu nie jest to środowisko do budowy poważnych prac konstrukcyjnych ani nawet zdobycia doświadczenia bo żadna poważna firma nie weźmie pod uwagę znajomości bascoma ani też użycia go w trakcie realizacji poważnych projektów chyba że są to lampki na choinkę ...
  • #20 15633131
    SylwekK
    Poziom 32  
    @kamyczek, nie przesadzaj :) Wprawdzie byłem zatwardziałym bascomowcem, ale tylko do momentu kiedy postanowiłem przejść w elektronikę już na dobre i dopiero wtedy zająłem się C. Zapewniam Cię, że przy odrobinie pomysłowości można w bascomie wykonać bardzo dużo i to skomplikowanych rzeczy. Jeśli ktoś pisze coś z doskoku tylko dla siebie to nie musi zaraz z niego rezygnować. Inna prawa, że w C jednak mamy kontrolę praktycznie nad wszystkim i teraz trzęsie mnie jak czasem jakieś zmiany robię w sofcie pisanym jeszcze w bascom :) Nie o tym jest jednak temat.
  • #22 15638047
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA