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.

[STM32F4][C] - Współpraca silnika krokowego z enkoderem.

08 Wrz 2014 18:24 1626 15
  • Poziom 18  
    Mam enkoder, który ma 200 impulsów na obrót i silnik krokowy na 200 kroków. Chcę uzyskać takie efekt żeby kręcąc enkoderem w tym samym czasem żeby silnik się kręcił o tyle samo kroków co enkoder. Wiem, że w czasie rzeczywistym się nie da, ale chcę żeby to opóźnienie było jak najmniejsze. Mam napisany program do obsługi enkodera na F4 za pomocą timera jak i obsługę programową silnika krokowego. Nie oczekuję tutaj gotowego kodu, tylko o sugestię, podpowiedz, dobrą radę jak mam to dokonać. Oczywiście jeśli się da tak zrobić.
  • Poziom 35  
    Jak zrealizowałeś sterowanie silnika krokowego, co to jest za silnik, i jakiego rodzaju jest jego driver?...

    Jeśli masz driver silnika z translatorem, i dostarczasz mu standardowe sygnały U/D i STEP - zrealizuj generowanie impulsu STEP na timerze.

    Zalezy tez co to za enkoder. Jeśli enkoder potrafi wypluć impuls w momencie obrotu o krok, mozesz ten impuls wykorzystać bezpośrednio do wyzwalania timera.
  • Poziom 18  
    Obsługę silnika krokowego mam bipolarny zrobiona na tranzystorach, podaje sygnały na poszczególne piny i silnik się obraca. Nic nie stoi na przeszkodzie by użyć tego sterownika o którym mówisz. A enkoder ma dwa wyjścia A i B i działa tak. Timer w F4 mają funkcję do obsługi enkodera.
  • Poziom 35  
    Nigdy nie mialem okazji uzywania enkodera, ale wydaje mi się, że samplując stan B w trakcie zbocza na A znasz kierunek. Uzyj przerwania na A. W ISRrze sampluj B. Tam ustal U/D i softem ztriggeruj timer ktory pusci impuls na STEP.

    Nadal - powiedz jakie są załozenia projektu. 'Stając na penisie' da sie tak zaprojektowac układ, zebys miał latency mniejsze niz 1us. Najpierw zdefiniuj, co ci potrzeba, i ile jestes w stanie poswiecic aby to osiągnąć. Typowy tradeoff dewelopera systemu...
  • Poziom 18  
    nsvinc napisał:
    Nigdy nie mialem okazji uzywania enkodera, ale wydaje mi się, że samplując stan B w trakcie zbocza na A znasz kierunek. Uzyj przerwania na A. W ISRrze sampluj B. Tam ustal U/D i softem ztriggeruj timer ktory pusci impuls na STEP.

    Ale jakiego przerwania użyć, bo żadnego od enkodera nie ma, ani nic w tym stylu. Któregoś od timera ?

    nsvinc napisał:
    Nadal - powiedz jakie są załozenia projektu. 'Stając na penisie' da sie tak zaprojektowac układ, zebys miał latency mniejsze niz 1us. Najpierw zdefiniuj, co ci potrzeba, i ile jestes w stanie poswiecic aby to osiągnąć. Typowy tradeoff dewelopera systemu...

    Na razie nie zdradzę swoich planów na temat mojego projektu. Chcę uzyskać jak najmniejsze opóźnienie, mi na pewne się nie uda uzyskać 1us.
    Wiem że coś takiego jest w obrabiarkach cnc, próbowałem i działa fajnie.
  • Poziom 35  
    Wydaje mi się, że to może działać tak:
    Zrób sobie przerwanie EXTI na zbocze narastajace na linii A enkodera, w przerwaniu sampluj linię B, dzięki czemu ustalasz kierunek - w tym samym przerwaniu ustalasz stan linii U/D i odpalasz timer, ktory wygeneruje impuls STEP.
    Latency rzędu 1us jest osiągalne w ten sposób: 12 taktów na wejście w ISRa, z kilkanaście taktów na sprawdzenie warunków dot. kierunku enkodera, kilka taktów na odpalenie timera, ktory moze 'w miejscu' wygenerowac zbocze narastajace dla sterownika silnika krokowego. Nawet jak sie zamkniesz w 50 taktach, to @100MHz masz 500ns czasu reakcji na enkoder.

    Lepsze wykorzystanie enkodera bedziesz miał wtedy, gdy skonfigurujesz przerwanie na linię A dla obu zbocz, i:
    - zbocze narastajace A, B w stanie niskim - 'w lewo'
    - zbocze opadające A, B w stanie wysokim - 'w lewo'
    - zbocze narastające A, B w stanie wysokim - 'w prawo'
    - zbocze opadające A, B w stanie niskim - 'w prawo'
    Zwalcz drganie stykow enkodera filtrami RC.

    Jeśli timer w procku obsluguje QEI, to juz w ogole nie masz problemu. Timer powinien potrafić rzucić przerwaniem w momencie gdy wystapi zdarzenie ruchu enkodera...Wtedy czas reakcji będzie jeszcze lepszy.

    Co do silnika krokowego - sterowac nim mozesz na 100 sposobów, tyle ze powinno ci wyjsc na zdrowie uzyc sterownika z translatorem. Tyle, ze scalak z translatorem nie reaguje natychmiast, wiec co z tego ze procek wprowadzi opoznienie 500ns skoro sterownik silnika dolozy n mikrosekund do tego...

    Jesli nie chcesz translatora, to mozesz wziac taki sterownik, ktory ma 2 wejscia PWM i zamienia to na moc dla silnika. Tymi PWMami ustalasz prąd na kazdej z faz.
    Jesli zalozysz, ze PWM masz np. 1MHz (i driver silnika sobie z tym poradzi), to masz i tak 1.5us czasu reakcji silnika na enkoder...

    Dlatego mowie kazda implementacja to jest tradeoff. Jesli chcesz np. 500ns czasu reakcji silnika na enkoder, to oprocz wydajnej obslugi ruchu enkodera (ktora musi sie zamknac w 250ns), musisz wziac pod uwage czas reakcji układu, ktory ustala prąd fazy, więc ten układ musiałby reagować szybciej niż 250ns, więc PWM ustalający prąd faz to conajmniej 4MHz. A zeby miał rozdzielczość 32 wypełnień, zegar takiego timera musiałby wynosić 4*32 = 128MHz ;] I to pozwoliłoby ci na mikrokrok 1/32 z czasem reakcji 500ns...

    Dodatkowo - kilka A na fazę dla silnika, przełączane PWMem 4MHz to będzie długa, trudna i niemal niewykonalna zabawa. W szczegolnosci, ze najkrótszy impuls będzie wynosił ~7800 pikosekund a w tym czasie musisz zdążyć otworzyć i zamknąć tranzystor, i to tak, zeby zdążył przez niego popłynąć prąd...
  • Poziom 11  
    ustaw sobie dwa porty pod które jest podpięty enkoder jako wejścia i przerwania zewnętrzne, wyzwalane opadającym i rosnącym zboczem.
    Oba przerwania muszą mieć jednakowy priorytet obsługi. Funkcja obsługująca przerwania będzie wyglądała tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    w zmiennej encoder_count będziesz miał aktualną liczbę pozycje enkodera
    natomiast zmienna wybierana z tabeli będzie mówiła czy kręcić silnikiem w prawo (+1) czy w lewo (-1)
  • Poziom 35  
    Cytat:
    ustaw sobie dwa porty pod które jest podpięty enkoder enkodera jako wejścia, przerwania zewnętrzne, wyzwalane opadającym i rosnącym zboczem.

    PO CO? To co ja podałem jest dwa razy lepsze. A dodatkowo - nieistotna jest pozycja enkodera, a event jego ruchu. Jedyne co obchodzi to to, w ktora strone...
  • Poziom 11  
    W sumie racja, jeżeli nie potrzebuje informacji o położeniu to pomysł z wykrywaniem zbocza narastającego i samplowaniu drugiej linii jest prostszy i szybszy.
  • Poziom 35  
    Pozycja enkodera kwadraturowego bez mozliwosci ustalenia stanu pelnego obrotu (a wlasnie tą sytuację mamy dysponując klasycznym 'impulsatorem') siłą rzeczy będzie uniemozliwiać wszelkie próby ustalenia absolutnej pozycji enkodera względem punktu początkowego. Więc cała dywagacja na nic; nigdy nie dowiesz się gdzie enkoder jest, a tylko dowiesz się, w którą stronę się obrócił. Mozna bawic się w całkowanie, ale zawsze masz opcję błędu...
  • Poziom 11  
    Przemyślałem temat a ponieważ jestem Guru to powiem
    - idź drogą, którą Ci wskazałem.
    Tamten pan wskazuje drogę krótszą ale biegnącą na manowce :D - rano wyjaśnię dlaczego.

    [STM32F4][C] - Współpraca silnika krokowego z enkoderem.

    poruszając enkoderem w granicach czerwonych linii, silnik wykonuje dwa kroki w jedną stronę i jeden z powrotem, po np. 20 ruchach enkoderem, silnik jest 10 kroków dalej niż powinien być.
  • Poziom 35  
    Oh really?
    myself napisał:

    - zbocze narastajace A, B w stanie niskim - 'w lewo'
    - zbocze opadające A, B w stanie wysokim - 'w lewo'

    Więc z tego co pokazałeś na obrazku, silnik jednak wykona trzy kroki - w lewo.

    Poza tym po co ta dywagacja skoro autor dysponuje QEI...
  • Poziom 11  
    A kto to napisał:

    Cytat:

    Zrób sobie przerwanie EXTI na zbocze narastajace na linii A enkodera, w przerwaniu sampluj linię B, dzięki czemu ustalasz kierunek - w tym samym przerwaniu ustalasz stan linii U/D i odpalasz timer, ktory wygeneruje impuls STEP.


    Niestety trzeba reagować na narastające i opadające zbocza obydwóch linii.
  • Poziom 35  
    Cytat:
    Niestety trzeba reagować na narastające i opadające zbocza obydwóch linii.

    Nadal - po co?
    To co ja napisałem to tylko propozycja, nigdy nie sprawdziłem tego w praktyce, a tylko opisuję pomysł, który wydaje się działać. Równie dobrze moze nie działać.

    Wyjasnij po co potrzebujesz przerwania na linię B?...
  • Poziom 18  
    Dzięki za podpowiedzi. Wypróbuję jak to ma się w praktyce.
    Ale gdy bym jeszcze znał położenie enkodera, to by fajnie było.
    Gdy ustawie timer by pracował z enkoderem to on pokazuje kierunek i położenie.
  • Poziom 18  
    Próbuję najpierw dopalić ten enkoder na przerwaniach. Przegrzebałem pół internetu i stworzyłem coś takiego. Działa to, ale co czwarte przesunięcie enkodera. Nie wiem w czym błąd.
    Kod: c
    Zaloguj się, aby zobaczyć kod