atmel + step motor + L297 , sorun

Başlatan gloin, 29 Nisan 2008, 14:13:29

gloin

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,
Gloin

hatmeto

selam,
l297 entegresi problemli olabilir. başka bir motorla test edebilirsin
Bir admin ataasözü derki: "biliyorsan paylaş mod yapsınlar. bilmiyorsan sus banlamasınlar"

ugurtelefon

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ı??