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.

ATmega88 + uln2003 + silnik krokowy PM35L

D_Ogi 29 Kwi 2011 18:24 4232 9
  • #1 29 Kwi 2011 18:24
    D_Ogi
    Poziom 9  

    Do włączenia silnika krokowego PM35L
    http://www.eminebea.com/content/html/en/motor_list/pm_motor/pdf/pm35l048.pdf
    http://www.eminebea.com/content/html/en/engin...otors/pm_motor/selection_pm/pdf/pm_select.pdf
    na ATmega88 z ULN2003 napisałem taki uproszczony kod

    Code:
    #define F_CPU 1000000UL
    
    #include<avr/io.h>
    #include <util/delay.h>
    #define time 100 //przerwa w ms między wysłaniem kolejnych sygnałów, testowałem od 1 do 1000

    int main(void){
     
       DDRC=0xff;
       PORTC=0xff;
     
       while(1){
              PORTC=0b00001001;
              _delay_ms(time);
              PORTC=0b00000101;
              _delay_ms(time);
              PORTC=0b00000110;
              _delay_ms(time);
              PORTC=0b00001010;
              _delay_ms(time);
                }
    }


    Schemat układu jest taki:
    ATmega88 + uln2003 + silnik krokowy PM35L
    z tym, że atmega ma podpięte avcc, kondensator 100nF itp. i
    ATMega88 PC0 <-uln2003-> A1 PM35L
    ATMega88 PC1 <-uln2003-> A3 PM35L
    ATMega88 PC2 <-uln2003-> B1 PM35L
    ATMega88 PC3 <-uln2003-> B3 PM35L

    Dlaczego to nie chce działać? Silniczek ani drgnie...

    0 9
  • #3 29 Kwi 2011 18:30
    D_Ogi
    Poziom 9  

    W datesheecie pisze 2-2 PHASES; z racji 5 pinów wydaje się być unipolarny.

    Objawów niedziałania nie ma, w ogóle się nie porusza, ani nie szumi. (Generalnie stawiam na błąd w kodzie).

    0
  • #4 29 Kwi 2011 18:50
    piotrva
    Moderator na urlopie...

    Omomierz w dłoń i pomierz rezystancje między pinami silnika - będzie najszybciej
    a kod swoją drogą zły
    powinno być przy 4 fazowym:
    xxxx1000
    xxxx0100
    xxxx0010
    xxxx0001
    (tryb pełnych kroków)
    lub:
    1000
    1100
    0100
    0110
    0010
    0011
    0001
    1001
    (dla trybu pół-krokowego)

    0
  • #5 29 Kwi 2011 19:07
    Piotrek-787
    Poziom 15  

    Według programu silnik masz podłączony do 4 młodszych bitów portu C, a na schemacie masz podłączony do PC6, oraz 3 młodszych bitów portu D.

    0
  • #6 29 Kwi 2011 21:07
    janbernat
    Poziom 38  

    Do wyjść ULN podłącz diody LED z opornikami w szereg- równolegle do uzwojeń.
    Bardzo to ułatwia sprawdzenie czy silnik jest prawidłowo sterowany.

    0
  • #7 29 Kwi 2011 21:19
    Szumlus
    Poziom 17  

    Witam,

    Proponuje "na sztywno" podłączyć sygnał sterujący do ULN. Przewodzik i 5V na wejścia. Podłączając kolejno wejścia do zasilnia silnik powinien się zacząć obracać, ewentualnie sprawdź czy silnik stawia "opór" podczas próby obrócenia osią jak podasz na stałe napięcie na jedno z wejść.
    Wykluczy kolega w ten sposób uszkodzenie ULN lub silnika.
    Pozdrawiam,
    Marcin

    0
  • #8 30 Kwi 2011 11:57
    D_Ogi
    Poziom 9  

    piotrva napisał:
    Omomierz w dłoń i pomierz rezystancje między pinami silnika - będzie najszybciej

    Padł mi we wtorek miernik. Będę miał okazję, to kupię nowy, na razie to rozwiązanie odpada.
    piotrva napisał:
    a kod swoją drogą zły
    powinno być przy 4 fazowym:
    xxxx1000
    xxxx0100
    xxxx0010
    xxxx0001

    W takim jak rozumieć:
    ATmega88 + uln2003 + silnik krokowy PM35L
    z datesheet'a?
    Piotrek-787 napisał:
    Według programu silnik masz podłączony do 4 młodszych bitów portu C, a na schemacie masz podłączony do PC6, oraz 3 młodszych bitów portu D.

    Połączenia lekko zmieniłem względem tego schematu (np. podpiąłem avcc, przeniosłem piny na port C).
    Szumlus napisał:
    Proponuje "na sztywno" podłączyć sygnał sterujący do ULN. Przewodzik i 5V na wejścia.

    Dzięki temu sprawdziłem, że ULN i silnik są sprawne (silniczek stawia opór).

    janbernat napisał:
    Do wyjść ULN podłącz diody LED z opornikami w szereg- równolegle do uzwojeń.
    Bardzo to ułatwia sprawdzenie czy silnik jest prawidłowo sterowany.

    No i okazało się, że nie jest. Diody się nie świecą (zarówno między atmegą i ULN, jak i między ULN a silniczkiem). Dlatego prosiłbym o spojrzenie na mój kod. Na pewno jest dobry? (sekwencja sterująca nie ma znaczenia, żadna nie zapala mi ledów)

    0
  • #9 30 Kwi 2011 20:19
    janbernat
    Poziom 38  

    Ta sekwencja którą podałeś nazywa się bodaj sterowanie falowe- jużdokładnie nie pamiętam.
    To co podał piotrva to jest sterowanie pełno- lub półkrokowe.
    Każde ma oczywiście swoje wady i zalety.
    Na początek proponuję uruchamiać w trybie pełnokrokowym- tak jak podał piotrva.
    Bo najprościej.
    A potem dopiero w innych trybach.
    Co do diod LED- anoda- dłuższa nóżka do 12V.
    Katoda do opornika ok.1kohm, drugi koniec opornika do wyjścia ULN.
    Potem po kolei wejścia ULN do +.
    Diody po kolei powinny się świecić.
    Jak je ułożysz na płytce stykowej w "kwadrat" to zobaczysz jak ma się kręcić silnik.
    Na czas tego sprawdzania silnik można odczepić.
    Koniecznie trzeba podpiąć oba piny GND w Atmedze.
    Teraz kod- zdefiniuj F_CPU raczej w opcjach projektu a nie w main.
    _delay() wpisz wprost- chociaż wygląda dobrze- tak na wszelki wypadek.
    I tak nie będziesz używał _delay() w prawdziwym programie tylko przerwania od timera.
    Diody LED można też podczepić do procesora- tylko przez oporniki ok.510ohm.
    Do tych wyjść które mają sterować ULN-em.
    Będzie negatyw- tylko jedna będzie gasła- ale to nie szkodzi.
    P.S.
    Mam chyba 12 mierników- z czego normalnie używam czterech.
    I rozglądam się jeszcze za jakimś.
    Jak można mieć tylko jeden miernik?

    0
  • #10 08 Maj 2011 17:03
    D_Ogi
    Poziom 9  

    Dzięki! Jesteście wspaniali :) Z miernikiem udało mi się zbudować układ od nowa, wg Waszych wskazówek. Śmiga jak miło!

    0