Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega16]Sterownik silnika krokowego nie chce działać

Student_Bartosh 19 Jul 2011 14:44 3857 25
  • #1
    Student_Bartosh
    Level 9  
    Witam,


    Wykonałem na module uruchomieniowym Atmega ver. 2 sterownik do dwóch unipolarnych silników krokowych. Na porcie A Atmegi podpiąłem mikrostyki, port B połączyłem z układem ULN2803, wyjścia ULN2803 podpiąłem do silników krokowych.

    Kiedy naciskałem mikrostyk, na port B wyprowadzana była sekwencja, która obracała silnikiem krokowym do momentu zwolnienia przycisku. Zaprogramowałem tak cztery przyciski, odpowiednio lewo/prawo dla każdego silnika krokowego.

    Wszystko działało. Program zamieszczam poniżej, może komuś się przyda.
    
    .include"m32def.inc"
    .cseg
    .org 0
    
    .def acc=r16
    .def delay=r17
    .def delay1=r18
    .def delay2=r19
    
    
    ldi acc,HIGH(RAMEND) ; Definicja stosu
    out SPH,acc
    ldi acc,LOW(RAMEND)
    out SPL,acc
    
    
    Main:
    ldi acc,0b00000000   
    out DDRA,acc       ;wszystkie bity jako wejscie
    ldi acc,0b11111111  
    out PORTA,acc     ;wszystkie wejscia w stanie wysokim
    out DDRB, acc       ;wszystkie bity jako wyjscia
    ldi acc,0b11111111   ;wszystkie diody wylaczone
    out PORTB,acc
    
    
    Odczyt:
    in acc, pina
    
    sbrs acc, 7
      rjmp kombinacja1
    sbrs acc, 6
      rjmp kombinacja2
    sbrs acc, 5
      rjmp kombinacja3
    sbrs acc, 4
      rjmp kombinacja4
      ldi acc,0b11111111   ;wszystkie diody wylaczone
    
    out PORTB,acc
    rjmp Odczyt   
    
    
    Kombinacja1:
        ldi acc,0b01101111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11001111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b10011111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b00111111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    
    rjmp odczyt
    
    Kombinacja2:
    
    	ldi acc,0b00111111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b10011111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11001111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b01101111
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    
    rjmp Odczyt
    
    Kombinacja3:
    
    	ldi acc,0b11110110
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11111100
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11111001
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11110011
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    
    rjmp Odczyt
    
    Kombinacja4:
    
        ldi acc,0b11110011
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11111001
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11111100
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    	ldi acc,0b11110110
    	out PORTB,acc
    	ldi delay,0x01
    	rcall delayms
    
    rjmp Odczyt
    
    delayms:		;poczatek podprogramu
    ldi delay1,0xee
    dloop2:
    ldi delay2,0xdd	;wykonanie petli 255 razy
    dloop1:
    dec delay2	;t=1/fx255
    brne dloop1
    dec delay1		;t=1/fx255x255
    brne dloop2
    dec delay
    brne delayms
    ret
    


    Problem pojawił się w miejscu, kiedy chciałem przenieść wszystko na płytkę uniwersalną. Układ składa się z zasilacza 12V 1.25A, Atmegi16, dwóch ULN2803 i stabilizatora napięcia LM7805. Po naciśnięciu mikrostyku nic się nie dzieje :( Poniżej zamieszczam obrazek wykonanych połączeń.

    [Atmega16]Sterownik silnika krokowego nie chce działać

    Wydawało mi się, że wszystko jest OK, ale skoro nie działa to gdzieś musiałem popełnić błąd. Zmierzone napięcie z LM7805 do Vcc i AVcc Atmegi16 wynosi 4,8V.
    Może gdzieś nie chce stykać kabelek? Może przenieść od razu to wszystko na płytkę uniwersalną?
  • #2
    Slkkk
    Level 14  
    Spowolnij procedurę delay, aby miernik nadążał mierzyć zmieniające się napięcie na wejściach ULN-ów, i posprawdzaj miernikiem, czy dostają one prawidłowe sygnały na wejście oraz czy na wyjściach pojawia się to co trzeba.
  • #3
    janbernat
    Level 38  
    A gdzie jest doprowadzone zasilanie silników?
    ULN ma wyjście otwarty kolektor- spuści prąd do masy przez uzwojenie silnika- ale z drugiej strony uzwojenia musi mieć napięcie.
  • #4
    Student_Bartosh
    Level 9  
    Slkkk wrote:
    Spowolnij procedurę delay, aby miernik nadążał mierzyć zmieniające się napięcie na wejściach ULN-ów, i posprawdzaj miernikiem, czy dostają one prawidłowe sygnały na wejście oraz czy na wyjściach pojawia się to co trzeba.


    Spowolniłem procedurę delay, na diodach widać teraz, że jeden krok trwa około 1 sekundy. Sprawdziłem na module uruchomieniowym, ale tylko napięcie wyjściowe na ULN2803. Dla spowolnionej procedury delay wynosi ono 0,6V kiedy przycisk nie jest wciśnięty i 1,4-1,6V dla przycisku wciśniętego. Dla normalnej procedury, kiedy nie jest nic wciśnięte na wyj ULN2803 też jest 0,6V i 1,4-1,6V dla wciśniętego przycisku. Dodam jeszcze, że silnik krokowy nie był podpięty. To było sprawdzenie na sucho.

    Przeniosłem procesor na makietę. Sytuacja jakby odwrotna. Kiedy przycisk wciśnięty to napięcie na wyj ULN2803 wynosi około 1,6V a czasem nawet więcej, 2,0V. Kiedy zwalniam przycisk to napięcie na wyj ULN2803 wynosi 0,2V. Też sprawdzałem bez silnika krokowego podpiętego. Wygląda na to, że jest odwrócona logika.

    Zauważyłem jeszcze coś ciekawego. Dla spowolnionej procedury każde wyście ma takie same napięcie wyjściowe. Czyżby brakowało rezonatora kwarcowego?

    Dodano po 1 [minuty]:

    janbernat wrote:
    A gdzie jest doprowadzone zasilanie silników?


    Oczywiście, zapomniałem dodać. Silniki biorą napięcie z zasilacza z miejsca oznaczonego na rysunku jako "+12V".
  • #5
    Slkkk
    Level 14  
    Student_Bartosh wrote:

    Przeniosłem procesor na makietę.


    To znaczy, że wyjąłeś go z zestawu uruchomieniowego i włożyłeś na swojej płytce? Jeśli tak, to prawie na pewno to nie zadziała, gdyż w zestawie zapewne jest kwarc i procesor jest ustawiony tak, że go używa.
  • #6
    janbernat
    Level 38  
    Jeżeli jest to silnik bipolarny z czterema wyprowadzeniami to ULN go nie wysteruje.
    Jezeli ma 5 albo 6 wyprowadzeń to tak.
    Po prostu włącza się go jako unipolarny.
    Sprawdzając przedtem jaki jest prąd uzwojeń.
  • #7
    Student_Bartosh
    Level 9  
    Slkkk wrote:
    Student_Bartosh wrote:

    Przeniosłem procesor na makietę.


    To znaczy, że wyjąłeś go z zestawu uruchomieniowego i włożyłeś na swojej płytce? Jeśli tak, to prawie na pewno to nie zadziała, gdyż w zestawie zapewne jest kwarc i procesor jest ustawiony tak, że go używa.


    Hmmm... Czyli mam rozumieć, że teraz trzeba dokupić do układu generator (rezonator?) kwarcowy. Z dokumentacji wyczytałem, że Atmega16 pracuje maksymalnie z 16 Mhz. Na module uruchomieniowym napisane jest "16.000", o ile dobrze mi sie wydaje, że to kwarc jest.
  • #8
    Slkkk
    Level 14  
    Nie trzeba, odpowiednio ustawiając fuse bity można włączyć w mikrokontrolerze wewnętrzny generator, np. 8 MHz. O tym jak podłączać mikrokontroler (bo do pełnej zgodności ze sztuką brakuje jeszcze kondensatorów i podciągnięcia resetu do 5 V) i ustawiać fuse bity poszukaj na forum.
  • #9
    Student_Bartosh
    Level 9  
    Fuse bitów nie ustawie, nie mam programatora :(
    Dzięki za wskazówkę odnośnie podłączenia mikrokontrolera. Nie spodziewałem się, że jeszcze może czegoś brakować.

    Dodano po 1 [godziny] 11 [minuty]:

    Poszperałem w instrukcji do modułu uruchomieniowego. Znalazłem coś ciekawego:

    [Atmega16]Sterownik silnika krokowego nie chce działać

    Już wiem, że muszę podłączyć rezonator kwarcowy 16Mhz i dwa kondensatory do masy. Nie wiem jaka jest indukcja cewki napięcia referencyjnego AVcc.

    Jeśli chodzi o napięcie referencyjne Aref i przycisk reset to nie wiem czy mam go podłączyć, żeby układ działał.
  • #10
    janbernat
    Level 38  
    A co to za moduł uruchomieniowy?
    Już wiem- gotronic.
    Masz tam jeden ULN- sprawdź działanie programu dla jednego silnika.
    Tylko sprawdź najpierw parametry silnika- bo pewnie wylutowanie spalonego ULN będzie dla Ciebie kłopotliwe.
  • #11
    Student_Bartosh
    Level 9  
    Sprawdziłem na module. Wszystko działa jak powinno. Dlatego chciałem zrobić krok do przodu i zrobić niezależny układ. W sensie zrobić własny sterownik silnika unipolarnego na płytce uniwersalnej.
  • #13
    Slkkk
    Level 14  
    Dlaczego miałby nie wysterować? Jeśli tylko silnik ma sześć wyprowadzeń, by można nim było sterować tak, jak unipolarnym, to nie widzę problemu -- sam kiedyś zrobiłem to samo. Należy tylko tak dobrać napięcie zasilające silnik, by nie płynął za duży prąd (ULN2803 wytrzyma 0,5 A) -- wystarczy zmierzyć opór cewki najprostszym miernikiem. Nie osiągnie się co prawda w ten sposób dużych obrotów, ale w celach edukacyjnych tak prosty i tani układ jak najbardziej się sprawdzi.
  • #15
    Student_Bartosh
    Level 9  
    rs07 wrote:
    Kolego Student.
    W/g mnie cały ten układ to bzdura. Nigdy tym nie wysterujesz silnika krokowego. Musisz wziąć scalak L293D jeżeli prąd jest do 0,6A jeden kanał.
    ULN2803 do tego celu, nie nadaje się.


    :!: Popełniłem błąd pisząc "silnik krokowy bipolarny". Miałem na myśli "silnik krokowy unipolarny", na takich właśnie pracuje, z myślą o nich powstał ten układ. Błąd został poprawiony w poprzednich postach. Przepraszam za wprowadzenie w błąd:!:
  • #16
    janbernat
    Level 38  
    Bo to pewnie jest silnik z odczepami pośrodku uzwojeń.
    Da się nim sterować jako unipolarnym albo bipolarnym.
    Ale- zmierz oporność uzwojenia- jak napisał Slkkk.
  • #17
    Student_Bartosh
    Level 9  
    Podłączyłem do uC brakujące rzeczy, takie jak: Aref, AVcc zgodnie ze schematem

    [Atmega16]Sterownik silnika krokowego nie chce działać

    Dodałem też rezonator kwarcowy 16 MHz z dwoma kondensatorami 22nF podciągniętymi do masy. Dalej nic się nie dzieje :] Możliwe, że źle kwarc jest przylutowany???
  • #18
    janbernat
    Level 38  
    Zgodnie z jakim schematem podłączyłeś AREF do +zasilania przez opornik?
    Tak nie należy robić.
    Kondensatory przy kwarcu 22pF a nie nF.
  • #19
    Student_Bartosh
    Level 9  
    janbernat wrote:
    Zgodnie z jakim schematem podłączyłeś AREF do +zasilania przez opornik?


    Zgodnie z tym obrazkiem, który znalazłem na elektrodzie. Zasugerowałem się tym postem:

    https://www.elektroda.pl/rtvforum/topic810194.html

    janbernat wrote:

    Kondensatory przy kwarcu 22pF a nie nF.


    Tak. Pomyliłem się.
  • #20
    janbernat
    Level 38  
    Nie wszystkie rozwiązania na elektrodzie są prawidłowe.
    Raczej szukaj w DS Atmela.
    I tak jak napisałem:
    janbernat wrote:
    Masz tam jeden ULN- sprawdź działanie programu dla jednego silnika.

    Potem się przenieś na płytkę.
    P.S.
    Taki sterownik zawsze działa- nie ma prawa nie działać.
    Oczywiście jak wszystko jest sprawdzone, pomierzone i prosty program jest prawidłowo napisany.
  • #21
    Student_Bartosh
    Level 9  
    Sprawdziłem na module uruchomieniowym i działało. Przeniosłem na płytkę uC, dolutowałem kwarc, dodałem troche kondensatorów tu i tam. Właśnie sprawdzam luty i upewniam się, że dobrze polutowałem wszystko.
  • #22
    janbernat
    Level 38  
    Ale kondensatorów nie dolutowuje się tu i tam.
    Tylko tam gdzie trzeba.
  • #23
    Student_Bartosh
    Level 9  
    Dobra, tak sobie powiedziałem:D Reasumując to, co do tej pory zrobiłem.

    1. Przed układ 7805 dałem kondensator 100 nF podciągnięty do masy tak jak na tym obrazku:

    [Atmega16]Sterownik silnika krokowego nie chce działać

    2. Rezonator kwarcowy połączyłem pod XTAL1 i XTAL2 (odprowadzenie 12 i 13) i dodałem kondensatory 22pF, wszystko jak na rysunku poniżej:

    [Atmega16]Sterownik silnika krokowego nie chce działać

    Czy jest jakaś różnica jak się połączy rezonator kwarcowy?

    3. Napięcie referencyjne jak poniżej na obrazku, cewka 10uH, kondensator 100 nF:

    [Atmega16]Sterownik silnika krokowego nie chce działać

    4. Napięcie referencyjne Aref. Co z nim? Mam po prostu podłączyć do Vcc? Ilustracja wygląda następująco:

    [Atmega16]Sterownik silnika krokowego nie chce działać

    Kondensator dałem oczywiście 100 nF. I zagadka. Czy tam jest regulowany rezystor?? Ja tam dałem 10k ohmów.

    5. Co z resetem? Ma sobie dyndać? Nie trzeba podłączyć do Vcc?
  • #24
    LordBlick
    VIP Meritorious for electroda.pl
    4. Absolutnie nie łącz z niczym, jeśli nie używasz ADC. Jeśli używasz, to kieruj się notą katalogową - najczęściej tylko kondensator do GND, bo napięcia odniesienia są przełączane wewnętrznie...
    5. Może "dyndać", aczkolwiek w zakłóconym środowisku podłącza się 10kΩ do Vcc, czasami dodatkowo jakieś 100nF do GND(ale tylko w aplikacji końcowej wykluczającej przeprogramowanie).
  • #25
    janbernat
    Level 38  
    1. Może być- chociaż bardziej w tym przypadku na wyjściu.
    2. Dobrze- nie ma róznicy.
    3. AVCC to nie jest napięcie referencyjne tylko napięcie zasilania części analogowej
    procesora.
    I cyfrowej portu A też.
    4. Regulowany rezystor- potencjometr- jest na płytce.
    Tylko wtedy to ma sens jeśli ustawisz zewnętrzne napięcie odniesienia i odczep z tego
    potencjometru bedzie tym napięciem.
    5.Może dyndać- ale nie musi.
    6.Nie chcę być badany aparaturą elektromedyczną podłączoną przez Ciebie.
    Są łagodniejsze sposoby eutanazji.
  • #26
    Student_Bartosh
    Level 9  
    janbernat wrote:

    6.Nie chcę być badany aparaturą elektromedyczną podłączoną przez Ciebie.
    Są łagodniejsze sposoby eutanazji.


    Hehehehe... Aparatura elektromedyczna to specjalność Inżynieri Biomedycznej na PWr. Elektronikę miałem 4 semestry, pobieżnie niektóre bloki wybranych urządzeń.
    Zdaję sobię sprawę, że daje żałosny popis wiedzy. Wiem też, że muszę się uczyć na własną rękę. Na pocieszenie mogę dodać, że inżynier biomedyczny w Polsce nie ma prawa wykonywania jakichkolwiek badać podłączając aparaturę do pacjenta ;P

    W ogóle dzięki za odpowiedzi, bardzo pomogły :>