LPC2378 le Step motor döndürme programı

Başlatan death_free, 19 Ocak 2011, 17:10:24

death_free

Merhaba arkadaslar..bi program yaptım işim gereği.geliştirme aşamasında ama fakat sonuclar gayet sevindirici..4 eksen step motorlu bi program hazırladım serihaberleşmeli.visual basic tarafında da bi program hazırladım görsellik ve data alısverişi için.fakat karmasık görünmesin diye programı tek eksen için indirgedim.umarım üstadlarımın ilgisi çeker yeni baslayanlarada faydam dokunur.

  /*PROJE = UART1 SERI KESME PROGRAMI*/															
#include <lpc23xx.h>
void sio_irq (void)__irq ;
void T1isr(void) __irq;
void t0mr(void) __irq;
void t2mr(void) __irq;
void tmr1_initial (void);
void tmr2_initial(void);
void xpozhesap(void);
void xstart(void);
void paket1 (void);
void paket5 (void);
void paket8 (void);
void paket9 (void);
int timer0dgr;
int timer1dgr;
int Aku1;
int r;
int sint;
int sbuf1;
int sbuf2;
int sbuf3;
//int puls_sayici;
int dizi1[25] = {18000,18000,12852,9990,8172,6912,5994,5292,4734,4284,3906,3600,3300,3096,2898,2718,2556,2430,2304,2178,2088,1998,1908,1836,1800};
int dizi2;
int hiz1;
int hiz2;
int hizx;
int softyonx;
int softhizx;
int tekislem;
//*****************  Eksen Tanimlamala
int xpcpoz;
int xkoor;
short xucgen;
short xfren;
short xmesafe;
short xyon;
short xstartbit;
short xharekettest;
//******************************
//*************************
short eksensecimi;
short pozisyon1;
short pozisyon2;
short pozisyon3;
short hiz;

short koor1;
short koor2;
short koor3;
/*************************************************/
short intruction;
short paketbuffer;
short durum;
short xhedefok;
short aradegisken;
int xartilimit;
int xeksilimit;
short errordurum;
//*******************************************************
/////////////////////////////////////////////////////////
/*                  INITIAL PROGRAMLAR				   */
/////////////////////////////////////////////////////////
//*******************************************************
 /*  UART1 INITIAL PROGRAM   */
