Step motorlar robotikte ve endüstride çok kullanılan bir motor çeşitidir. Harddisklerde, disket sürücülerde kullanılırlar. Step motorlar isminden de anlaşılabileceği gibi normal dc motorlardan farklı olarak adım adım hareket eden motorlardır.  Motorun izin verdiği hassasiyette istenilen açıda ve yönde döndürülebilirler. Step motorlar piyasada adım sayısına, devir hızına, çalışma voltajına, çalışma akımına, çalışma şekline göre sınıflandırılırlar. Ayrıca step motorların bipolar ve unipolar olmak üzere iki çeşidi mevcuttur.

Step motorların adım sayıları üzerlerinde derece cinsinden belirtilir. MEsela bizim bu uygulamamızda kullanacağımız adım motorumuz olan Philips MB 11’in üzerinde 7°30′ yazmaktadır.(7 dereece, 30 saniye) Bu step motorun her adımının 7,5 derece olduğu anlamına gelir. Yani step motorumuz bir tam tur atmak için 48 adıma ihtiyaç duyar. (7,5×48=360 derece)  Philips’in üretmiş olduğu bu motor 6 uçlu unipolar bir motordur.  İsterseniz unipolar ve bipolar motorun farkına bir göz atalım.

Şekilden görüleceği üzere unipolar motorlarda her sargı için birer adet ortak uç bulunur. Bu ortak uçlar şaseye bağlanabileceği gibi beslemeye de bağlanabilir. Diğer uçlar ise kontrol uçlarıdır. “A” sargısını ele alacak olursak eğer A2 ortak ucu şaseye bağlandıysa “A1” veya “A3” uçlarından hangisine enerji verilirse  sargının o tarafı elektromıknatıs özelliğine kavuşur ve motor milini kendi bulunduğu tarafa doğru hareket ettirir . Bipolar motorlarda ise sargıların her ucu ayrı ayrı kontrol edilir ve besleme sargılardan verilir.  Unipolar motorların kontrolü bipolarlara göre daha kolay olmakla birlikte, aynı boyuttaki iki motordan bipolar olanının torku daha fazladır.

Şimdi gelelim step motorun uçlarının bulunmasına.  Philips MB 11 step motorunun 6 adet ucu bulunmaktadır ve motorumuz unipolar bir step motordur.

Görüldüğü gibi iki farklı sargıya ait iki grup sarı kırmızı ve gri kablolar bulunmaktadır. Bu kablolardan hangisinin ortak uç olduğunu blabilmek için direnç ölçebilen bir ölçü aletine ihtiyacımız var. Ben uçların direncini ölçmeye sarı ve kırmızı kablolardan başladım ve 121 ohm gibi bir değer okudum. Ölçme işlemine sarı ve gri kabloları ölçerek devam ettim ve 240 ohm gibi bir değer okudum. Daha sonra gri ve kırmızı kabloyu da ölçerek 119 ohm gibi bir değer okudum. Buradan da görüleceği üzere kırmızı uç her iki sargıda da ortak uç olarak belirlendi.

Bu motoru bir yöne doğru nasıl dönderebileceğimizi ise aşağıdaki animasyondan görebiliriz.

Aynen şekilde görüldüğü gibi sargılar teker teker sırası ile enerjilendirilerek dönüş sağlanır. Aşağıdaki şekilde ise bir unipolar step motorun sargılarının gerçekte nasıl yerleştirildiği görülmektedir;

O halde biz motoru sağa doğru hareket ettireceğimizi düşünürsek ve ortak uçları şaseye bağladığımızı kabul edersek sırası ile şu uçları enerjilendirmemiz gerekir: Gri1, Gri2, Sarı1, Sarı2. Bu uçları enerjilendirdiğimizde motorumuz 4 adım sağa doğru dönüş yapacaktır. Yani 7,5 derecelik motorumuz 4×7,5=30 derece ilerlemiş olur.  Aşağıdaki tabloda motorun 7,5 derecelik adımlarla sürülmesi görülmektedir.

Yarım adım sürmede ise motor 3.75 derecelik açılarla ilerler. Bobinler sırası ile ikişer ve tek olmak üzere sürülür.

Philips MB11 step motoru 12V ile çalışan bir motordur ve mikrodenetleyici çıkışından doğrudan sürülemez. Araya 12V’u ve gerekli akımı sağlayabilecek bir yapı oluşturmak gereklidir. Ben bu projede içerisinde dahili flyback diyotlarını da barındıran L293D motor sürücü entegresini kullandım. Flyback diyodu motor uçlarına ters yönde bağlanan ve motorun bobinlerinde indüklenen ters akımı, devreye zarar vermemesi için kendi üzerinden akıtmak için kullanılır.

