Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: gloin - 29 Nisan 2008, 14:13:29

Başlık: atmel + step motor + L297 , sorun
Gönderen: gloin - 29 Nisan 2008, 14:13:29
Merhabalar,

L297 kontrolörün pdf indeki L298 sürücüsüyle birlikte kullanıldığı devrenin aynısını yaptım, mikroişlemciden kontrol ediyorum fakat ilginç bir sorunum var. Çözemedim bir türlü.

* Kullandığım board at91sam7x-ek dev board, motor da T180 Astrosyn
http://uk.farnell.com/9598693/industrial-controls-automation/product.us0?sku=ASTROSYN-T180

* Amaç aslında basit, CAN bus hattından step sayısını alıyorum, ve buna göre motoru dönderiyorum. Step büyüklüğünü Yarım Step olarak seçtim.

* CAN den gelen devir sayısını alınca (interrupt ile), pwm kanalını ve interruptını enable ediyorum.


void AT91F_CAN_Handler(void)
{
 volatile unsigned int status;
 unsigned int can_data = 0;
 
 status = AT91F_CAN_GetStatus(AT91C_BASE_CAN) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN);
 AT91F_CAN_DisableIt(AT91C_BASE_CAN , status);

 if(status & AT91C_CAN_WAKEUP)
 {
   testCAN = AT91C_TEST_OK;
 }

 if(status & AT91C_CAN_MB0)
 {
   testCAN = AT91C_TEST_OK;
   rxcounter++;
   
   // Enable Reception on Mailbox 0
   AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN,AT91C_CAN_MB0);
   // Enable Mailbox 0 interrupt
   AT91F_CAN_EnableIt(AT91C_BASE_CAN,AT91C_CAN_MB0);
   
   can_data = AT91F_CAN_GetMessageDataLow(AT91C_BASE_CAN_MB0);
     
   turn_data = (can_data & 0x000000FF) << 8;
   
   turn_data |= (can_data & 0x0000FF00) >> 8;
   
   // Enable ch0 pwm interrupt
   AT91C_BASE_PWMC->PWMC_IER |= AT91C_PWMC_CHID0;      
   
   // enable channel 0    
   AT91C_BASE_PWMC->PWMC_ENA = AT91C_PWMC_CHID0;
   
   // set motor pins
   AT91C_BASE_PIOA->PIO_SODR = ENABLE | RESET;
 }
}


* PWM kanal 0 ı da 500 Hz verecek şekilde konfigüre ettim. Interrup ın içinde PWM interruptını sayıyorum, bunun da step miktarına denk olduğunu düşünüyorum.



void pwm_ch0_handler(void)
{
   volatile unsigned long pwmc_isr = AT91C_BASE_PWMC->PWMC_ISR;
   volatile unsigned long pioa_out = AT91C_BASE_PIOA->PIO_ODSR;
       
   if( (pwmc_isr & AT91C_PWMC_CHID0) && (pioa_out & ENABLE) )
   {
     turn_count++;
   }
   if( turn_count == turn_data)
   {
     // disable ch0 pwm
     AT91C_BASE_PWMC->PWMC_DIS = AT91C_PWMC_CHID0;
   
     // disable ch0 interrupt
     AT91C_BASE_PWMC->PWMC_IDR = AT91C_PWMC_CHID0;
     
     AT91C_BASE_PIOA->PIO_CODR = ENABLE | RESET; // disable the motor controller
     turn_count = 0;
   }
}



* Sorunum şöyle, örneğin CAN hattına 400 gönderdiğimde motor beklediğim şekilde tam 1 tur atıyor(PC den gönderiyorum). 200 gönderdiğimde yarım tur atıyor. Fakat mesela 1 gönderdiğimde 1 step yapmıyor, 2, 3, ve 4 de de aynı şekilde motorun mili hafifçe titriyor, dönme yok. Yani en az 5 değerini göndermem gerekiyor. 5 değerini ard arda gönderince motor 1 turu 50 kere de dönüyor, yani normalde 1.8 derece açılı motoru 7.2 derecede kullanabiliyorum bu şekilde olunca.

* Acaba nasıl kontrol etmek daha iyi olur, yaklaşımım mı yanlış? Motor konularında ilk uygulamam, fikir verirseniz sevinirim.

iyi çalışmalar,
Başlık: atmel + step motor + L297 , sorun
Gönderen: hatmeto - 29 Nisan 2008, 19:41:10
selam,
l297 entegresi problemli olabilir. başka bir motorla test edebilirsin
Başlık: atmel + step motor + L297 , sorun
Gönderen: ugurtelefon - 30 Nisan 2008, 10:25:35
kısaca durumu özetlersek;

gördüğüm kadarıyla çalışma modu olatrak HALFstep seçmişsin.
bu durumda motor 1 turunu 400 adımda tamamlayacaktır.zaten sende test sonucu bunu görmüşsün.
motora 2 yada 3 adım dediğinde motorun sadece titriyor dönmüyor.

1-önceliklle motorun bekleme anında ne durumda.??frenlemede mi??
yani elle dönmeyecek yada zor dönecek durumda mı??
bunu bi öğrenelim.
frenlemede değilse L298de bağlantı yada besleme sorunu olabilir.

2-eğer motor frenlemesi güzelse düşük adım sinyallerinde gelen sinyalin genliği(volt cinsinden) L297nin logic değerlerinin altındaymış gibi geliyor.

şöyle yapalım;
yaptığın devrede işlmecinin 5voltunu geçici olarak kes.
sadece L297 ve 298de besleme olsun.
L297ye gelen  step ve dir sinyallerini 2 kablo çekip LPTye bağla.daha sonrada herhangibir CAM programıyla dene.
bakalım devreyi doğru yapmışın yada devrede arıza varmı??