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

jak napisac sterownik do silnika krokowego w assemblerze

wddf 24 Sty 2005 13:31 1829 1
REKLAMA
  • #1 1165090
    wddf
    Poziom 18  
    Mam problem, jak napisac sterownik do silnika krokowego w assemblerze pod procesor Atmela np. 8515?

    Silnik krokowy jest podłączony do 4 najmłodszych wyjść ekspandera PCF8574 przez wzmacniacze prądowe ULN2803. Przepływ prądu przez wybraną cewkę silnika uzyskuje się podając wartość “0” na pozycje bitową odpowiadającą wyprowadzeniu ekspandera do którego podłączona jest cewka.
    Zatem na początku programu należy wszystkie wyjścia ekspandera ustawić w stan “1”.
    Interesuje mnie sterowanie jednofazowe. Przy takim sterowaniu w danej chwili czasu prąd przepływa tylko przez jedno uzwojenie silnika.
    Trzeba tak zmontowac program żeby po nacisnieciu klawisza „start” powtarzal petle dawania na nozki portu A: 0111, 1011, 1101, 1110, dopoki nie zostanie wcisniety klawisz „stop”, przy przycisku „zmiana kierunku” powinien zatrzymac silnik czyli dac: 1111 i za jakis czas dawac w odwrotnej kolejności: 1110, 1101, 1011, 0111.

    Szczerze to nie mam bladego pojecia jak to zrobic i za pomoc z gory dziekuje

    Nie bede ukrywal ze mam to na zaliczenie, takze pomagajac ratujesz mnie przed powtorka semestru!!!
    (!!) - ozdobnik? [h]
  • REKLAMA
  • Pomocny post
    #2 1165589
    Paweł Es.
    VIP Zasłużony dla elektroda
    Mały szantażyk psychologiczny, no no assemblera się nie chciało nauczyć ale granie na ludzkich uczuciach mamy już opanowane

    Cytat:
    Nie bede ukrywal ze mam to na zaliczenie, takze pomagajac ratujesz mnie przed powtorka semestru!!!


    Poniżej podaję ci szkic rozwiązania, poszczególne linie trzeba
    dopracować do konkretnego sprzętu (niedokładnie go opisałeś)

    sekwencja

    port:=x;

    u ciebie będzie polegała na wysłaniu liczby x na łącze i2c, do którego jest podłączony ekspander PCF8574 (pamiętaj o adresie}


    KL_STOP, KL_START, KL_ZMIANA - stałe odpowiadające wciskanym klawiszom.

    { To jest komentarz }

    
    
    { Tutaj inicjacja procesora, stosu, portów, UART, itd }
    { R0 - znacznik praca
       R1 - znacznik kierunek
       R2 - znacznik poprzedniego kierunku
       R5 - wcisniety klawisz
    
    port:=15;     {4 jedynki  na wyjściu }
    
    LDI R0,#0;   {praca =0 silnik stoi, =1 silnik się obraca }
    LDI R1,#0;   {kierunek =0 lewo, =1 prawo}
    LDI R2,#0;   {kier0 = zapamiętanie poprz. stanu znacznika kierunku}
    
    pocz:
    
     icall keyb; {Powiedzmy odpowiedź jest w R5}
    
     cpi R5,#KL_STOP
     brne nie_kl_stop;
    
     ldi R0,#0;  {Znacznik pracy  silnika na stop}
    
    nie_kl_stop: 
    
     cpi R5,#KL_START; {Porównanie rejestru ze stałą}
     brne nie_kl_praca; {Skok jeżeli nie równe }
     
     ldi R0,#1; {Znacznik pracy silnika na start }
    
    nie_kl_praca: if nie key_zmiana goto nie_kl_zmiana
    
    mov R2,R1; {kier0:=kier; Zapamietanie poprzedniego kierunku }
    
    ldi R3,#1     {kier:=1-kier Zmiana znacznika kierunku na przeciwny }
    sub R3,R1;
    mov R1,R3;
    
    nie_kl_zmiana:
    
    cpi R1,R2;
    brne bez_zmiany; {if kier0=kier then goto bez_zmiany}
    
    port:=15;        { Stop silnika }
    icall Delay2;    {Czas na zastopowanie }
    mov R2,R1;     {kier0:=kier; zapamietanie, że wyhamowano silnik}
    
    bez_zmiany: 
    
    cpi R0,#1;
    brne      zatrzymaj;
    
    cpi R0,#0;
    brne w_prawo;
    
         {Obracanie w lewo 1 cykl}
          port:=7;
          icall Delay1;
          port:=11;
          icall Delay1;
          port:=13;
          icall Delay1;
          port:=14;
          icall Delay1;
          rjmp pocz; {Na poczatek}
    
    w_prawo:
                           {Obracanie w prawo 1 cykl}
          port:=14;
          icall Delay1;
          port:=13;
          icall Delay1;
          port:=11;
          icall Delay1;
          port:=17;
          icall Delay1;
    
          rjmp pocz;
    
    zatrzymaj:
    
          port:=15;
          icall Delay2;  {Czas na zatrzymanie}
          rjmp pocz; 
    
    
    


    keyb - odczyt klawiszy (bez opóźniania, bo silnik będzie dukał}

    Delay1 - podprogram z pętlą opóźniającą okreslającą czas pomiędzy zmianą faz silnika;

    Delay2 - podprogram z pętlą opóźniającą okreslającą czas na pewne zatrzymanie silnika;
REKLAMA