Devre şemamız aşağıdaki gibidir.

Büyütmek için tıklayın.

Programımız ise yukarıdaki bilgiler ışığında incelendiğinde gayet anlaşılır biçimdedir. Motor yarım adım olacak şekilde sürülmüştür. Yani bir tam tur için 96 yarım adım gitmesi gerekir.

char sira[8]={0b00000001,0b00000011,0b00000010,0b00000110,0b000000100,0b00001100,0b00001000,0b00001001};   //PHILIPS MB11  G1,G2,S1,S2 (Kırmızı ortak)
signed char i,j;
void main() {
trisb=0;
portb=0b00001001;
delay_ms(1000);
while(1)
        {
         for(j=0;j<12;j++)                  //tam tur sağa
          {
           for(i=0;i<8;i++)
                         {
                          delay_ms(10);
                          portb=sira[i];
                         }
          }

          delay_ms(1000);

         for(j=0;j<12;j++)                  //tam tur sola           {            for(i=6;i>=-1;i--)
                         {
                          delay_ms(10);
                          if(i==-1)portb=sira[7];
                          else portb=sira[i];
                         }
          }

          delay_ms(1000);

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

           for(j=0;j<6;j++)                         //yarım tur sağa
          {
           for(i=0;i<8;i++)
                         {
                          delay_ms(50);
                          portb=sira[i];
                         }
          }

          delay_ms(1000);

           for(j=0;j<6;j++)                          // yarım tur sola           {            for(i=6;i>=-1;i--)
                         {
                          delay_ms(50);
                          if(i==-1)portb=sira[7];
                          else portb=sira[i];
                         }
          }

          delay_ms(1000);

 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

            for(j=0;j<3;j++)                     //çeyrek tur sağa
          {
           for(i=0;i<8;i++)
                         {
                          delay_ms(100);
                          portb=sira[i];
                         }
          }

          delay_ms(1000);

          for(j=0;j<3;j++)                       //çeyrek tur sola           {            for(i=6;i>=-1;i--)
                         {
                          delay_ms(100);
                          if(i==-1)portb=sira[7];
                          else portb=sira[i];
                         }
          }
          delay_ms(2000);

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

        }
}

Programda motor ilk olarak her yarım adım arası 10 ms olacak şekilde 1 tam tur sağa ve daha sonra 1 tam tur sola döndürülmüştür. Daha sonra 50 ms’lik gecikmelerle yarım tur sağa yarım tur sola döndürülmüştür.
Son olarak motor 100 ms’lik gecikmelerle çeyrek tur sağa ve çeyrek tur sola döndürülerek başlangıç noktasına geri getirilir.
Projenin videosunu aşağıdan izleyebilirsiniz.

Uygulama ile ilgili bütün dosyalara buradan ulaşılabilir.

