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.

Sterowanie dwoma silnikami krokowymi jedną Atmegą32 C

*vip* 23 Maj 2013 14:31 1722 5
  • #1 23 Maj 2013 14:31
    *vip*
    Poziom 17  

    Witam,
    Mam problem - napisałem program do sterowania silnikiem krokowym (w małym ploterze CNC z osiami X, Y). Sterowanie jednym silnikiem odbywa się bez najmniejszego problemu (silniki bipolarne, na wyjściu mostki H z mosfetów) natomiast gdy chcę dołączyc do tego sterowanie drugą osią, działa ono tylko gdy pracuje silnik pierwszej osi. Nie mogę dojść co jest źle w programie...nie można umieścic dwóch pętli switch pętli while(1) ? Proszę o pomoc.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 5
  • #3 23 Maj 2013 15:03
    tmf
    Moderator Mikrokontrolery Projektowanie

    Dobra rada - skasuj to co napisałeś bo do niczego się to nie nadaje. A potem zrób porządnie. Czyli w oparciu o przerwania, w których sterujesz krokowcem.

    0
  • #4 23 Maj 2013 15:19
    piotrva
    Moderator na urlopie...

    Dokładnie. te _delay_ms(x); to już gwoździe do trumny tego programu.
    Po pierwsze wszystko do przerwania, a po drugie musisz stosować maskowanie bitów, tak aby zmiana kombinacji 4-rech pierwszych (I silnik) nie wpływała na zmianę kombinacji kolejnych 4-rech (II silnik).

    0
  • #5 23 Maj 2013 21:38
    2P
    Poziom 19  

    Założyłem raczej, że to program napisany na szybko na kolanie, do sprawdzenia fizycznej możliwości wysterowania silników - wtedy sama modyfikacja obsługi portów pomoże. Ale jeśli to ma być poważna aplikacja to muszę się zgodzić z przedmówcami...

    0
  • #6 27 Maj 2013 19:52
    *vip*
    Poziom 17  

    Dzięki za odpowiedzi. Rzeczywiście nie zauważyłem, że jedna pętla wpływa na drugą. Podłączyłem jeden silnik do portu D, drugi do portu A i problem się rozwiązał. Wszystko śmiga aż miło.

    Ostrej krytyki niestety nie rozumiem (może dlatego, że jestem bardzo początkujący w dziedzinie programowania uc).
    Domyślam się, że chodzi o długi czas wykonywania pętli while(1), jednak mimo tego jest on dla tego zastosowania (chyba) akceptowalny.
    Procesor ma sterować małym ploterkiem rysującym, prędkość robocza jest niewielka - zazwyczaj ustawiam opóźnienia na 100ms. Planuję zamienic sterowanie przyciskowe na sygnały step/dir, podłączyc to pod lpt i sterowac z jakiegos programu cnc typu mach3.

    Możliwe jednak, że program będzie wysyłał sygnały step szybciej niż wykonuje się program w uc (taktuje go wewnętrznym rezonatorem 8mhz), dlatego chętnie przerobił bym to na przerwania, ale mimo, że sporo o nich czytałem nie rozumiem koncepcji dla tego przypadku.
    Co powinienem wrzucic do przerwania ? Zwiększanie liczników ? Funkcje wyjsc (stany na portach) w zależnosci od stanów liczników ? Czym powinienem wyzwalac przerwanie ? Zewnętrznymi sygnałami z INT0, INT1 ? W ATmedze32 mam tylko 2 użyteczne do tego celu przerwania zewnętrzne, a sygnały sterujące do tego ploterka są aż 4 (po 2 dla osi), proszę szersze opisanie koncepcji przerwań w tym programie, pozdrawiam !

    0