ileri-geri çalışan bir motoru, bir start butonu ile çalıştırmak..

unipolar step motoru ve pic 16f877 yi kullanarak yaptığım devre. bende bu çalımayı çeşitli sitelerden araştırarak buldum öncelikle emeği geçen arkadaşa teşekkür ediyorum..
umarım işinizi görür:)


Step Motor Kontrol
Program & Devresi
















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.

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(0x00);

while(1)
{ output_b(adim); }
}

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(0x00); 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); 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(0x00);
while(1)
{
if(durum==1)
{
i++;
if(i==5) {i=1;}
output_b(adim);
delay_ms(100);
}

if(durum==2)
{
i--;
if(i==-1||i==0) {i=4;}
output_b(adim);
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.


pic e program atarken sürekliyi kullanmanı tavsiye ederim..
iyi çalışmalar..
 
metehan arkadaşım gerçek ismim Mehmet ilk önce yazımı okuduğun için teşekkür edreim.Eğer dikkat edersen bize sormuş olduğun devrenin ödev olup olmadığından emin olmadığım için SANIRIM kullandım.2. yazımı daha dikkatli okursan devrede zaman rölesi yok.Eğer r1,r2 rölelerinden bahsediyorsan onlar devrede yardımcı röle olarak kullanıldı.kumanda devrelerinde genllikle
KONTAKTÖRLER: M1 , K1
YARDIMCI RÖLELER: R1 ,YR1
ZAMAN RÖLELERİ: ZR
olarak adlandırılır.
..........çimento fabrikası paketleme bakım ustası
 
arkadaş istersen ben göndereyim yada fiesto diye bi program var ondanda faydalanabilirsin çizip çalıştıra biliyosun
 
arkadaşlar devrede çoğunlukla aydınlatmalarda kullanılan bir pals rölesi kullanılırsa tek start butonu ile iki motoru ayrı ayrı kumanda edebiliriz.bunun dışında piclede darbe kontaklı bir devre yapılıp sorun çözülebilir.
 
bir adet start butonuna 1. basışta 1 motorun, 2. basışta 2. motorun çalıştığı devre aşağıdaki gibidir.
 
dediğini yapmak için tek starta gerek yok 0-1 mandal buton ile yapabilirsin.
 

Forum istatistikleri

Konular
129,867
Mesajlar
930,872
Kullanıcılar
452,732
Son üye
erencok

Yeni konular

Çevrimiçi üyeler

Geri
Üst