Yazar: Gökay Kutlu KOÇAK
Step Motor Kontrol Devresi:Â
 Step motor kontrol devresi şekildeki gibi olup, motor; 4 adet NPN tip (BC548) transistör ve 1N4001 model diyot ile sürülmektedir (Step motor; ULN2003 entegresi, röle, FET ile de sürülebilir). Mikrodenetleyici olarak PIC16F877 (Peripheral Interface Controller) kullanılmıştır. RB6-RB7 portlarına buton bağlandı, bu butonlar ile motor ileri-geri kontrol edebilebilmektedir. 4MHz’lik kristal ve 22p’lık kapasitörler ile PIC’in çalışması için gereken osilatör sinyalini sağlandı.
RB6-RB7 portlarındaki butonlar aracılığı ile programda belirlenen kesmeler sağlanmaktadır. Gerekli çıkışlar RB0-RB1-RB2-RB3 porlarına gönderilmektedir.
Port çıkışlarındaki 1K’lık dirençeler, gerekli port çıkışlarındaki lojik-1 yani +5 Volt’u transistor ün base ini tetikleyebilecek seviyeye indirmekte. Transistorlerin emitter leri topraklanmakta, collector lerden motora çıkış alınmaktadır. İmpuls ile motorun bir sargısı endüklenir, diğer sargıya impuls geldiğinde bir önceki sargı endüklendiği enerjiyi boşaltamaz dolayısıyla Back MMF oluşur. Bu kuvveti kaynağa geri göndermek ve transistorleri korumak için devrede diyot kullanıldı.
 
Devrede 6 uçlu (Unipolar sargı tipli) step motor kullanıldı. Step motorun doğru bacak bağlantılarını bulabilmek için aşağıdaki yöntem izlenir: Uçlar arası direnç ölçümü yapılır. Şekildeki O1 ve O2 ortak uçlardır. Dolayısıyla A-B arasında ölçülen direnç A-O1 ya da B-O1 arasında ölçülen direncin 2 katıdır. Aynı şekilde C-D arasında ölçülen direnç C-O2 ya da D-O2 arasında ölçülen direncin 2 katıdır.
Motor sargılarının sadece birinin uyartıldığı uyartım cinsine tek-faz uyartımı adı verilir. Rotor her bir uyartım sinyali için tam adımlık bir hareket yapmaktadır. Dönüş yönüne bağlı olarak sıra ile yapılır.
Step Motor Kontrol Programı:
Mikrodenetleyici CCS ile C ile programlanmıştır. Program algoritması özetle şu şekildedir:
•   Başlangıçta hareket yoktur.
•   Kesmeler ile butona basılıp basılmadığı kontrol edilmektedir.
•   Hangi butona basılırsa onun işlevi gerçekleşmekte ve çıkışa gerekli değeri vermektedir.
/******************************************************
 Uygulama Adı    : Buton ile Step Motor Kontrol Uygulaması Kesikli
 Yazan           : Gökay Kutlu KOÇAK
*******************************************************/
#include <16F877.h>
#device adc=8
#FUSES NOWDT,XT,NOPUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=4000000)
#use fast_io(b)
#define ileri pin_b6
#define geri pin_b7
const int adim[5]={0,1,2,4,8};
int i=0;Â Â Â Â
#int_RB
void RB_isr(void)
{
   if(input(ileri))
     {
        delay_ms(10);
        i++;
        if(i==5) {i=1;}Â
     }
  if(input(geri))
     {
        delay_ms(10);
        i–;
        if(i==-1||i==0) {i=4;}
     }
}
void main()
{
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(SPI_SS_DISABLED);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  enable_interrupts(INT_RB);
  enable_interrupts(GLOBAL);
  set_tris_b(0b11000000);
  output_b(0×00);
 Â
   while(1)
  { output_b(adim[i]); }
}
Programda:
- #FUSES Denetleyici konfigürasyon ayarlarını içermektedir.
- #define ile belirli pinlere isimler belinmiÅŸtir
- const int adim[5]={0,1,2,4,8}; ile 0=0000, 1=0001, 2=0010, 3=0100, 4=1000 konumlarını tanımlandı. (motora göndereceğimiz darbelerin sırayla ve ard arda olmasını sağlayacağımız dizi tanımlaması)
- set_tris_b(0b11000000); komutu ile RB7, RB6’nın giriş geri kalan portların çıkış olacağı belirtildi
- output_b(0×00); komutu ile b portunu program baÅŸladığında lojik-0 seviyesine çekildi.
- İleri butonuna basıldığında 10 ms’lik ark oluşmaması için bekleme bulunmaktadır. Ardından başlangıçtaki i=0 değerini arttırılmıştır. i=1 output_b(adim[i]); komutu ile dizinin 2.elemanı (0001) çıkışa verilmiştir. İ=5’e kadar basmaya devam edilirse i=1’e atamakta bu atama ile motor ilk baştaki gibi hareketsiz olmamakta, baştan yani 1’den başlamaktadır.
- Geri butona bastığımda ise yukardaki işlemlerin tersi gerçekleşmektedir. Devreyi çalıştırıldığında ilk geriye basılırsa i=-1 olacaktır ve bu durumda i’nin yeni değeri 4 olmalı bu durum if(i==-1||i==0) {i=4;} komutu ile sağlandı. (Normalde ilk ileri butonuna bastıktan sonra geriye basıldığında i=-1 değerine inmez)
- while(1) döngüsü içersinde az komut kullanmaya çalışıldı. Zira butonlara basılıp basılmadığı while(1) içersinde bir for döngüsü ile kontrol edilseydi, mikrodenetleyici bu taramayı sürekli yapacaktı ve bu programa hamallık katacaktı. Kesme ile bu işlemi kolaylaştırmış olduk.
/******************************************************
 Uygulama Adı    : Buton ile Step Motor Kontrol Uygulaması Sürekli
 Yazan           : Gökay Kutlu KOÇAK
*******************************************************/
#include <16F877.h>
#device adc=8
#FUSES NOWDT,XT,NOPUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=4000000)
#use fast_io(b)
#define ileri pin_b6
#define geri pin_b7
const int adim[5]={0,1,2,4,8};
int i=0,durum=0;Â Â Â Â
#int_RB
void RB_isr(void)
{
  if(input(ileri)) {durum=1;}
  if(input(geri)) {durum=2;}
}
void main()
{
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(SPI_SS_DISABLED);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  enable_interrupts(INT_RB);
  enable_interrupts(GLOBAL);
  set_tris_b(0b11000000);
  output_b(0×00);
  while(1)
  {
     if(durum==1)
     {
        i++;
        if(i==5) {i=1;}
        output_b(adim[i]);
        delay_ms(100);
     }
    Â
     if(durum==2)
     {
        i–;
        if(i==-1||i==0) {i=4;}
        output_b(adim[i]);
        delay_ms(100);
     }
  }
}
 Programda:
