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,
selam,
l297 entegresi problemli olabilir. başka bir motorla test edebilirsin
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ı??