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

Jak zaprogramować sterowanie silnikiem krokowym z klawiatury w asemblerze?

aster001 04 Gru 2004 13:16 11742 13
  • #1 1035481
    aster001
    Poziom 11  
    Posty: 69
    Pomógł: 2
    Ocena: 3
    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.
    Załączniki:
    • Jak zaprogramować sterowanie silnikiem krokowym z klawiatury w asemblerze? at89c2051.jpg (74.28 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #2 1036119
    Dareks
    Poziom 20  
    Posty: 289
    Pomógł: 30
    Ocena: 29
    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ń.
  • #3 1036161
    aster001
    Poziom 11  
    Posty: 69
    Pomógł: 2
    Ocena: 3
    Układ 7438 zalecano mi wstawic poniewaz po właczeniu zasilania na wyjsciach Atmela pojawiaja sie jedynki i to wpływa na silnik.
  • #4 1038154
    aster001
    Poziom 11  
    Posty: 69
    Pomógł: 2
    Ocena: 3
    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.
  • #5 1038186
    Krzychu ADC
    Poziom 15  
    Posty: 97
    Pomógł: 9
    Ocena: 3
    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 :!:
  • #6 1038592
    aster001
    Poziom 11  
    Posty: 69
    Pomógł: 2
    Ocena: 3
    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

    ;-------------------------------
  • #7 1038630
    aster001
    Poziom 11  
    Posty: 69
    Pomógł: 2
    Ocena: 3
    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

    ;-------------------------------
  • #8 1038688
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    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.
    Załączniki:
    • Silnik-krokowy[1].pdf (100.03 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #9 1038873
    aster001
    Poziom 11  
    Posty: 69
    Pomógł: 2
    Ocena: 3
    Wyrzuciłem układ 7438, układ wyglada teraz nastepujaco.
    Załączniki:
    • Jak zaprogramować sterowanie silnikiem krokowym z klawiatury w asemblerze? at89c.jpg (72.8 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 1040815
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    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.
  • #11 1042756
    SIEKIERA_666
    Poziom 22  
    Posty: 505
    Pomógł: 22
    Ocena: 79
    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:
  • #12 1045201
    aster001
    Poziom 11  
    Posty: 69
    Pomógł: 2
    Ocena: 3
    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?
    Załączniki:
    • Jak zaprogramować sterowanie silnikiem krokowym z klawiatury w asemblerze? atmel.jpg (79.32 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #13 2284214
    chszanek
    Poziom 13  
    Posty: 122
    Pomógł: 5
    Ocena: 9
    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:
    
    .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:

    
    
    #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;
    }
    
    
    Załączniki:
    • Jak zaprogramować sterowanie silnikiem krokowym z klawiatury w asemblerze? 1.JPG (55.12 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Dyskusja dotyczy programowania sterowania silnikiem krokowym za pomocą klawiatury w asemblerze, z wykorzystaniem mikrokontrolera Atmel i układu ULN2803. Autor zamierza sterować silnikiem krokowym w trybach: 10 kroków w prawo, 20 w lewo, 100 w prawo oraz zmieniać tryby przy pomocy dodatkowego przycisku. Wskazano błędy w schemacie, m.in. niepotrzebne użycie układu 7438, który miał za zadanie eliminować niepożądane stany na wyjściach po włączeniu zasilania. Zalecane jest bezpośrednie podłączenie portów mikrokontrolera do ULN2803 z rezystorami podciągającymi oraz dodanie diod LED sygnalizujących stan wyjść. Omówiono problem początkowego stanu portów i konieczność prawidłowego ustawienia pinów zasilania (pin 20 Atmela do Vcc, pin 10 do masy). Przedstawiono przykładowy, prosty program w asemblerze do sterowania portami P1.4–P1.7, z uwzględnieniem opóźnień dla prawidłowego sterowania silnikiem krokowym. Podkreślono, że napięcie nie może być podawane jednocześnie na wszystkie cewki, lecz kolejno z odpowiednim czasem podtrzymania. Sugerowano testowanie programu najpierw na diodach LED zamiast silnika, aby uniknąć uszkodzeń. Wskazano także na konieczność poznania dokładnego schematu i zasad sterowania silnikiem krokowym. W dalszej części dyskusji pojawiły się przykłady kodu w asemblerze i C dla mikrokontrolera Atmega8 oraz sugestie dotyczące struktury programu i obsługi przycisków do zmiany trybów pracy silnika.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA