timer1 interrupt kontrol [çözüldü]

Başlatan isoment01, 24 Mayıs 2017, 09:35:02

isoment01

Herkese merhaba forumdaki ilk konum, biraz araştırma yaptıktan sonra sitede aklımdaki soruya cevap bulamadım ve bu konuyu açma gereği duydum.
Elimde 200 adımlık bir step motorum var bir timer kesmesi ile pulse üretiyorum ve bu pulse ile motoru sürekli 8 saniye ileri ve geri yaptırıyorum fakat araya bir delay mi dersiniz dead time mı dersiniz öyle bir şey koymak istiyorum yani mesela 8 saniye ileri gittikten sonra 5 saniye beklesin ve tekrar 8 saniye geri gitsin gibi. Bunu nasıl yapabilirim ?
#device PIC18F4680
#include <18f4680.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#use fast_io(b)
unsigned int16 sayac = 0, hedef_ileri = 0, hedef_geri=0, yon=1;
#int_timer1
void timer1_interrupts()
{

set_timer1(64923);
output_high(pin_c2);
delay_us(20);
output_low(pin_c2);
sayac++;
if(sayac==hedef_ileri)
{
yon=2;
output_low(pin_c1);// motor geri gidiyor
}
if(sayac==hedef_geri)
{
sayac=0;
yon=1;
output_high(pin_c1);// motor yönü belirlendi

}
}

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);      //262 ms overflow      //65,5 ms overflow
setup_timer_2 (T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_b(0x00);
output_b(0x00);
set_tris_c(0x00);
output_c(0x00);

enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
output_high(pin_c3);// motor aktif
delay_ms(100);
output_high(pin_c1);// motor yönü belirlendi
yon=1;//ileri yon
delay_us(50);
hedef_ileri=3200;//400*8
hedef_geri=6400;
sayac=0;
set_timer1(64923);












   while(TRUE)
   {
      //TODO: User Code
   }

}






ete

Biraz ters bir durum var burada. 200 adımlık motor bir tam devir için 200 puls ister. Puls afrfi ile çalışan bir motoru zaman ile kontrol etmek istiyorsun. Yanlış olan bu. Bunun için basit bir hesap yapman gerek. Bu hesap sunucunda saniye başına kaç puls ürettiğini programından hesapla. Sonra istediğin süreler için kaç puls vermen gerektiğini bul çünki programın puls sayabiliyor. Sonrabekleme zamanı geldiğinde  pulsları kes zamanı çalıştır.
Ete

isoment01

#2
Alıntı yapılan: ete - 24 Mayıs 2017, 11:36:01
Biraz ters bir durum var burada. 200 adımlık motor bir tam devir için 200 puls ister. Puls afrfi ile çalışan bir motoru zaman ile kontrol etmek istiyorsun. Yanlış olan bu. Bunun için basit bir hesap yapman gerek. Bu hesap sunucunda saniye başına kaç puls ürettiğini programından hesapla. Sonra istediğin süreler için kaç puls vermen gerektiğini bul çünki programın puls sayabiliyor. Sonrabekleme zamanı geldiğinde  pulsları kes zamanı çalıştır.
Ete
hocam merhaba , hesabım soyle motor 200 adım ama full step ben half step kullandım 400 adım edıyor smdı motorumu ben sanıye basına 1 tur atmasını ıstedım 60 rpm yapar;
60 rpm x400/60 sn burdan saniyede 400 adım yapar.  1/400 =2.5 ms lik bir kesme ürettim 8 saniye de 3200 adım yapar o zaman ben 2.5 ms yi ile 3200 adım attırır isem yani kesmeyi 3200 e kadar saydırırsam 400 hz de 8 sn de çalıştırmıs oluyorum hesabım böyle. ama işte o bekleme zamanında pulseleri kesmeyi, zamanı ilerletmeyi yapamadım atıyorum 2 sn bekleme yaptım 800 adım yapar 3200 ile 4000 arasında pulse durduracagım pulse gonderdıgım bacagı ben 3200-4000 arası low yaptım kesme fonksiyonu içerisinde çalışmadı. Bunu nasıl yapabilirim çözemedim. İnterruptı kapatmak istenmeyen bir durum ben onu arkada saat gibi çalışsın istiyorum aama saat atıyorum 2 ile 4 arasında pulse üretsin saat 4 ile 4,5 arası sadece calıssın ama pulse uretmesın ıstıyorum bu mantıklı bir istek mi ?

