logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega32 sterowanie silnikami krokowymi - robot kartezjański

jfiglak666 14 Mar 2018 08:43 834 8
REKLAMA
  • #1 17101790
    jfiglak666
    Poziom 7  
    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 / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z góry bardzo dziękuję za wszystkie sugestie i pomoc.
  • REKLAMA
  • #2 17101852
    ghost2000
    Poziom 18  
    Czy wszystkie silniki maja działać równocześnie czy tylko jedne z nich?
  • #3 17101857
    jfiglak666
    Poziom 7  
    Maksymalnie dwa na raz (osie X i Y), ale niekoniecznie, chciałbym zacząć od niezależnej pracy "sekwencyjnej".
  • REKLAMA
  • #4 17101893
    ghost2000
    Poziom 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.
  • REKLAMA
  • #5 17101928
    jfiglak666
    Poziom 7  
    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 / 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.
  • #6 17114009
    jfiglak666
    Poziom 7  
    Uzupełniłem bibliotekę do sterowania silnikiem o komentarze, mam nadzieję, że teraz będzie dokładnie wiadomo, o co mi chodzi.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / 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.
  • Pomocny post
    #7 17114034
    ghost2000
    Poziom 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
    Kod: C / 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ę.
  • #8 17114043
    jfiglak666
    Poziom 7  
    Super, dzięki bardzo. Na razie próbuję to ogarnąć w ten sposób (wrzucam tylko zmodyfikowane fragmenty):

    dodatkowe definicje:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    modyfikacja deklaracji funkcji rampy:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    modyfikacja procedury obslugi przerwania:

    Kod: C / 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.
  • REKLAMA
  • #9 17114047
    ghost2000
    Poziom 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

    Kod: C / 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.
REKLAMA