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.

ATmega32 sterowanie silnikami krokowymi - robot kartezjański

jfiglak666 14 Mar 2018 08:43 495 8
  • #1 14 Mar 2018 08:43
    jfiglak666
    Poziom 3  

    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.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z góry bardzo dziękuję za wszystkie sugestie i pomoc.

    0 8
  • #2 14 Mar 2018 09:16
    ghost2000
    Poziom 17  

    Czy wszystkie silniki maja działać równocześnie czy tylko jedne z nich?

    0
  • #3 14 Mar 2018 09:18
    jfiglak666
    Poziom 3  

    Maksymalnie dwa na raz (osie X i Y), ale niekoniecznie, chciałbym zacząć od niezależnej pracy "sekwencyjnej".

    0
  • #4 14 Mar 2018 09:39
    ghost2000
    Poziom 17  

    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.

    0
  • #5 14 Mar 2018 09:59
    jfiglak666
    Poziom 3  

    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:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    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.

    0
  • #6 19 Mar 2018 15:24
    jfiglak666
    Poziom 3  

    Uzupełniłem bibliotekę do sterowania silnikiem o komentarze, mam nadzieję, że teraz będzie dokładnie wiadomo, o co mi chodzi.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    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.

    0
  • Pomocny post
    #7 19 Mar 2018 15:45
    ghost2000
    Poziom 17  

    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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    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ę.

    0
  • #8 19 Mar 2018 15:51
    jfiglak666
    Poziom 3  

    Super, dzięki bardzo. Na razie próbuję to ogarnąć w ten sposób (wrzucam tylko zmodyfikowane fragmenty):

    dodatkowe definicje:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    modyfikacja deklaracji funkcji rampy:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    modyfikacja procedury obslugi przerwania:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    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.

    0
  • #9 19 Mar 2018 15:54
    ghost2000
    Poziom 17  

    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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    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.

    0