yorum
  1. Alp dedi ki:

    hocam ellerinize sağlık çok güzel ve çok sade bi anlatım olmuş

  2. Fatih ASLAN dedi ki:

    Hocam birde sıcaklık ölçümünü 4’lü display’e aktaran bir uygulama yaparmısınız ?

    • mikrodunya dedi ki:

      İleride böyle bir uygulamaya vakit ayırabilirim. Fakat bugüne kadar anlatmış olduğum konuları birleştirerek bu uygulamayı kendiniz de yapabilirsiniz. Isı sensör olarak LM35 kullanabilirsiniz.

  3. bahadır dedi ki:

    hocam kolay gelsin.
    benim anlayamadığım picler assembler komutlarıyla programlanıyor siz burda c olarak vermişsiniz programı.
    açıklarsanız sevinirim.
    tesekkurler.

  4. ali dedi ki:

    for döngüsündeki sayıları neye göre verdiniz 12 ve 6 değerlerinde tam tur atacağını nasıl anladık

    • ali dedi ki:

      tam tur da 18 ye 8 olacak yanlış yazmışım

      • mikrodunya dedi ki:

        Motor yarım adım sürüldüğünden her defasında 3.75 derece döner. Dizi elemanları bir kez sırası ile çağırıldığında 3.75*8=30 derece yapar. Tam tur atmak için ise 12 kez dizi elemanlarının çağırıması gerekir. 12*30=360 derece.

  5. ali dedi ki:

    tskrlr son bir soru her adım motorda yarım adımı kullandığımızda
    açı 3,75 mi oluyor?

  6. ali dedi ki:

    proteusta adım motorun adım açısını elle mi ayarlıyoruz ve nasıl ayarlayacağız?

  7. ali dedi ki:

    çok teşekkür ederim 😀

  8. acele dedi ki:

    merhabalar ben iki step motoru 18f4550 ile sürmek istiyorum ancak başlangıçta motorlarımdan birisi sürekli bir kaç adım geri atıp başlıyor bu yüzden aynı yere gelemiyorlar ,aynı olayı 628a ile denediğimde sıkıntı çıkmıyor nedendir bilgi olan var mı acaba?

  9. acele dedi ki:

    kodumda bir yerde gereksiz bir veri gönderimi varmış onu yaklaımadım ve o sorunu çözdfüm ancak şmidi şöyle bir sıkıntım var motorları yarım adım döndürüyorum sizn burada yaptığınız gibi ancak isiste motorlar 0.90 derecede duruyorlar işlem bitince neden olablir acaba?….

  10. acele dedi ki:

    ve bazen isiste motorlardan birisi 0.9 derece geri kalıyor sonra yakalıyorlar birbirlerini bir sıkıntı oluştururu mu acaba ben bu step motorları bir robot ta kullanıcam ama giderken yönünde sapma olmaz diye düşünüyorum çünkü aynı açıyı yakalıyorlar sonra…ve son olarak motorun kesinlikle adım atlamaması için nelere dikkat etmeliyim acaba?kullandığım işlemci 18f4550 ve 8MHz çalıştırmayı düşünüyorum acaba daha mı düşük olmalı,ve ben bu delayleri 10 ms verdiğim zaman sapıtıyorlar hepsini denedim ve en uygunu 50 ms oldu bunun altında sapıtıyor motorlar… yardımınız için çok teşekkür ederim:)

  11. acele dedi ki:

    çok teşekür ederim ancak neden 10 ms verdiğimde çalışmıyor onu çözemedim osilaötr frekansım 8MHz

  12. emin dedi ki:

    peki hocam 200 adım 1 step motor ıcın 8.1 Nm gucunde ortalama 6 A akım cekıyor

    be bunu güneş panelını dondurmekte kullanacam ve peortlardan bırıne gırı sınyalı gıtmesı lazım saga yada sola komutu

    ve guneş battıgında başladıgın yere don komutu ekleyecem nasıl 1 yol izlemem lazım

  13. emre ùnal dedi ki:

    Günes enerjisi ile calisan step motorunun pic ile kontrolu bu konuda bna yarfm edicek arkdslar varmi varsa acil odevi vermem lazm cvp beklioruM.

  14. evren dedi ki:

    merhabalar msp 430 ve stepmotor kullanarak nasıl kapı kilidi açıp kapatabilirim?

  15. mehmet dedi ki:

    slm hocam ben videyou izleyemiyorum.yardımcı olursanız sevinirim ….

  16. seçkin dedi ki:

    Hocam iyi çalışmalar. Siteniz ve örnekleriniz çok faydalı. Örneklerinizde birazda USB-RS232-RS485 tarzı iletişim protokolleri ile PIC e veri gönderip PIC ten veri alma olaylarını eklermisiniz. Örneğin step motor kontrolünde pozisyonu sıralı bir şekilde otomatik yapmak yerine bilgisayardan girilecek string datalarla nasıl yaptırabiliriz. Bu tarz örneklerin sayısı oldukça sınırlı.

    Çalışmalarınızda kolaylıklar dilerim.

  17. murat dedi ki:

    emeği geçen herkese teşekkür ederim bi sorum olucaktı ben 18f452 kullanıyorum ccp1 ve ccp2 pinlerinden birbirinden bağımsız 2 step motor sürmek istiyorum ne yapmam gerek

  18. Abraham dedi ki:

    step motorun aynısı bende vardı kablolaı nasıl bulacam diyo aklımdan oldum eyw çok işime yaradı

  19. abdullah dedi ki:

    i>=-1ve if(i==-1) ifadeleri ne işe yarar.sağa dönerken dizinin 8 elemanı sola dönerken niye 6 elemanını saydırıyoruz.

    • mikrodunya dedi ki:

      i>=-1, i’nin değeri -1’den büyükse demektir. if(i==-1) ise i’nin değeri -1’e eşitse demektir.
      Dikkat ederseniz sağa döndüğünde en son kaldığı değer dizinin 7. elemanıdır. Çünkü dizi elemanları 0. eleman, 1. eleman diye gider. Topam 8 eleman olduğuna göre son eleman 7. elemandır. Sağa dönüp durduktan sonra son kaldığı yer dizinin 7. elemanı olduğundan, 6,5,4,3,2,1 ve 0. elemanlardaki değerler motor uçlarına verilecek ve motor duracaktır. Yani sağa 8 yarım adım, sola 7 yarım adım atarsa motor mili aynı yere gelmiş olur.

  20. mktrnk.cm dedi ki:

    merhabalar. Motordan çıkan kablolarda hangisi A hangisi B sargısı oluyor? Yada bunun çok önemi var mı? sürerken hangi sırayla bağlamalıyız?

  21. zafer dedi ki:

    selamlar iyi çalışmalar; benim step motor ödevim var bu devreyi isisde kurdum ama bana pic16f887 yapılmış hali lazım mikroc deki kodlarınız buna uyarmı ayrıca 1 buton sağa döndürme bir buton sola döndürme 1 buton hızı arttırma 1 butonda hızı azaltma şeklinde olucak ödevim için son 2 gün yardımcı olurmusunuz şimdiden teşekkür ederim

    • zafer dedi ki:

      lütfen yardım edermisiniz belki hazıra konuyormuş gibi olacam ama okulu bitirmem lazım ve çok bilgim yok bana mikroc kodları ve isis de programı atma ihtimailiniz var mı bu süre içerisinde çok mağdur durumdayım yardımlarınızı bekliyorum

  22. furkan dedi ki:

    hocam program hata veriyor isisin kendi içerisinde programa attım hata verdi yardımcı olurmusunuz .s

  23. Eray dedi ki:

    Hocam ben de benzer bir çalışma yapıyorum ama aşağıdaki kodlara eklemek istediğim bir uygulama var yardımcı olursanız çok memnun olurum.

    Motorun sadece belli bir derece veya tur aralığında sağa ve sola dönmesini istiyorum. Sensör ile kapı otomatiği gibi kullanmak istiyorum. İyi çalışmalar.

    LIST p=16F84 #include “P16F84.INC” ; Include header file
    CBLOCK 0x10 ; Temporary storage
    pos
    dc1
    dc2
    ENDC
    LIST p=16F84
    #include “P16F84.INC”
    CBLOCK 0x10 ; Geçici depolama
    ENDC
    ORG 0
    entrypoint goto start
    ORG 4
    intvector goto intvector
    start clrw ; W ? h?00?.
    movwf PORTB ; PORTB ? W
    bsf STATUS,RP0 ; Bank 1?i seç
    movlw 0xF0 ; Port B?nin 0-3 bitleri çıkış olarak ayarla
    movwf TRISB ; TRISB register?ini ayarla.
    bcf STATUS,RP0 ; Bank 0?ı seç

    movlw 3 ; Motor pozisyonunu başlat
    movwf pos
    movwf PORTB
    call delay
    clrf PORTB ; Motor sürücü kapalı
    ;Main loop —————————————————————————————————
    loop btfss PORTA,0 ; Saat yönü butonunu test et
    call stepcw
    btfss PORTA,1 ; Saat yönün tersi butonunu test et
    call stepccw
    goto loop

    ;Bir adım saat yönünde döndürme ———————————————————————–
    stepcw bcf STATUS,C ; Carry bayrağını sil
    btfsc pos,3 ; Eğer bu bit “1” ise carry?i ayarla
    bsf STATUS,C
    rlf pos,W ; İlerle ve Motorun temel pozisyonuna döndür
    andlw 0x0F ; Alt dört biti maskele
    movwf pos
    movwf PORTB ; Çıkışları sür
    call delay ; Bekle
    clrf PORTB ; Çıkışı temizle
    return

    ;Bir adım sayısı saat yönünde döndür ——————————————————————-
    stepccw bcf STATUS,C ; Carry bayrağını sil
    btfsc pos,0
    bsf pos,4
    rrf pos,W ; İlerle ve Motorun temel pozisyonuna döndür
    andlw 0x0F ; Alt dört biti maskele
    movwf pos
    movwf PORTB ; Çıkışları sür
    call delay ; Bekle
    clrf PORTB ; Çıkışı temizle
    return

    ; Adımlar arası gecikmeyi sağlama ve motor hızı kontrolleri —————————————-
    delay movlw 50; Dış döngü sayısı
    movwf dc1
    dl1 clrf dc2 ; İç döngüyü başlatma
    dl2 nop
    nop
    decfsz dc2,F
    goto dl2
    decfsz dc1,F
    goto dl1
    return
    END

  24. Emin dedi ki:

    Bunda buton texbox falan yokmu

  25. Mehmet Y dedi ki:

    Merhabalar. Bu proje
    http://www.robotistan.com/unipolar-step-motor
    adresindeki motor ile de gerçekleştirilebilir mi acaba Hocam?
    Teşekkür ederim..

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s