Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ATmega32 sterowanie silnikami krokowymi - robot kartezjański

jfiglak666 14 Mar 2018 08:43 726 8
  • #1
    jfiglak666
    Level 5  
    Witam serdecznie. Realizuję projekt robota kartezjańskiego. Doszedłem do etapu programowania i ze względu na brak doświadczenia w tym zakresie przysparza mi ono sporo problemów. Udało mi się napisać funkcje do bazowania i zadawania ruchu o charakterystyce trapezowej dla pojedynczego silnika, teraz chciałbym tak zmodyfikować te funkcje, aby za pomocą jakiejś zmiennej przekazywać do nich, który z czterech silników mają obsługiwać. Bardzo proszę o jakąś podpowiedź, jak do tej modyfikacji podejść. Sterowanie odbywa się za pomocą mikrokontrolera ATmega32 i sterowników A4988. Poniżej wklejam funkcję realizującą ruch trapezowy i procedurę obsługi przerwania.

    Code: c
    Log in, to see the code


    Code: c
    Log in, to see the code


    Z góry bardzo dziękuję za wszystkie sugestie i pomoc.
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • #2
    ghost2000
    Level 18  
    Czy wszystkie silniki maja działać równocześnie czy tylko jedne z nich?
  • #3
    jfiglak666
    Level 5  
    Maksymalnie dwa na raz (osie X i Y), ale niekoniecznie, chciałbym zacząć od niezależnej pracy "sekwencyjnej".
  • #4
    ghost2000
    Level 18  
    Program jest tak "bogato" komentowany, że wszystko "wiem". "Nie brakuje" oczywiście deklaracji stałych. Naturalnie "wiem" co robi funkcja takeSteps.
    Czy silnik jest podłączony do portu D?

    PS
    Jeśli liczysz na pomoc, umieść cały kod.
  • #5
    jfiglak666
    Level 5  
    Przepraszam, nie mam teraz dostępu do całego kodu, wkleiłem tylko fragmenty, które miałem wcześniej skopiowane. Wieczorem uzupełnię.

    Funkcja takeSteps:

    Code: c
    Log in, to see the code


    Tak, silnik jest na porcie D (docelowo cały port będzie obsadzony wyprowadzeniami sterowników A4988 - korzystam tylko ze STEP i DIR, sterowanie pełnokrokowe).

    W skrócie moje pytanie sprowadza się do prośby o wskazówkę, jak dobrze zbudować tablicę, przechowującą adresy pinów portu D poszczególnych silników i jak potem odwoływać się w funkcjach do tej tablicy, aby w przerwaniu zmieniany był tylko stan jednego z pinów tego portu.
  • #6
    jfiglak666
    Level 5  
    Uzupełniłem bibliotekę do sterowania silnikiem o komentarze, mam nadzieję, że teraz będzie dokładnie wiadomo, o co mi chodzi.

    Code: c
    Log in, to see the code


    Code: c
    Log in, to see the code


    Moim celem jest taka modyfikacja napisanych funkcji, aby można było za ich pomocą sterować czterema silnikami, przekazując do nich w postaci argumentu np. nr silnika.
  • Helpful post
    #7
    ghost2000
    Level 18  
    Pierwsze, to nie możesz kuglować włączaniem i wyłączaniem przerwań. Silnik musisz zatrzymywać w inny sposób.
    z stepCounter zrób tablicę stepCounter[4];

    Przerwanie zmodyfikuj mniej więcej tak
    Code: c
    Log in, to see the code

    Naturalnie, wszystkie inne fragmenty kodu, gdzie występuje PORTD i stepCounter trzeba zmodyfikować.
    Przy okazji, nie używaj PORTD , zrób to przez define.

    Nie przyjrzałem się jak jest modyfikowana prędkość. Popatrzę w wolnej chwili i napisze jak to widzę.
  • #8
    jfiglak666
    Level 5  
    Super, dzięki bardzo. Na razie próbuję to ogarnąć w ten sposób (wrzucam tylko zmodyfikowane fragmenty):

    dodatkowe definicje:

    Code: c
    Log in, to see the code


    modyfikacja deklaracji funkcji rampy:

    Code: c
    Log in, to see the code


    modyfikacja procedury obslugi przerwania:

    Code: c
    Log in, to see the code


    Dlaczego nie stosować włączania i wyłączania przerwań? Przyznam, że bazuję na kodzie z książki "Programowanie układów AVR dla praktyków" i tam właśnie tak jest to rozwiązane.
  • #9
    ghost2000
    Level 18  
    Pozostaje problem prędkości. Najlepszym rozwiązaniem byłoby wykorzystanie przerwań OCRxA, OCRxb itp. Jam M32 nie ma odpowiedniej liczby kanałów, użyj Mega324, który ma taka sama pinologię a jest bardziej wypasiony. Wtedy będziesz miał kilka przerwań np

    Code: c
    Log in, to see the code

    Wtedy możesz używać włączania i wyłączania przerwań.

    Na razie, nie wiedze możliwości zrealizowania tego na jednym przerwaniu, jak proponowałem wcześniej jeśli silniki mają byc niezależnie rozpędzane i hamowane. Gdyby miały pracować ze stała prędkością, byłoby ok.