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

Atxmega silnik krokowy - jak wykonać określoną (małą) liczbę kroków?

Paros 26 Lut 2015 19:59 855 15
  • #1 26 Lut 2015 19:59
    Paros
    Poziom 11  

    Witam.

    Proszę o naprowadzenie mnie na rozwiązanie. Silnik krokowy sterowany impulsami na wejściu swojego sterownika musi wykonywać co 50 ms tylko kilka (np.10) kroków i czekać do następnej sekwencji.
    Nie może to być manewrowanie stanem pinów przy pomocy _delay. Procesor Atxmega, mam jeszcze wolne 3 timery. Czy da się jakoś uruchomić PWM, aby wykonał tylko 10 okresów? Jakiś dodatkowy timer, który przez system zdarzeń zlicza impulsy na wyjściu PWM a po 10 impulsach zatrzymuje PWM? A może jakoś całkiem inaczej? Ważne, żeby odbywało się to na przerwaniach - procesor nie może być spowalniany...

    0 15
  • #2 26 Lut 2015 20:05
    tmf
    Moderator Mikrokontrolery Projektowanie

    Można ustawić timer, żeby generował kolejne kroki, które są realizowane przez transfer DMA. Po określonej liczbie bajtów transfer DMA się kończy i kolejne wyzwolenia timera są nieskuteczne. Można też wykorzystać event system, które przekaże zdarzenia do timera je zliczającego, jak zliczy określoną liczbę zdarzeń to też przez event system wyśle reset do pierwszego timera i go zablokuje. Można też klasycznie - timer, generujący przerwania co jakiś czas, w ISR sterujesz silnikiem i je zliczasz. Po określonej liczbie kroków blokujesz określone przerwanie/ignorujesz/co tam chcesz.

    0
  • #3 26 Lut 2015 20:30
    Paros
    Poziom 11  

    Dzięki.

    Próbuję właśnie z tą metodą klasyczną - byłoby mi łatwiej kontrolować na przykład aktualne położenie wału. Tylko nie umiem sobie poradzić. Co masz na myśli pisząc o sterowaniu krokami w ISR? Krok silnika to wyzwolenie impulsu (musi chwilę trwać - jeśli dobrze liczę, dla 500 Hz 2ms) i potem go zakończyć. W czasach Bascomu pisałem ustaw port, poczekaj ileś ms i wyzeruj port, ale porzuciłem już ten sposób myślenia. Podpowiedz proszę, jak w obsłudze przerwania wykonać jeden krok takiego silnika?

    0
  • #4 26 Lut 2015 20:38
    tobiasz54
    Poziom 12  

    Co 50 ms 10 kroków.
    Ja bym zrobił tak.
    W przerwaniu 1 timera(co 50 ms) uruchamiasz drugi timer w którym liczysz przerwania do 10 . Każde przerwanie 2 to krok. Kwestia taka, żeby ten 2 zdążył przed następnym przerwaniem 1.
    Można jeszcze pokombinować, ale taka jest moja koncepcja.

    0
  • #5 26 Lut 2015 20:48
    tmf
    Moderator Mikrokontrolery Projektowanie

    Koncepcja @tobiasz54 jest ok. Nie wiem dlaczego impuls STEP musi trwać aż 2 ms? Zwykle sterownikowi wystarcza o wiele krótszy czas. Ale jeśli to musi być 2 ms, to wykorzystaj własnie timer w trybie PWM - ustaw, żeby kanał generował impulsy o szerokości 2 ms i po każdym w ISR dla tego kanału zliczaj liczbę impulsów. Jak dojdzie do 10 to blokujesz timer. Z event system można to zrobić całkowicie sprzętowo.

    0
  • #6 26 Lut 2015 20:51
    Paros
    Poziom 11  

    Jakoś tak właśnie kombinuję. Tylko co to znaczy ten "krok"? Ustawienie stanu wysokiego na pinie co drugie przerwanie (czyli 2ms) -OK . Ale kiedy i jak ustawić stan niski? Jeszcze jeden timer? Przy okazji - do tej pory nie zastanawiałem się nad stosunkiem czasowym stanu wysokiego do niskiego na wejściu sterownika - zazwyczaj wypełnienie generatora było przyjmowane przez sterownik. Jeśli "1" trwa 2ms, ile powinno trwać "0"?


    Możliwe, że coś namieszałem. Prosty tani silnik i prosty sterownik A4988. Sterując to zewnętrznym generatorem zauważyłem, że silnik kręci się najlepiej przy 500 Hz. Wyszło mi, że okres to 2 ms....

    0
  • #7 26 Lut 2015 21:00
    tmf
    Moderator Mikrokontrolery Projektowanie

    Napisz co to za sterownik. Co do zmiany stanu pinu - załatwia ci to właśnie PWM - liczysz tylko tak, żeby PER dawał ci odpowiedni okres - np. 2ms, do CCA ładujesz PER/2 i masz impuls dodatni o czasie 2ms, co 4ms. W przerwaniu CCA inkrementujesz licznik kroków i sprawdzasz, czy masz już 10 - jeśli tak, wyłączasz timer.

    0
  • #8 26 Lut 2015 21:05
    tobiasz54
    Poziom 12  

    PWM do krokowego jest bez sensu.
    Przypadkowo wpadłem(dosłownie i z wiedzą i wpadką).
    Mam silniki krokowe 200 kroków na obrót. Steruję przez przerwania timera w ten sposób, że zmieniam stan pinu(invert). Wiadomo, że krok dla silnika to 0-1-0. Zmieniając stan pinu z timera robiłem połowe tej procedury. Wysyłam 200 invertów a silnik robi pół obrotu. Wszystko jasne, w 1 przerwaniu 0-1 w drugim 1-0. JEDEN KROK. Wypełnienie praktycznie 50x50.
    W Twoim przypadku wystarczy odpowiednio ustawić częstotliwość 2 timera i przerwania.
    Ja akurat robie to na ARM, ale timery to timery.
    edit:
    Temat jest jak wykonać określoną liczbę kroków - to jest proste i można na 1 timerze. Jeżeli co jakiś czas(50ms) to na 2 timerach. A jakby się uprzeć to na jednym.

    0
  • #9 26 Lut 2015 21:27
    Paros
    Poziom 11  

    Dziś już muszę zakończyć eksperymenty. Jutro spróbuję z obydwiema Waszymi wersjami. Przyszło mi do głowy, żeby ustawić timer na 1 ms, w każdym przerwaniu robi "toogle". Powinno to dać okres 2ms. Licznik do 10 wyłącza ten timer a właczy go ponownie ten pierwszy, odliczający co 50 ms.
    Poćwiczę też z event system - to co teraz robię to i tak tylko zabawa, w ramach ćwiczeń do książek TMF'a.

    0
  • #10 26 Lut 2015 21:28
    tmf
    Moderator Mikrokontrolery Projektowanie

    @tobiasz54 - nie jest tak prosto, gdyż autor założył, że czas trwania impulsu STEP trwa 2ms - nie da się tego sensownie wygenerować w przerwaniu, bo funkcja jego obsługi musiałaby bezczynnie te 2 ms czekać, lub też trzeba by tę operację podzielić na dwa przerwania. Jest to o tyle bez sensu, że impuls dokładnie o potrzebnym kształcie wygeneruje właśnie timer w trybie PWM. Jedyne co trzeba zrobić to zliczać impulsy, co można zrobić programowo z wykorzystaniem przerwania kanału, lub sprzętowo z wykorzystaniem event system i drugiego timera.

    0
  • #11 26 Lut 2015 21:44
    Paros
    Poziom 11  

    @tmf - przepraszam, ale źle to przedstawiłem. Pisałem, że STEP ma trwać 2ms, podczas gdy tyle ma trwać okres całego impulsu sterującego jednym krokiem (o ile dobrze to rozumiem - chcę uzyskać częstotliwość sterowania silnikiem 500 Hz)

    0
  • #12 26 Lut 2015 21:49
    tobiasz54
    Poziom 12  

    @tmf wydaje mi się, że te 2ms dla sterownika są bez znaczenia. Dlaczego akurat 2ms? Nie chce mi się liczyć ile kroków(pełnych? czy w zależności od ustawień sterownika A4988) co 50ms może wykonać silnik.
    A co mi tam, z datashetu 57BYG- (frequency)2500pps(graniczna, bo powyżej spada torque, czyli siła?) .
    Mam problem, w myśli nie przeliczam imp/ms na Hz.

    0
  • Pomocny post
    #13 26 Lut 2015 22:05
    tmf
    Moderator Mikrokontrolery Projektowanie

    @tobiasz54 - nie zauważyłem, że w końcu dowiedzieliśmy się o jaki sterownik chodzi. W nocie piszą, że STEP ma mieć okres co najmniej 2 us, 1 us stan wysoki, 1us stan niski. Czyli od biedy można to zrobić w przerwaniu, ale równie dobrze (a nawet lepiej) przez PWM. Nie należy mylić czasu trwania impulsu STEP, z liczbą kroków na sekundę - ta będzie zależeć od okresu. BTW, torque - moment obrotowy.
    @Paros Więc ustaw timer pracujący w trybie PWM tak, żeby jego okres wynosił 2 ms - dostaniesz wtedy 500 impulsów/s, ustaw CCA, żeby generował impuls o czasie trwania >1us, odblokuj przerwania z CCA i tam sobie zliczaj impulsy. Zliczysz do 10 -> blokujesz timer. Dodatkowo drugi timer ustawiasz tak, żeby się przepełniał co 50 ms - w jego ISR overflow odpalasz timer od PWM i to wszystko. Masz co 50ms 10 kroków.

    0
  • #14 26 Lut 2015 23:23
    Paros
    Poziom 11  

    Na dziś zrobiłem wg Tobiasza.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na razie efekt mam na analizatorze stanów logicznych, ale powinno działać.

    Atxmega silnik krokowy - jak wykonać określoną (małą) liczbę kroków?

    Jutro poćwiczę z PWM i może eventami wg. TMF'a.

    Poćwiczę też z tym okresem 2ms - może to faktycznie za dużo (choć wydaje mi się to bez większego znaczenia - w tych 50 ms silnik ma się obrócić o dziesięć kroków a potem wykonuje się pomiar odległości z Sharpów. Pomiar trwa chyba 1 ms, czyli nawet tak jak teraz mam na to 30 ms po zatrzymaniu silnika i przed jego ponownym startem). Okresy 50 ms wynikają z czasów konwersji pomiaru czujników odległości - sekwencja przed kolejnymi pomiarami wynosi wg. dokumentacji ok. 40 ms, więc dałem trochę zapasu...


    Bardzo dziękuję za pomoc.

    0
  • Pomocny post
    #15 27 Lut 2015 00:36
    tobiasz54
    Poziom 12  

    Heh, siedzę i nie daje mi to spokoju.
    Kod który napisałeś - nawet nie czytam bo w C piszę od niedawna ale tylko na ARM'y czy też na LPC i nazwy rejestrów itp nic mi nie mówią.
    Moja koncepcja jest taka:
    Uruchamiasz 1 timer z przerwaniem co 50ms.(dlaczego co 50?).
    W przerwaniu 1 timera uruchamiasz 2 timer. Ustawiasz przerwania 2 timera, w każdym przerwaniu 2 zmieniasz stan pinu do sterownika na STEP. Częstotliwość przerwań 2 musisz zwiększyć x2, ponieważ każde przerwanie zmienia stan pinu z 0 na 1 lub z 1 na 0, co pisałem wcześniej. Długość impulsu/stanu pinu czy wysoki czy niski nie ma znaczenia dla sterownika. W tym przypadku masz 50/50 %. Co da PWM? Jeżeli krok ma być co 1 ms to stan wysoki będzie np 0,75ms a stan niski 0,25ms?(lub jak tam ustawisz ten PWM?)
    Jeżeli krok ma być co 2ms to musisz ustawić przerwanie timera 2 co 1ms. Zbocze narastające co 2 przerwanie wynikające z invertu pinu.

    Dodano po 13 [minuty]:

    @tmf Czytałem :oops: :oops: że są rejestry z których można odczytać stan timerów, ale jeszcze nie korzystałem, więc na razie umiem liczyć tylko przerwania.
    Twoje rozwiązanie jest OK.

    0
  • #16 27 Lut 2015 09:36
    Paros
    Poziom 11  

    Robiłem próby z krótszymi czasami (większa częstotliwość sterowania silnikiem). Niestety silnik utyka.
    Myślę, że to sprawa samego silnika (od stacji dyskietek) a może przede wszystkim niskiego napięcia zasilania tego silnka - 12V. Tego nie zmienię, bo właściwie nie ma potrzeby - nawet jeśli silnik zrobi te 10 kroków 10 razy szybciej to i tak z następną serią kroków musi zaczekać do następnej sesji "50ms".
    Zamknę temat, bo mam to, o co pytałem.

    0