void init_uart1() 
 {  	
	long baudrate;
	long fdiv;		
	baudrate = 9600;
	PCONP   |= (1<<4);
	PINSEL0  = 0x40000000;		              /* RXT1 VE TXD1 ENABLE AYARLARI*/
	PINSEL1  = 0x1;				              /* RXT1 VE TXD1 ENABLE AYARLARI*/
	U1LCR    = 0x83;			                  /* 8 BIT PARITY YOK 1 STOP BITI */
	fdiv     = (18000000 / 16 ) / baudrate;
	U1DLL    = fdiv % 256;
	U1DLM    = fdiv / 256;
	U1FDR    = 0x67; 				              /* Fractional Divider */
	U1LCR    = 0x03;				              /* DLAB = 0 */
	U1FCR    = 0x00;
	U1FDR    = 0x00;
/*************************vektör adres*******************/
  //	VICVectAddr7 = (unsigned)sio_irq;
  // 	VICVectPriority7 = 15;                   /*   " UART 1 in vectorel adresi" */
  // 	VICIntEnable = 0x80;   		             /* Enable UART1 Kesmesi */
  //	U1IER = 3;       		                 /* Enable UART1 RX and THRE Interrupts */
 }
 /*****************************************************************/
 /********   TIMER 0 INITIAL                                    */
 void tmr0_initial()
 {
 	PINSEL3 |= 0XF000000;//0x3000000;
 	T0PR    = 0x00000000;                   // On Bolme ( Bolucu ) 
	T0EMR	= 0xFFF;//0XF3;
	T0TCR   = 0x00000001;                   //Timer0'i baslat 
 }
 void tmr2_initial()
 {
 	
	PINSEL0 |= 0XFF000;
	T2TCR   = 0x00000002;
	T2PR    = 0x00000000;                   // On Bolme ( Bolucu ) 	 	
	T2EMR	= 0xFFF;//0XF3;
	T2TCR   = 0x00000001;                   //Timer0'i baslat 
	
 }
 /********   TIMER 1 INITIAL********************************/
 void tmr1_initial()
 {
 	T1PR    = 0x00000000;                   // On Bolme ( Bolucu ) 
	T1TCR   = 0x00000002;		            // Timer Kontrolde Sayiciyi temizle
	T1MCR   = 0x00000003; 		            //mach kontrol register		  //  ???????	
	T1MR0	= 180000;	            				   
	T1TCR   = 0x00000001;                   //Timer0'i baslat 
	VICVectAddr5=(unsigned)T1isr;	        // Kesme vektör adresi
	VICVectPriority5=0x00000000;		    // Kesme onceligini ata
	VICIntEnable=0x00000020;			    //Kesmeyi aktif et.
 }

 /*************************************************************/
 /************ INITIAL PLL	                                 */
  void activate_PLL(void)
 {
	PLLCFG  = 0x50047;						 /*  72 mhz 	  */
	PLLCON  = 0x01;
	PLLFEED = 0xAA;
	PLLFEED = 0x55;

	while(!(PLLSTAT&0x04000000));            /* PLL yi Bekle  */ 
	PLLCON  = 0x03;
	PLLFEED = 0xAA;
	PLLFEED = 0x55;
	CCLKCFG = 0X03;
}
//**********************************************************
////////////////////////////////////////////////////////////
 /*                ALT PROGRAMLAR 					   */
 //////////////////////////////////////////////////////////
 //********************************************************
 void paket1()		   // X Ekseni Hesap Bilgileri //
 {
 	switch (paketbuffer)
	{
		case 1:
			if (U1LSR & 0x01)
			{
				paketbuffer = paketbuffer + 1;
				pozisyon1= (U1RBR);										
				U1THR = (pozisyon1);
			}
			break;
		case 2:
			if (U1LSR & 0x01)
			{
				paketbuffer = paketbuffer + 1;
				pozisyon2 = (U1RBR);										
				U1THR = (pozisyon2);
			}
			break;
		case 3:
			if (U1LSR & 0x01)
			{
				paketbuffer = paketbuffer + 1;
				pozisyon3 = (U1RBR);										
				U1THR = (pozisyon3);
			}
			break;
		case 4:
			if (U1LSR & 0x01)
			{
				paketbuffer = paketbuffer + 1;
				hiz = (U1RBR);										
				U1THR = (hiz);
				xpozhesap ();
				sint = 1;
			}
			break;
	}
 }
 /*****************************************************/
 /*****************************************************/
 void paket5() 				// Eksenlerin Durum Bilgileri
 {
	if (U1LSR & 0x01) 	
	{
		aradegisken = (U1RBR);
		durum = xhedefok ;
		U1THR = (durum);
		sint = 1;
	}
 }
 /******************************************************/
 void paket8()				// Eksenlerin Start Bilgileri
 {
	if (U1LSR & 0x01) 	
	{
		aradegisken = (U1RBR);		
		U1THR = (aradegisken);
		switch (aradegisken)
		{
			case 1:
				xstart();
				break;
		}
		sint = 1;
	}	 	
 }
 /*******************************************************/
 void paket9()		   // X EKSENI KOORDINAT BILGISI
 {
 	switch (paketbuffer)
	{
 		case 1:					
			if (U1LSR & 0x01)
			{
				aradegisken=U1RBR;
				koor1=xkoor/65536;
				koor2=(xkoor-(koor1*65536))/256;
				koor3=xkoor&0xff;								
				U1THR = (koor3);				
				paketbuffer = paketbuffer + 1;			
			}
			break;
		case 2:
				if (U1LSR & 0x01)
			{											
				aradegisken=U1RBR;
				U1THR = (koor2);				
				paketbuffer = paketbuffer + 1;
			}
			break;
		case 3:
				if (U1LSR & 0x01)
			{				
				aradegisken=U1RBR;							
				U1THR =koor1;
				sint = 1;							
			}
			break;
	}
 }
  /*******   X ekseninin Arti ve Eksi limit bilgileri */
 void paket13()
 {
 	switch (paketbuffer)
	{
 		case 1:					
			if (U1LSR & 0x01)
			{
				koor1=U1RBR;
				U1THR = (koor1);				
				paketbuffer = paketbuffer + 1;			
			}
			break;
		case 2:
				if (U1LSR & 0x01)
			{											
				koor2=U1RBR;
				U1THR = (koor2);				
				paketbuffer = paketbuffer + 1;
			}
			break;
		case 3:
				if (U1LSR & 0x01)
			{				
				koor3=U1RBR;							
				U1THR =koor3;
				xartilimit=(koor3*65536)+(koor2*256)+koor1;
				paketbuffer = paketbuffer + 1;							
			}
			break;
		case 4:					
			if (U1LSR & 0x01)
			{
				koor1=U1RBR;
				U1THR = (koor1);				
				paketbuffer = paketbuffer + 1;			
			}
			break;
		case 5:
				if (U1LSR & 0x01)
			{											
				koor2=U1RBR;
				U1THR = (koor2);				
				paketbuffer = paketbuffer + 1;
			}
			break;
		case 6:
				if (U1LSR & 0x01)
			{				
				koor3=U1RBR;							
				U1THR =koor3;
				xeksilimit=(koor3*65536)+(koor2*256)+koor1;
				sint=1;							
			}
			break;
	}
}
/*****************************************************/
/**********************************************************/
/*             TIMER 1 KESME ALT PROGRAMI                 */
/*				SOFTSTART - SOFTSTOP					  */
void T1isr()	__irq
{
	/********* X Ekseni SoftStart - SoftStop Rampasi **********/
	if (softyonx == 1)
	{
		if (softhizx < hizx)
			softhizx = softhizx + 1;
	}
	else
	{
		if (softhizx > 0)
			softhizx = softhizx - 1;
	}
	/*********************************************************/
	T1IR |= 0x00000001;                       // Match 0 olustu flagini silelim	(KESME BAYRAGINI TEMIZLE)
   	VICVectAddr = 0x00000000;                 //  KESME SONU			
}		
/********************************************************************/
/*       SERI HABERLESME PROGRAMI                                   */
void getchar()
{
	switch (sint)
	{			
		case 1:
			if (U1LSR & 0x01)
			{
				eksensecimi = (U1RBR);										
				U1THR = (eksensecimi);
				sint=eksensecimi;
				paketbuffer=1;
			}
			break;
		case 2:
			paket1();	  /* X Ekseni Pozisyon Bilgisi  */
			break;
		case 6:
			paket5();	  /* EKSEN DURUM BILGILERI  	*/
			break;
		case 9:
			paket8();	  /*  Eksen Start Bilgisi  		*/
			break;
		case 10:
			paket9();	  /* X Ekseni Koordinat bilgisi */
			break;
		case 14:
			paket13();	  /* X  EKSEN  + VE - LIMIT		*/
			break;
		case 15:
			errordurum=errordurum & 0x0F;
			sint=1;
			break;
	}						 	
}      
/***********************   X Ekseni Pozisyon Hesaplamasi (trapez - ücgen hareket)************/
void xpozhesap()
{
	xpcpoz=pozisyon1+(pozisyon2*256)+(pozisyon3*65536);
	softhizx = 0;
	xfren=0;
	if ((xkoor-xpcpoz)>=0)
	{
		xmesafe=xkoor-xpcpoz;
		xyon=0;
	}
	else 
	{
		xmesafe=xpcpoz-xkoor;
		xyon=1;
	}
	xucgen=xmesafe/2;	
	hizx=hiz;
}
void xstart()
{
	xhedefok=0;	
	softhizx=0;		
	
	if (xkoor==xpcpoz)
	{
		xhedefok=1;
		xharekettest=0;		
	}
	else
	{
		T2MR0=T2TC+dizi1[softhizx];
		xstartbit=1;
		softyonx=1;
		xharekettest=1;		
	}
}
//**********************************************************
////////////////////////////////////////////////////////////
/*                 MAIN 								   */
 //////////////////////////////////////////////////////////
 //********************************************************
