Step motor dönmüyor ses geliyor sadece.

Başlatan Denizccan, 06 Haziran 2015, 21:40:09

Denizccan

İyi günler.

Step motor konusunda fazla bilgiye sahip değilim kendimi geliştirmek amaçlı bugün elimdeki malzemelerle step motor sürmeye çalıştım fakat başarılı olamadım.Motordan sadece ince bir ses geliyor ama dönmüyor sebebini bulamadım yardımcı olursanız sevinirim.

Aşağıda belirttiğim isis şemasına göre devremi oluşturdum.380w'lık bilgisayar güç kaynağı ile besledim devreyi ve motora 12v uyguladım. Devre kısımlarını teker teker inceledim bütün kısımlar düzgün bir şekilde çalışıyor. Sanırım programsal olarak bir yanlışlık yaptım adımlar arası ne kadar gecikme süresi vereceğimi tutturamadım.

Elimde bulunan motorun datasheet'i :http://sahinrulman.com/site/images/stories/teknik-ozellikler/stepmotor/57BHH82-300E-21BE___57BYGHR405__ENG_.pdf

(Motor 3A'lik L298 2A akım verebiliyor yüksüz deneme yapacağımdan sorun olmaz diye düşündüm ısı sorunu olursa diye fanlı büyük bir ekran kartı soğutucusu monte ettim l298 üzerine)

Motoru datasheet'te gösterilen şekilde seri bağladım motor ve L298 bağlantısı şu şekilde:
A+ = L298 2 nolu pin
A- = L298 3 nolu pin
B+ = L298 13 nolu pin
B- = L298 14 nolu pin

ISIS şeması


Uyguladığım kod:
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)
#use fast_io(a)
#use fast_io(d)
int i=250;

void main()
{
set_tris_a(0b11111111);
set_tris_d(0b00000000);
output_a(0x00);
output_d(0x00);
delay_ms(2000);
  
while(1)
{
   

if((input(pin_a0))==1)
{
delay_ms(2);
while(input(pin_a0)==1);
i=i+25;
}

if((input(pin_a1))==1)
{
delay_ms(2);
while(input(pin_a1)==1);
i=i-25;
}

output_d(0b00000001);
delay_us(i);
output_d(0b00000100);
delay_us(i);
output_d(0b00000010);
delay_us(i);
output_d(0b00001000);
delay_us(i);



}
}





Denizccan

i değeri 25000 değerine çekerek deneme yapmıştım şimdi fark ettim  yanlışlıkla int olarak tanımlamışım int16 olarak tanımlayınca ses kesildi motor dönmeye başladı. Taktığım fanlı soğutucuya rağmen ısı değeri çok yüksek düzeyde 30-40sn çalıştırıp durdurmak zorunda kalıyorum. L298'lerin yerine 6203 takarak yeni deneme yapcam.

z

L298 yerine L6203 takman sonucu değiştirmez gene sürücü ısınacak. Çünkü akımı sabitleyecek düzenek yok. L297 + L298 kullanmayı dene.

Ya da L6203 için gene L297 ilaveli yapıları dene.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

iyildirim

25000 uS değeri ile motor 12 RPM civarında hızla dönüyordur. Bu hız İçin 12V fazla geliyor, motor fazla akım çekiyor. Motor dönmeye başlayınca hızı motor dönebildiği kadar arttırırsan ısınma biraz olsun azalacaktır.  Tahminen i değeri 250-1000 arasında olacaktır.

Ama asıl yapman gereken @Z hocanın da dediği gibi Sense pinlerini  kullanman.
Sürme şeklinle (wave drive) göre tek direnç olabilir. Normal de iki ayrı direnç kullanman gerekir. 

1R için 2A de sense çıkışında 2V görürsün. Bunu mcu da değerlendirip Enable pinlerini kontrol etmen gerekir.
Enable girişleri min 2.3V istiyormuş. Direnci 1R5-2R kullanıp sense pini çıkışını evirip  direkt enable pini de bağlamayı da deneyebilirsin.

Denizccan

Z hocam dediğiniz yapıları inceledim yarın L297 ile birlikte L6203 de sipariş etcem o yapıları da deniycem hiç l297 kullanmadım ne işe yaradığını da bilmiyorum ama yarın araştırma yapıcam entegre hakkında.

Şuan hala uğraşıyorum motorla aşağıda belirttiğim gibi bir kod yazdım yavaştan hızlansın diye ama belli bir yere kadar hızlanıyor sonra bi ses geliyor ve motor tekrar yavaşlayarak devam ediyor dönmesine neden böyle bir hareket yapıyor anlamadım.

Motoru datasheet' inde gösterdiği gibi seri ve paralel olarak denemeler yaptım seri iken ısınma oldukça az ama paralel bağlı iken yanacak kadar ısınıyor bunun nedeni nedir acaba ?

iyildirim hocam sizin söylediklerinizi de deniycem en kısa zamanda

#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)
#use fast_io(a)
#use fast_io(d)
int16 i=25000;
int16 k=0;

void main()
{
set_tris_a(0b11111111);
set_tris_d(0b00000000);
output_a(0x00);
output_d(0x00);
delay_ms(2000);
  
while(1)
{
   

for(k=0; k<=500; k++)
{
output_d(0b00000001);
delay_us(i);
output_d(0b00000100);
delay_us(i);
output_d(0b00000010);
delay_us(i);
output_d(0b00001000);
delay_us(i);
i=i-50;
}

while(1)
{
output_d(0b00000001);
delay_us(i);
output_d(0b00000100);
delay_us(i);
output_d(0b00000010);
delay_us(i);
output_d(0b00001000);
delay_us(i);
}
}
}



Cemre.

output_d(0b00000001);
delay_us(i);
output_d(0b00000100);
delay_us(i);
output_d(0b00000010);
delay_us(i);
output_d(0b00001000);
delay_us(i);


bu sıralamayı tekrar gözden geçirir misiniz? Ben mi yanlış görüyorum bilmiyorum ama sırasıyla O1 O3 O4 O2 şeklinde aktif edilmesi gerekmiyor mu pinlerin?