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 silnikiem krokowym

aster001 04 Gru 2004 13:16 11262 13
  • #1 04 Gru 2004 13:16
    aster001
    Poziom 11  

    Witam wszystkich,

    załaczyłem schemacik, układ ma sterowac silnikiem krokowym
    z klawiaturki,ktora jeszcze nalezy dołaczyc ,sterowanie typu 10 krokow w prawo, drugi przycisk 20 w lewo, inny 100 w prawo.
    Ewentualnie jeden przycisk do mniany trybu innych przycisków.

    Prosze o sugestie dotyczace schematu czy jest OK, czy należy cos poprawic i jak zabrac sie do pisania programu w asemblerze,
    pisałem troszke w asemblerze ale to było pare lat temu
    i trudno mi teraz do tego wracac.

    Bede wdzieczny za każda sugestie.

    0 13
  • #2 04 Gru 2004 17:38
    Dareks
    Poziom 19  

    Witam

    Wydaje mi się że układ 7438 jest nie potrzebny, do pozostałych wyjść układu ULN2803 dodałbym diody świecące sygnalizujące stan układu. Wyprowadzenie '20' tego mikrokontrolera to jest zasilanie, musisz skorygować układ połączeń.

    1
  • #3 04 Gru 2004 17:54
    aster001
    Poziom 11  

    Układ 7438 zalecano mi wstawic poniewaz po właczeniu zasilania na wyjsciach Atmela pojawiaja sie jedynki i to wpływa na silnik.

    0
  • #4 05 Gru 2004 15:07
    aster001
    Poziom 11  

    Ale i tak cos mi nie pasuje, po właczeniu zasilania wszystkie diody swieca,
    a chciałbym zrobic taka aby po właczeniu zasilania nie było napiecia
    na fazach silnika.

    0
  • #5 05 Gru 2004 15:19
    Krzychu ADC
    Poziom 14  

    Przecierz diody masz włączone między zasilaniem a cewkami Diody świecą właśnie wtedy gdy niema napięcia na fazach (jest zero).

    Tak jak napisał Dareks ATMEL na pin 20 ma zasilanie a na 10 masę i muszą być podłączone bezpośrednio.
    Sygnały sterujące silnikiem powinny być podpięte do portu (np piny 19,18,17,16).
    Diody świecą ponieważ na wyjściu ATMELA nie ma 1 tylko są zera bo on wogóle nie pracuje :!:

    0
  • #6 05 Gru 2004 18:14
    aster001
    Poziom 11  

    Z tym 20 pinem w Atmelu to sie pomyliłem, oczywista sprawa,ze ma isc do zasilania.

    Wyrzuciłem układ 7438 i podłaczyłem porty bezposrednio do ULN2803,
    rezystory podciagajace pozostawiłwm.


    P1.7 --------- 1 IN
    P1.6 --------- 2 IN
    P1.5 --------- 3 IN
    P1.4 --------- 4 IN

    Po właczniu zasilania na porcie P1.7 jest 1V, P1.6,P1.5 i P1.4 sa 3V,

    a na P1.3,P1.2,P1.1 i P1.0 jest 5v,


    W Atmelu jest taki programik

    ;------------------------------------

    org 100h

    START:
    ljmp POCZ

    POCZ:

    mov c,0
    mov p1.7,c

    moc c,#0h
    mov p1.6,c

    mov c,#0h
    mov p1.5,c

    mov c,#0h
    mov p1.4,c


    mov c,P1.0
    mov P1.7,c
    mov c,P1.1
    mov P1.6,c
    mov c,P1.2
    mov P1.5,c
    mov c,P1.3
    mov P1.4,c

    sjmp POCZ
    end

    ;-------------------------------

    0
  • #7 05 Gru 2004 18:24
    aster001
    Poziom 11  

    Kurcze znowu pomyłka w Atmelu jest taki programik
    ;------------------------------------

    org 100h

    START:
    ljmp POCZ

    POCZ:

    mov c,P1.0
    mov P1.7,c
    mov c,P1.1
    mov P1.6,c
    mov c,P1.2
    mov P1.5,c
    mov c,P1.3
    mov P1.4,c

    sjmp POCZ
    end

    ;-------------------------------

    0
  • #8 05 Gru 2004 18:41
    olekewaagata
    Poziom 25  

    To nigdy tak nie bedzie działać.
    org 100h jest zbędny, tak samo ljmp pocz, po start przeciez już jest pocz, więc usuń start i ljmp.
    Poczytaj o rozkazach SETB i CLR.
    Poza tym dokładnie poznaj sposób sterowania silnika krokowego, Ty dajesz jednoczesnie napięcie na wszystkie uzwojenia silnika krokowego i klapa. Wystawione napięcia na odpowiednie cewki silnika musi być podtrzymane przez odpowiedni czas (np kilka milisekund) a potem musi byc zasilenie innych cewek silnika krokowego. Bez schematu jest mi to cieżko wytlumaczyć, ale to jest proste.

    0
  • #10 06 Gru 2004 16:02
    olekewaagata
    Poziom 25  

    Dobrze, ja jeszcze proponuję żebyś odłączył silnik krokowy a zostawił same diody-led i tak napisał program żebyś widział kolejność zapalania sie led-ów, potem zmienił częstotliwość i dołaczył silnik krokowy. Eksperymentując z podłączonym silnikiem albo uwalisz silnik albo uln-a.
    A najważniejsze zebyś w następnych postach (jeśli sobie nie poradzisz) od razu dołączał program.

    0
  • #11 07 Gru 2004 11:18
    SIEKIERA_666
    Poziom 21  

    Witam
    Najprostrzy program ( zakładając że silnik sterowany jest 1 logiczną ) mógłby wyglądać tak :

    START:
    MOV P1,#128 ; STAN WYSOKI NA P1.7 (dla P1.7=0 #127)
    LCALL OPU
    MOV P1,#64 ; STAN WYSOKI NA P1.6 (dla P1.6=0 #191)
    LCALL OPU
    MOV P1,#32 ; STAN WYSOKI NA P1.5 (dla P1.5=0 #223)
    LCALL OPU
    MOV P1,#16 ; STAN WYSOKI NA P1.4 (dla P1.4=0 #239)
    LCALL OPU
    LJMP START

    OPU: ?????? ; PĘTLA OPÓŹNIAJĄCA
    RET ;

    Proszę wybaczyć jeśli popełniłem siakieś kardynalne błędy - od jakiegoś czsu nie używam '51 na rzecz AVR'ów. Chodziło mi raczej o samą strukturę programu. Nie należy zapominać o skokach do OPUźnienia gdyż przy kwarcu ok 12 Mhz mamy 1us na instrukcję, a z taką f silnik sobie nie poradzi. :twisted:
    Poza tym należy sprawdzić czy w warunkach podawania 1 lub 0 kolejno na P1.7 - P1.4 silnik bedzie się obracał. Schemat schematem - praktyka wykazuje że silnik może mieć zamienione wyprowadzenia i nie bedzie się kręcił tylko tykał w te i z powrotem :wink:
    Jednocześnie przepraszam kolegę aster001 za duże opóźnienia w pisaniu postów na PW. :wink:

    :sm19:

    0
  • #12 08 Gru 2004 10:21
    aster001
    Poziom 11  

    Przesyłam ponownie schemat, co sie okazało miałem walniety
    układ 7438 i dlatego diody za ULN2803 swieciły.

    Atmel po właczeniu na portach P1.4 do P1.7 ma "1", układ 7438
    robi "0" i diody gasna i o to mi chodziło. Silnik jest w stanie spoczynku.

    Program,ktory wczesniej przedstawiłem działa bez problemu,
    teraz moge wstawic jeszcze jeden przycisk do zmiany trybu pozostałych przyciskow i sterowac jednym np. 100 krokow w prawo innym 10 krokow w lewo.

    Tylko jak to najlepiej wykombinowac w asemblerze?

    0
  • #13 10 Lut 2006 11:42
    chszanek
    Poziom 13  

    Witam.
    ja mam też problem z silnikiem krokowym.
    Wymontowałem go z dysku twardego(więc może to jest raczej DLDC ale nie jestem pewien). W każdym razie zrobiłem układ jak na schemacie , na:
    - Atmega8
    - BS170
    - rezystorki
    i to wszystko. I moim zdaniem (czyli wątpliwe;) ) to powinno działać. Pobniżej przedstawiam kod programu . Może coś robie źle :( , już sam nie wiem(napisaem 2 programy w C i w ASM).

    pozdrawiam i z góry dzięki za info
    :

    w ASM:

    Code:

    .INCLUDE "m8def.inc"

    .EQU SYS_FREQ = 1 ;CZESTOTLIWOSC ZEGARA PROCKA [ MHZ ]
    .EQU xx = 1


    Set_Port_B_As_Output:

          ldi R16 ,0xFF
          out DDRB , R16

    rjmp FORWARD

    walkDelay:
       ldi R18, 1         ;T1 used as delay 2nd count
       ldi R19, 1         ;T2 used as delay 3nd count
    delay_1:
       dec R18
       brne delay_1
       dec R19
       brne delay_1
       dec R20          ;temp must be preset as
       brne delay_1          ; delay master count
       ret
             

    FORWARD:                     ; OBROT DO PRZODU
       
          ldi R16 , 0b10000011
          out PORTB , R16
          ldi   R20, xx
          rcall walkDelay

          ldi R16 , 0b01000101
          out PORTB , R16
          ldi   R20, xx   
          rcall walkDelay

          ldi R16 , 0b00101001
          out PORTB , R16
          ldi   R20, xx
          rcall walkDelay


          RJMP PETLA

    BACKWARD:                     ; OBROT DO TYLU
       
          ldi R16 , 0b00111111
          out PORTB , R16

       
          ldi R16 , 0b01011111
          out PORTB , R16

          ldi R16 , 0b10010111
          out PORTB , R16
          
          RJMP PETLA

    STOP:                        ;ZATRZYMANIE SILNIKA




          ldi R16 , 0b00001111
          out PORTB , R16   


          LDI R16 , 0b00000001
          out PORTB , R16
                   
          
    PETLA:
       
          rjmp FORWARD
       
       rjmp PETLA


    ;Set_Port_B_Output
    ;Put_On_PORTB


    w C:

    Code:


    #include <avr/io.h>
    #define F_CPU 1000000                        //do określenia częstotliwości procka dla "delay"
    #include <avr/delay.h>
    #include <math.h>

    #define LED_ON PORTB|=(1<<PB0)                  //PORTB|=1<<PB1 - wysyła "1" na wyjście portu
    #define LED_OFF PORTB&=(~1<<PB0)
    #define CONTROL_LED_ON PORTD|=(1<PD0)
    #define CONTROL_LED_OFF PORTD&=(~1<PD0)

    void init_port(void)
       {
       DDRB = 0xff;
       PORTB = 0x00;
       }
       
    void FORWARD(int czas)
       {
    //   PORTB&=0b10000001;
    //   _delay_ms(czas);
    //   PORTB&=0b01000010;
    //   _delay_ms(czas);
    //   PORTB&=0b00100100;
    //   _delay_ms(czas);
       PORTB|=(1<<PB7);
       PORTB&=(0<<PB6);
       PORTB&=(0<<PB5);
       _delay_ms(czas);
       
       PORTB&=(0<<PB7);
       PORTB|=(1<<PB6);
       PORTB&=(0<<PB5);
       _delay_ms(czas);
       
       PORTB&=(0<<PB7);
       PORTB&=(0<<PB6);
       PORTB|=(1<<PB5);
       _delay_ms(czas);
       
       }

    void STOP(int czas)
       {
       if (czas <= 20)
          {
          PORTB&=0b11100111;
          _delay_ms(czas);
          }
       }

    int main(void)
    {
       init_port();
       for(;;)
          {
          FORWARD(10);
          }
       return 0;
    }

    0