hocam cok guzel cevaplamıssınız benım cok ısıme yarayacak şimdi sistemimin linkini burada verıyorum.Driver, step-dir sinyalleri ile çalışan hazır aldığın birşey ise;
Motor 1 turunu 200 adımda tamamlıyor.
5.5 tur dönmesini istiyorsan 5.5 * 200 = 1100 puls göndermen gerek. Eğer half step veya mikrostep kullanıyorsan bir de onun çarpanı var. 8 mikrostep için 5.5*200*8 puls göndereceksin.
Pul üretme işini ya bir döngüde delay lerle yaparsın yada bir timer kurup timer kesmesinde step sinyallerini üretirsin.
Bir üst aşaması mikrodenetleyicin destekliyorsa donanımsal PWM modülü ile sabit on zamanlı, değişken frekanslı pwm üretip, yine pwm veya timer kesmesinde puls sayabilirsin.
İstediğin kadar puls olunca da timer'ı-pwm'i kapatırsın.
Bu işin birde hız konusu var. Biraz daha karışık sayılır.
Direkt yüksek hızlarda motor çalışmaya başlamaz. Minimum bir hızdan başlayıp, hızı arttırman gerekir.
Sonra puls saydığın timer kesmesinde veya belirli bir hız profiline uyabilmek için ikinci bir timer kesmesinde vs. hızı hesaplayıp pwm ürettiğin timer'ın periyot değerini sürekli güncellemen gerekir.
Motor yüksek hızdan bir anda sıfır hıza inemeyeceğinden birde yavaşlama algoritması gerekir.
Ayrıca gideceğin yol istenen hıza ulaşmak için yeterli olmayabilir durumu da var.
Hızı hesaplamak için;
rpm * (200 * mikrostep) /60 sana saniyede üretmen puls adedini verir.
6 rpm hız ve 8 mikrostep durumu için saniyede 160 puls üretmen gerekir.
Bu da 1/160 = 6.25 milisaniyede bir puls üretmen gerektiğini söyler.
600 rpm için 62.5mikrosec de bir.
Eğer hazır sürücü kullanmayıp, kendin driver yapmaya çalışıyorsan öncelikle bir step sürücü chip'in datasheet'ine bi bak. Bipolar sürücü için tb6560, unipolar sürücü için sla7026-sla7062 chiplere bakabilirsin.
Faz akımları nasıl sıralanıyor, akım kontrolü nasıl yapılıyor vs. gibi şeyler hakkında ön bilgin olduktan sonra devam ederiz.
hocam 5v 18f4680 kullanıcam bır sorun olcagını dusunmuyorum. birde enable pinine picten bir pin baglayıp sureklı 5v mu vermem gerek ?20 mmlik tekerlek ile 8sn de bir uçtan diğerine gitmen yeterli olacaksa;
hızın 60 rpm buda full step için saniyede 200 puls eder.
Sisteminin ağırlığı nedir belli değil ama sanırım hızlanma vs.ye gerek olmadan direkt bu hızda kullanabilirsin.
Timer kurup 5 ms ye de bir kesme urettir. Kesme içinde kaç puls olduğunu say.
Kesmeden çıkmadan puls pinini high yap.
5-10 mikrosaniye bekleyip puls pinini tekrar low yap
Sayacın istediğin değere gelince timeri kapat.
Veya bunları bir döngü içinde pin-high, 10usec bekle pin low, 5ms bekle başa dön şeklinde de yapabilirsin.
Hız az gelirse 5ms lik beklemeyi düşür. çok gelirse bekleme süresinin arttır.
Mikrostep, half step vs. kullanırsan sa 5ms lik beklemeyi mikrostep sayısına bölersin. puls sayısını da çarparsın.
TB6600 sürücülerde genellikle akım ayarı bir pot ile yapılıyor. Önce sürücüde 2.8-3 amper gibi akımını ayarlarsın.
Enable girişini aktif etmezsen çalışmaz. Ya direkt bağla yada denetleyicinin bir pinini buna ayırabilirsin.
Port değil sadece tek bir pini high-low yapacaksın. Donanımsal pwm vs. kullanmayacaksan hangi pin olduğu çok önemli değil.
Mikrodenetleyici olarak ne kullanıyorsun.?
3.3V luk veya pin çıkış akımı düşük bir modelse tb6600 girişindeki optoları yeterince hızlı kullanamayabilirsin. Gerekirse araya uygun bir 74 HC(T)245 gibi buffer eklenebilir.
uint16_t sayac = 0, hedef = 0;
void timer0_interrupt()
{
TMR0H = 246;
TMR0L = 60;
output_high(pin_b0);
delayu(20); // 20 usec bekle
output_low(pin_b0);
Sayac++;
if (sayac >= hedef)
T0CON &= 127; //TIMER0 STOP
}
int main()
{
//kesmeleri aktif et.
INTCON |= 0b10100000; //global int ve TMR0 int aktif
output_high(pin_motor_enable);
delayms(100);
output_high(pin_b1); // direction belirtttigim pin direk surucunun dırectıon bagacagına baglıcagım
//delayu(50);
// yön değiştirirsen kısa bir süre beklemen gerekir.
//Ama burda bir sonraki puls için zaten 2500 usec bekleniyor.
hedef = 3200; //400*8
sayac = 0;
TMR0H = 246;
TMR0L = 60;
T0CON = 0b00100001; //timer0 16 bit + prescaler 4, 4mhz clock için ayarlı.
T0CON |= 128; //TIMER0 START
while (T0CON >127); // Hareket bitene kadar bekle
//başka hareket varsa aynı şekilde kodlarsın mesela başladığı yere döndürmek için
output_low(pin_b1); // direction pin low, yön değiştirdik.
hedef = 3200; //400*8
sayac = 0;
TMR0H = 246;
TMR0L = 60;
T0CON |= 128; //TIMER0 START
while (T0CON >127);// Hareket bitene kadar bekle
output_low(pin_motor_enable);//MOTOR DISABLE
while (1);
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?