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

Sterowanie silnikiem krokowym

24 Sty 2010 21:20 1580 6
  • Poziom 2  
    Muszę napisać program w C pod ATmega8 pozwalający na sterowanie silnikiem krokowym (używam bipolarnego). Udało mi się uzyskać ciągłe obracanie się silnika, wykorzystując odpowiednią sekwencję podawania sygnałów na cewki z odpowiednim delayem. Jadnak jak powinna wyglądać funkcja, która wywołą obrót tylko o jeden krok? Wydaje się że z pracy ciągłej łatwo przejść do pojedyńczych kroków ale niestety po próbach napisania funkcji silnik zamiast się obrócić wykonuje tyko drobne drgania. Co może być tego przyczyną?
  • Poziom 9  
    Masz takie coś, jeżeli sam wystawiasz sygnał na cewki:
    Code:

       OUT1_ON;
       OUT2_OFF;
       OUT3_OFF;
       OUT4_OFF;
       _delay_ms(czas);
       
       OUT1_OFF;
       OUT2_OFF;
       OUT3_ON;
       OUT4_OFF;
       _delay_ms(czas);
       
       OUT1_OFF;
       OUT2_ON;
       OUT3_OFF;
       OUT4_OFF;
       _delay_ms(czas);
       
       OUT1_OFF;
       OUT2_OFF;
       OUT3_OFF;
       OUT4_ON;
       _delay_ms(czas);
    :?:
    Robiąc pracę ciągłą zapętlasz to, a jak chcesz jeden krok no to robisz przejście tylko z jednego stanu na drugi?
  • Poziom 38  
    Przy pracy ciągłej można nie zauważyć że silnik wraca do pozycji początkowej.
    A przy pojedynczym kroku- owszem.
    Podobnie nie wyczujesz pojedynczego kroku- to jest zwykle 1.8 stopni.
    Jak będziesz sterował przy pomocy _delay to szybko zabrniesz w ślepą uliczkę.
    P.S.
    To nie jest dobre.
    Najprymitywniejsze sterowanie to jest:
    1-2-3-4.
  • Poziom 19  
    Albo źle "podzieliłeś" pracę ciągłą na kroki albo sama praca ciągła jest źle napisana. Najlepiej wklej ten fragment
  • Poziom 9  
    janbernat napisał:

    To nie jest dobre.
    Najprymitywniejsze sterowanie to jest:
    1-2-3-4.

    rozumiem, że to było do mojego przykładu kodu, tak więc tutaj dziwną kolejność przyjąłem, tzn się są już od razu wyjścia cewek, które opisane są tak:
    1 A
    2 /A
    3 B
    4 /B

    wtedy się zgadza tak? czy dalej źle myślę?
  • Poziom 2  
    Code:

    int krok(short kroki)
    {
       short kroki_wykonane=0;
       //char TAB[8]={0b10100000,0b11101000,0b01001000,0b11011000,0b10010000,0b11010100,0b01000100,0b11100100};
         char TAB[8]={0b00000101,0b00100111,0b00100010,0b00101011,0b00001001,0b00011011,0b00010010,0b00010111};
       PORTD&=0b01111111;            //zapalenie diody

       while((kroki_wykonane<abs(kroki)))
       {
                if (kroki>=0)
          {
             kroki_wykonane++;
             if ((stan_sil=7)) {stan_sil=0;}
             else stan_sil++;
             PORTB=TAB[stan_sil];
             _delay_ms(1);
          }
          if (kroki<0)
          {
             kroki_wykonane++;
             if ((stan_sil=0)) {stan_sil=7;}
             else stan_sil--;
             PORTB=TAB[stan_sil];
             _delay_ms(1);
          }
       }


    Silnik pracuje półkrokowo, sterowany przez mostek H, funkcja krok powinna umożliwić wykonanie pożądanej liczby kroków. Możesz powiedzieć cos więcej o wracaniu do pozyji początkowej bo zachowanie silknika na to mogłoby wskazywać. Jak można inaczej to rozwiązać? Próbowałem robić to też na przerwaniach od timera zeby zsynchronizować podawanie impulsów w odpowiedniej sekwencji ale bez rezultatów, pewnie nie opanowałem dostatecznie pracy z przerwaniami.
  • Poziom 38  
    Nie do twojego kodu a do sposobu sterowania.
    Nawet w najbardziej prymitywnym układzie da się zrobić pracę półkrokową.
    A pracuje dużo lepiej.
    A- A+B- B itd.
    A _delaj to jest katastrofa.