Önceki programdan farklı olarak kesmeler ile durum değişkenine 1 ve 2 değerlerini atanmıştır. While(1) döngüsü içersinde bu değerler içerisinde program sürekli olarak işlemektedir.
Devreyle ilgili tüm dosyalara aşağıdaki linkten ulaşabilirsiniz.
http://rapidshare.com/files/320746638/Buton_ile_Step_Motor_Kontrol__.rar

(4 votes, average: 4.5 out of 5)

Melih YiÄŸit Ara 15, 2009
Helal
mine Åžub 24, 2010
cok hos ve faydalı bir site tesekkürler megi gecenlere
hilal Åžub 7, 2011
ellerinize sağlık sayenizde kendimizi geliştirmek mümkün oluyor
slav3 Åžub 16, 2011
bu devreyi rf ile uzaktan kontrolünü nasıl yaparız.biraz bahsetseniz
Gökay Kutlu KOÇAK Mar 9, 2011
Merhabalar slav3. Devreyi rf ile uzaktan kontrol etmekten bahsetmişsin. Her bir sinyali rf ile göndermektense 2 butonun yaptığı işlevi rf ile sağlatabilirsin. Yani butona basma sinyalini harici bir devreden rf ile ana devreye aktarabilirsin. Dolayısıyla step motorum uzaktan kontrol edilmiş olur. Ama istersen her bir sinyalide kontrol ettirebilirsin. O senin programlama becerine kalmış birazda. Teşekkürler
FARUK Mar 23, 2011
bu devrede programda motor açısını ayarlamak için nasıl bir kod ekleyebiliriz istedigimiz açılarda kontrol etmek için tesekkürler