int main() 
{
	PCONP =PCONP&0XFBF7FF7D;
	PCONP |=0X400000;
	activate_PLL();	

	FIO0DIR = 0X4000;
	FIO0CLR	= 0X4000;
	//IODIR0=0X200000;
	init_uart1();			                 /* Seri haberlesmeyi Kur */
	tmr1_initial();
	 tmr2_initial();
	
//	puls_sayici = 1;
	sint=1;		
	timer0dgr = 1;
//	timer1dgr = 1;
	tekislem = 0;
	T2MR0 = 0;
	//dizi1 = 900;
	dizi2 = 900;
	hiz1 = 0;
	softyonx = 0;
	softhizx = 0;
/******************** X ekseni deger atamaları   *********************/
	xkoor=0x10000;
	FIO4DIR=0XFFFFFF; 	
/**********************************************************************/

	while(1) 
	{	 
		getchar();
	
/*           X EKSENI POZISYON POZISYON HAREKET    */
		switch (timer0dgr)
		{			
			case 1:
				if 	(!(IOPIN0 & 0X40))
				{						
					T2MR0 = T2MR0 + dizi1[softhizx];
					timer0dgr = 2;
				}
				break;			
			case 2:
				if 	((IOPIN0 & 0X40))
				{
					if (xyon==1)
					{
						xkoor=xkoor+1;
						if (xkoor>xartilimit)
						{
							softyonx=0;
							xharekettest=4;						
						}
					}
					else
					{ 
						xkoor=xkoor-1;
						if (xkoor<xeksilimit)
						{
							softyonx=0;
							xharekettest=4;						
						}
					}	
					T2MR0 = T2MR0 + dizi1[softhizx];
					timer0dgr = 1;
					if (xmesafe==0) 
					{
						T2MR0=0;
						xhedefok=1;
						xharekettest=0;
					}
					else 
						xmesafe=xmesafe-1;

					switch (xharekettest)
					{
						case 1:
							xfren=xfren+1;	
							if (hizx==softhizx)
								xharekettest=2;
							if (xfren==xucgen)
							{						
								softyonx=0;	
								xharekettest=3;
							}
							break;
						case 2:
							if (xmesafe==xfren)
							{
								softyonx=0;
								xharekettest=3;
							}
							break;								
						case 3:							
							break;
						case 4:
							if (softhizx==0 )
							{
								T2MR0=0;
								xhedefok=1;
								errordurum |=16;
								xharekettest=0;
							}
							break;
					}							
				}
				break;			
		}
	}
}


