1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 4.33 out of 5)
Loading ... Loading ...
Ara
15th

CCS C ile Step Motor Kontrol Program & Devresi

Yazar: Gökay Kutlu KOÇAK

Step Motor Kontrol Devresi: 

step motor ÅŸema

 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ı.

 step motor

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.

 

 

 

 


Uçlar belirlendikten sonra Katalog bilgilerinden step motorun kaç Voltta çalıştığına bakılarak step motorun + beslemeleri gerilim kaynağına bağlanır, geri kalan uçlara sıra ile – verilerek tam dönüş yapılasıya kadar denenir ve uçların sırası belirlenmiş olur.
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

Benzer Yazılar


3 Yorum “CCS C ile Step Motor Kontrol Program & Devresi”

  1. Melih YiÄŸit Ara 15, 2009

    Helal ;)

  2. mine Åžub 24, 2010

    cok hos ve faydalı bir site tesekkürler megi gecenlere

  1. 1 Trackback(s)

  2. Ara 15, 2009: Gökay Kutlu KOÇAK » Blog ArÅŸivi » Step motor projem CCS PIC sitesinde :)

Yorum yapın