çift step motor

Katılım
22 Eki 2010
Mesajlar
12
Puanları
1
İki adet step motoru farklı hızlarda döndürmem gerekiyor.

pic16F628A ,2 adet uln2003 sürücü entegre , 2 adet 6 uçlu step motor kullanıyorum.

İkisini aynı anda ve farklı hızlarda döndürebilmek için kesme kullanarak yapmayı düşündüm.Bir kesmede birinci motor,diğer kesmede ikinci motor döndürülecek ve kesmelerin gelme süresi farklı olduğu için farklı hızlarda döndürebilirim diye düşündüm.Timer0 ve Timer1 kesmesi kullanmayı düşünüyorum fakat kullanamadım ,kodunu yazamadım.

Yardımcı olursanız sevinirim.Şimdiden teşekkürler
 
Merhaba,
Motoru hangi hizda dondurmek istiyorsunuz? Ve donus hassasiyetiniz ne olacak? Bu sorulairn cevabi asagidaki cevabimi biraz etkileyebilir ama, genel olarak;
butun timerlari heba etmeden tek bir timer kullanarak bu sorunu cozebilirsiniz.
Genel bir zamanlayici claistirirsiniz, her bir timer interrupt geldiginde sayaclarinizi bir arttirirsiniz, her sayaci farkli degerlerde sifirlayacak ufak ve islemcide en hizlic lasian komutlardan biri olan "if" komutu ile karsialstirip ilgilid egere geldiginde sifirlayarak o and aisleminizi yaptirabilirsiniz.
Ornek olarak:

volatile u16 Time0=0;
volatile u16 Time1=0;
volatile u16 Time2=0;
volatile u16 Time3=0;
volatile u16 Time4=0;
volatile u16 Snooze_Time=0;
volatile u16 SLEEP_Time=0;

void Timer_1ms_IRQ()
{
if(Time0!=0)Time0--;
if(Time1!=0)Time1--;
if(Time2!=0)Time2--;
if(Time3!=0)Time3--;
if(Time4!=0)Time4--;
else
{
if(Snooze_Time!=0)Snooze_Time--;
if(SLEEP_Time!=0)SLEEP_Time--;
Time4=1000;
}
 
Söylediğiniz şey mantıklı deneyeceğim teşekkür ederim.

peki iki adet timer kesmesi kullanmak için napmalıyım o konuda bi bilginiz var mı ?

Anaproğram fonksiyonunda ;
enable_interrupts(int_timer0)
enable_interrupts(global)
disable...

enable_interrupts(int_timer1)
enable_interrupts(global)
disable

şeklinde kullanmayı düşündüm.Sizce mantıklımı ?
 
Bence timer interrupt surekli acik olmali, yoksa kaciracaginiz interruptlar olabilir.
Uygulama hakkind abiraz daha bilgi verirseniz daha net konusabilirim.
 
iki adet step motorum olacak ve biri misal saniyede dakikada 10 devir yaparken diğeri 5 devir yapacak.
Bildiğim kadarıyla step motorlar tek işlemcide aynı anda çalışmıyor ve bu yüzden timer0 ve timer1 kesmelerini kullanmayı düşündüm
yazdığım koda göre de örneğin 0.5 saniyede bir timer0 kesmesi gelecek ve birinci step motoru döndürecek
0.2 saniyede bir timer1 kesmesi gelecek ve ikinci step motoru döndürecek.

void timer0_kesme()
{
set_timer0(60);
sayici++;


if( sayici == 10 )
{
output_a(a);
i+=1;
if( i==4 )
{
i=0;
}
sayici=0;
}
}

void timer1_kesme()
{
set_timer1(63036);
sayici1++;


if( sayici1 == 40 )
{

output_b(a[j]);
j+=1;
if( j==4 )
{
j=0;
}
sayici1=0;
}
}

a dizisi a[4]={1,2,4,8} şeklinde tanımlanmıştır.

kesme fonksiyonlarında bir yanlışlık olduğunu düşünmüyorum.Ama ana proğramda kesmeleri nasıl gönderecem bilemiyorum.
 
timer 0 interruptı içerisinde iki motor için iki farlı değişken tanımlayıp, bu değişlkenerin belli bir değerden aşağı gelmesi yada belli bir değere ulaşıca hız değerlerini değiştirmesi şeklindeki bir program algoritması daha iyi olabilir iki farklı hız için...
 

Yeni mesajlar

Forum istatistikleri

Konular
129,719
Mesajlar
929,231
Kullanıcılar
452,436
Son üye
hekici

Yeni konular

Geri
Üst