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

Enkoder, ATmega8, pomiar położenia silnika, asembler

26 Kwi 2007 02:22 3591 10
  • Poziom 14  
    Witam.
    Zdaje sobie sprawę, że temat ten był poruszany na elektrodzie wielokrotnie, jednak po przeczytaniu kilkudziesięciu wątków nie znalazłem rozwiązania które może mi pomóc. Otóż potrzebuje mierzyć położenie obracającego się wału silnika w czasie, uzyskując wynik do dalszych obliczeń w kaskadowej strukturze sterowania. Ponieważ posiadam (niestety) jedynie teoretyczną wiedzę na ten temat właściwie nie wiem w jaki sposób się do tego problemu zabrać.
    Otóż:
    Do wału silnika podłączony jest enkoder MPL10 dający 512 impulsów na obrót.
    W jak sposób podłączyć ten enkoder do Atmega8 (korzystać z przerwań czy liczników?) aby "on-line" czyli ciągle odczytywać w jakimś rejestrze położenie silnika.
    Sam enkoder daje na wyjściu 2 sygnały prostokątne przesunięte względem siebie o 90 stopni (w celu rozróżnienia kierunku obrotów).

    Logiczniejsze wydaje mi się użycie przerwań i zliczanie wystąpienia zbocza narastającego dla każdego sygnału (A i B). Jednak nie mogę wymyślić jak te informacje przetworzyć na położenie wału.
    Jestem pewien że wiele osób z tego forum zna rozwiązanie mojego problemu proszę więc o szybką pomoc jak w asemblerze sobie z takim problemem poradzić. Właściwie wystarczy mi sam algorytm takiego "rozkodowania" położenia wału, ze stworzeniem kodu na jego podstawie prawdopodobnie dam sobie radę.
  • Poziom 14  
    Zmiana enkodera jest nie możliwa. Muszę sobie poradzić ze zliczaniem impulsów tylko nie jestem pewien jak to zrobić. Nie mam za bardzo opanowanych liczników na Atmedze ale jest jakiś sposób zliczania ilości zboczy narastających na nich? Drugim pomysłem jest użycie przerwań zewnętrznych, ale jak wtedy określić kierunek obrotów?
    Po prostu nie chce wyważać otwartych drzwi więc pytam bardziej doświadczonych ode mnie jak zwykle takie coś się realizuje.
    W momencie zaniku zasilania cały układ ma się zatrzymać i zgłosić błąd tak więc problem zapamiętania położenia w takim wypadku nie istnieje.
  • Poziom 14  
    Dziękuję za linki. Poprzeglądałem je no i teraz będę sam coś próbował kombinować.
  • Poziom 14  
    No zbyt trudne to nie było:).
    Mam pytanie wie ktoś może ile taki przetwornik TYP MPL10 produkcji PZO ma impulsów na obrót? Miał mieć 512 a wychodzi mi że ma 256.

    Na razie stworzyłem sobie taki programik:

    .INCLUDE "plik_definicji.txt"

    ;----------SEGMENT DANYCH--------------------------------
    .DSEG
    .ORG 0x60

    ;----------WEKTORY PRZERWAN------------------------------
    .CSEG
    .ORG 0 ; wektor przerwania inicjalizacji
    rjmp Reset ; skok do procedury inicjalizacji

    .ORG INT0addr ;
    rjmp Przerwanie_1


    ;----------SEGMENT PROGRAMU------------------------------

    Main:

    cpi R16, 0xFF ; jesli R16 jest rowne FF to zwieksz wartosc na porcie B
    breq zwieksz_port
    ldi R20, 0xFF ; likwidacja blokady
    jmp koniec_main


    zwieksz_port:
    cpi R20, 0x00 ; zabezpiecza przed wielokrotnym zwiekszaniem portu B
    breq niezwiekszaj ; przy jednym obrocie

    ldi R20, 0x00 ; zalozenie blokady
    inc R17
    out PORTB, R17

    niezwiekszaj:
    nop

    koniec_main:
    jmp Main


    ;----------SEGMENT PRZERWAN------------------------------

    ///////////////////////////////////przerwanie inicjalizujace
    Reset:
    ; ustawienie wskaznika stosu
    ldi R16, high(RAMEND)
    ldi R17, low(RAMEND)
    out SPH, R16
    out SPL, R17

    ; port B jako wyjscie
    ldi R16, 0xFF
    out DDRB, R16

    ; port D jako wejscie
    ldi R16, 0b00000000
    out DDRD, R16

    ; wlaczenie przerwan od int0
    in R16, GICR
    ori R16, 1<<INT0
    out GICR, R16

    ;ustawienie aktywacji przerwan int0 (zboczem narastajacym)
    in R16, MCUCR
    ori R16, 1<<ISC00
    ori R16, 1<<ISC01
    out MCUCR, R16

    ldi R16, 0x00 ; wyczyszczenie r16

    ldi R17, 0b00000001 ;zapalenie 1 diody
    out PORTB, R17

    sei; zezwolenie globalne na int
    jmp Main


    /////////////////////////////////////////////przerwanie od encodera
    Przerwanie_1:

    sbis PIND,4 ; jesli jest wysoki stan na lini PD4 to zwieksz licznik
    jmp zmniejsz_encoder ; jesli jest niski to zmniejsz

    inc R16
    jmp koniec_przerwania_1

    zmniejsz_encoder:
    dec R16

    koniec_przerwania_1:
    reti


    Wyjście enkodera podłączyłem pod wejście przerwania a drugie pod PD.4.

    No i wychodzi mi, że enkoder ma raczej 256 impulsów na obrót (chociaż właściwie zwiększenie wartości na porcie B następuje chyba po minimalnie większym ruchu niż 360stopni (sic!) ).
    W dodatku enkoder otrzymałem z informacją że impulsów na obrót jest 512 i teraz mam mętlik w głowie, bo gdyby tak było to zliczałbym na porcie B połówki obrotów. A z obserwacji wynika że trochę więcej jak pełne obroty.
    Na google czy elektrodzie ciężko dokumentacje do tego sprzętu znaleść:(.
  • Poziom 39  
    masz rację na temat enkodera praktycznie nie ma zbyt wiele informacji , może kontakt z tym co pozostało po PZO pozwoli na otrzymanie dokładniejszych informacji http://www.pzo.warszawa.pl/
    myślę że jednak to 512 impulsów na obrót , zapytam czy zastosowałeś układ kształtowania impulsu z enkodera , z informacji które można jeszcze znaleźć wynika że były wersje z wbudowanym układem kształtowania impulsów , oraz z osobnym modułem
    Cytat:

    Dodatkowo w pudełku mieściły się dwa wzmacniacze/obcinacze, tak aby na wyjściu był sygnał prostokątny.
    W nowszym wykonaniu (E3) wzmacniacze były zbudowane na na scalonych inverterach z otwartym wyjściem , z których dwa pierwsze invertery były przerzutnikiem Shmitta (tak to się pisało?), a trzeci wyjściowy (bez opornika koncowego, który był montowany już w układzie wykonawczym).

    jeżeli masz wersję E3 z wyjściem OC to musisz zastosować oporniki aby zasilić tranzystor końcowy
  • Poziom 14  
    Na przetworniku napisane jest tylko PRZETWORNIK typ MPL 10 natomiast kabel rzeczywiście przechodzi przez jakieś "pudełeczko" ale nie wiem do czego ono jest. Stwierdziłem sobie na początku, że to układ odpowiedzialny za przerobienie sygnału na standard TTL, czyli 5 V na wyjście i to wszystko. (Enkoder podpinam bezpośrednio pod ATmegę - oczywiście uwzględniająć owe czarne pudełeczko). Właśnie ma temat enkodera nie wiele wiem. A informacje o nim dostałem tylko, jaki kabelek jest od czego i że daje 512 imp/obr.
    Tylko po uruchomieniu tego programu powyżej coś z tą ilością impulsów nie gra:/.
  • Poziom 39  
    właśnie cała sprawa w tym " pudełeczku "
    bez dokładnego sprawdzenie nie wiesz tak naprawdę jakie otrzymujesz impulsy oraz czy są prawidłowe , jak zasilasz ta pudełko , czy sprawdzałeś jaki poziom napięć masz na wyjściu , czy wyjścia nie są przypadkiem typu OC , najlepiej podpiąć wyjścia pod oscyloskop i będzie wszystko wiadome
    co do zawartości to mogę jedynie zgadywać , z pewnością są tam dwa tory kształtowania impulsów z przerzutnikami Schmitta może to być na tranzystorach lub układach scalonych , wyjścia mogą być typu OC w przemysłowych rozwiązaniach powszechnie stosuje się napięcie 24V tak więc w układzie może być stabilizator tak naprawdę zacznij od dokładnego przeanalizowania tego co znajduje się w pudełku
    jak masz możliwość zrób zdjęcie coś to pomoże w analizie układu
    jeżeli nie masz pewności co do tego pudełka to na próbę proponuje zbuduj układ według projektu który masz wcześniej to tylko jeden układ 7414 masz pewność że na pewno impulsy będą prawidłowe , oczywiście wykorzystaj tylko wyjścia fototranzystorów z enkodera
  • Poziom 14  
    Witam po przerwie (długi weekend:) ). Rozkręciłem pudełeczko i rzeczywiście w środku znajduje się układ na tranzystorach. Problem odnośnie ilości impulsów na obrót polegał na tym, że sądziłem iż enkoder ma dawać 512 impulsów prostokątnych na obrót (trochę to określenie jest mylące). Poprostu niedouczenie:( naczytałem się na temat enkoderów i teraz wiem, że 512imp/obr to tak naprawdę 512 zmian sygnału z wysokiego na niski i z niskiego na wysoki - ja wcześniej brałem pod uwagę tylko zbocze narastające więc impulsów miałem 256/obr. - Mój błąd przyznaję. Teraz już pozostaje mi tylko podszkolić się w pomiarze prądu wzmacniaczem różnicowym i mogę zaczynać budować kaskadowe sterowanie SPS`em do którego właśnie będę owy enkoder wykorzystywał. Wypada mi jedynie podziękować za pomoc i przeprosić za zamieszanie wynikające z własnej niewiedzy.