visual basic programı için de
http://www.upload.gen.tr/d.php/www/j5zsqcqj/stepmotor.rar.html
indirebilirsiniz..
çalışmasını gösterdiğim bi videoda aşağıdaki linktedir.


elimden geldiği kadar sorulara cevap vermeye calısırım..özeleştirilere tavsiyelere acıgım ..cünkü benimde sorularım var :D

herkese teşekkür ediyorum.iyi çalışmalar
<<<<<Aslana sormuşlar ensen niye kalın ? Aslan : "Kendi işimi kendim görürüm " demiş>>>>  World Of Warcraft Cataclysm  /// REalm : Frostmane  Nightwalkér

KABO

Paylasımın için tesekkurler.sitedeki ARM uygulamalarına yeni başlayan arkadaşlara yardımı olacagını usunuyorum.hiç bir arkadaş yorum yazmamış ama cok degerli bir paylaşım gondermişsin.Emegine saglık.
BILGI PAYLASTIKCA COGALIR...

computerboy

Üstad emeğine sağlık benim açımdan eşsiz bir paylaşım videoda görünen lpc kit motor sürücü içeren tarzda bir kitmi yada harici bir motor sürücüyü pwm tekniği kullanarakmı sürdünüz yada açıklayıcı bir mesaj yazarmısınız ? birde visual basic kısmını indirmeye kalktığım zaman sayfa görüntülenemiyor diyor.

death_free