ete

Puls lar için bir bayrak kullan. Mesala adına puls diyebilirsin bit bazında olabilir.
Puls=1 olursa puls lar çalışır puls=0 olunca o kısmı atlarsın zaman kesmesi olarak kullanırsın.
Kısaca puls=1 iken step motor döner 0 iken dönmez sadece bekleme pulslarını sayar.
Ete

isoment01

Alıntı yapılan: ete - 24 Mayıs 2017, 12:15:51
Puls lar için bir bayrak kullan. Mesala adına puls diyebilirsin bit bazında olabilir.
Puls=1 olursa puls lar çalışır puls=0 olunca o kısmı atlarsın zaman kesmesi olarak kullanırsın.
Kısaca puls=1 iken step motor döner 0 iken dönmez sadece bekleme pulslarını sayar.
Ete
tamam hocam sonucu söylicem.

isoment01

#5
Alıntı yapılan: ete - 24 Mayıs 2017, 12:15:51
Puls lar için bir bayrak kullan. Mesala adına puls diyebilirsin bit bazında olabilir.
Puls=1 olursa puls lar çalışır puls=0 olunca o kısmı atlarsın zaman kesmesi olarak kullanırsın.
Kısaca puls=1 iken step motor döner 0 iken dönmez sadece bekleme pulslarını sayar.
Ete
hocam yaptım soyle yaptım 0-3200 4000-7200 arası sayım yapıcak ben de ;
if(sayac<3200 || sayac>4000)
{
output_high(pin_c2);
delay_us(20);
output_low(pin_c2);
}

bunu kullandım. hocam size bir soru soracağım bu step motor belirli bir yükü belirli bir mesafe götürecek 60 rpm ile dönüyor ağırlığı zorlanmadan kaldırdığını varsayarsak hızı da 400 hz çok yüksek değil yani yine de adım kaçırabilir mi ? neden soruyorum ? sistemin tam bitiş noktasında geri dönmesi gerek bunu yine matematiksel hesaplayıp yazılımla mı kontrol etmeliyim yoksa limit switch  tarzı mekanik ya da elektronik sensörlerle mi kontrol edeyim ? her ıkısını aynı anda kullanmak hata dogurabılır mi ?

ete

#6
Adım kaçırma tamamen motora verilen yük ile bağlantılıdır. Aşırı yüklersen kaçırıır. Taşıyabileceği sınırlar içinde kalırsan sorun olmaz. Bana göre durma noktalarına yakın noktalarda hız azaltmak daha uygun olur.
Bazı şeyleri görebilmen için direk uygulayıp sonuca bakman senin için daha iyi. Uygula ve gör. Sorun çıkarsa görerek tedbir almak bence daha iyi olur.
Ete

isoment01

Alıntı yapılan: ete - 24 Mayıs 2017, 16:48:04
Adım kaçırma tamamen motora verilen yük ile bağlantılıdır. Aşırı yüklersen kaçırıır. Taşıyabileceği sınırlar içinde kalırsan sorun olmaz. Bana göre durma noktalarına yakın noktalarda hız azaltmak daha uygun olur.
Bazı şeyleri görebilmen için direk uygulayıp sonuca bakman senin için daha iyi. Uygula ve gör. Sorun çıkarsa görerek tedbir almak bence daha iyi olur.
Ete
haklısınız dereyi görmeden paçayı sıvamayayım. teşekkürler hocam.

Powered by EzPortal