nushel
Üye
- Katılım
- 23 Ara 2009
- Mesajlar
- 15
- Puanları
- 1
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..
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..