#3
Alıntı yapılan: computerboy - 22 Ocak 2011, 13:51:15
Üstad emeğine sağlık benim açımdan eşsiz bir paylaşım videoda görünen lpc kit motor sürücü içeren tarzda bir kitmi yada harici bir motor sürücüyü pwm tekniği kullanarakmı sürdünüz yada açıklayıcı bir mesaj yazarmısınız ? birde visual basic kısmını indirmeye kalktığım zaman sayfa görüntülenemiyor diyor.

Teşekkür ederim computerboy :)..

Normal geliştirme kiti bu olimexin hocam.olimexten öle full bi geliştirme kiti seçeyim dedim 2378 aldım..

Pwm le değilde timerin mat kanallarından sürdüm.tabiki motoru sürmek için softstart softstop bi alt programı olusturdum.onuda baska bi timer kesmesiyle sağladım..ama geneline baktıgında bi pwm sinyali varmış gibi görünüyor.

Linki denedim fakat herhangi bi sorunla karsılasmadım indirebiliyorum   ;)
<<<<<Aslana sormuşlar ensen niye kalın ? Aslan : "Kendi işimi kendim görürüm " demiş>>>>  World Of Warcraft Cataclysm  /// REalm : Frostmane  Nightwalkér

death_free

Alıntı yapılan: KABO - 22 Ocak 2011, 13:44:24
Paylasımın için tesekkurler.sitedeki ARM uygulamalarına yeni başlayan arkadaşlara yardımı olacagını usunuyorum.hiç bir arkadaş yorum yazmamış ama cok degerli bir paylaşım gondermişsin.Emegine saglık.


KABO teşekkür ederim..forumda arkadaslarımızın böyle bi projeye ihtiyacı oldugunda konunun ilgi cekeceğini umuyorum.
<<<<<Aslana sormuşlar ensen niye kalın ? Aslan : "Kendi işimi kendim görürüm " demiş>>>>  World Of Warcraft Cataclysm  /// REalm : Frostmane  Nightwalkér

computerboy

Üstad kodları inceledim karmaşık bir algoritma kullanmıssınız çözmeye çalışıyorum :)  ayrıca enkoderde kullandınızmı mantığını anlamaya çalışıyorum ama anlayamadım rs232den gönderdiğiniz veri diziyemi tanımlıyorsunuz paket paket ayırmışsınız c dilini yeni öğreniyorum bende sorduğum sorular amatörce olabililir.

death_free

Bu benim kendimce uyguladıgım bi haberleşme çözümüydü..tamamen haberleşme kesmesiz calısıyor.motora yolverme işlemini tek bi alt programa sıgdırmaktansa paketli alt program olusturmayı yegledim cünkü ilerde geriye dönüp baktıgımda hatırlayabilmek anlayabilmek için.

Farkındaysan timer,serihaberleşme,pll,baudrate hesaplamayı acıklama yapmaya calıstım tektek.

kodlardaki diziler içerisinde motorun rampa ivmeleri saklı.

detay istersen sor cekinme.paylasımdan asla cekinmem  ;)
<<<<<Aslana sormuşlar ensen niye kalın ? Aslan : "Kendi işimi kendim görürüm " demiş>>>>  World Of Warcraft Cataclysm  /// REalm : Frostmane  Nightwalkér

computerboy

#7
Üstad adım adım kodları inceleyip C dilini öğreniyorum önceden bende pic18 ile proton ve visual basic 6.0 kullanarak cnc uygulaması yapmıştım onu arm'a aktarmak istiyorum yavaş yavaş ilerliyorum takıldğım nokta olursa size sorarım. ayrıca karşılıksız paylaşımınız için size minnettar kaldım.

İlk önce pll ve timer olayını çözmem lazım türkçe kaynak bulsam süper olacak.

death_free

Forumda barış samancı diye bi üsdat var.Onun türkce cevirisi ve kendine has bi anlatımı olan lpc2000 programlama klavuzu die bi kitabı var..kesinlikle tavsiye ederim sana onu.bana cok iyi bi kaynak olmuştu..

bu arada allah razı olsun paylaşımı için  ;)
<<<<<Aslana sormuşlar ensen niye kalın ? Aslan : "Kendi işimi kendim görürüm " demiş>>>>  World Of Warcraft Cataclysm  /// REalm : Frostmane  Nightwalkér