⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LPC2103两轴步进电机控制程序,带加减速,一路脉冲+方向输出、继电器延时、报警,三菱FX系列通信兼容RS232(9600,1,0.1)
💻 C
字号:
/**
*---------------------------------------------------*
*  功能描述:										*
*	输出: 一路脉冲+方向输出、继电器延时、报警		*
*	输入: 起动、停止								*
*	参数:											*
*	通信: 三菱FX系列通信兼容RS232(9600,1,0.1)		*
*---------------------------------------------------*
*  硬件描述  PCB:MPA101.DDB(20060610)				*
*			CPU:LPC2103(16MHz)						*
*---------------------------------------------------*
*  软件描述: 开发软件ADS1.2							*
*---------------------------------------------------*
*  版本修订: 										*
*---------------------------------------------------*/
//-------------------- IO描述 ------------------------
//
//			Y1:脉冲 	Y2:方向 	Y3:继电器延时 Y4:报警
//			X3:启动		X4:停止		X5:单切一刀
//-------- 运行程序 --------------------------------------------------------------
//	D0:		U16	站号
//	D1-11:		system
//	D14:	U16 flag
//	D15:	U16	画面延时 
//	D16-17:	U32	设定长度	123.45mm
//	D18-19:	U32	设定数量 123456
//	D20-21:	U32	完成数量	123456
//	D22: 	U16	加工速度 999/min
//	D23: 	U16	速度		1-5
//	D24-25: U32	比例		1.23456mm/p
//	D26-27: U32	延时		1.234秒
//	D28: 	U16	起步速度 12345Hz
//	D29: 	U16	加速度	12345Hz/秒
//	D30: 	U16	减速度	12345Hz/秒
//	D31-35: U16 最高速度	12345Hz
//

#include "Main.h"
U32 speed_temp;
/*------------------------------------------*/
/* Function   : int main(void)				*/
/* Description: 主程序						*/
/*------------------------------------------*/
int main(void)
{
	U32 *p1, *p2, *p3, *p5;
	S32 *p4,*p6,*p7;
	U32	inold, innew;
	U8  runf;
	
	U8 number;
	
	system_init();
	FM_ReadSeq(0, (U8 *)&DREG[0], MAXDREG*2);
	if((FM_RByte(0)!=0) && (FM_RByte(2)!=0x5a)){		// 如果是第一次初始化
		Dreg_Init();
		FM_WriteSeq(0, (U8 *)&DREG[0], MAXDREG*2);
	}
	DREG[15]=1;				// 开始画面延时1秒
	DelayMs(2000);
	DREG[15] = 2;
	DREG[14] = 0;
	runf = 0;
	DREG[57]=0;
	p1 = (U32*)&DREG[24];
	p2 = (U32*)&DREG[20];
	p3 = (U32*)&DREG[26];
	p4 = (S32*)&DREG[12];
	p5 = (U32*)&DREG[22];
	p6 = (S32*)&DREG[44];
	p7 = (S32*)&DREG[42];
	count = (*p7);
	xposi = (*p4);
	yposi = (*p6);
	count1 = abs(count);
	xscale = (U32)(DREG[24])+(U32)(DREG[25]<<16);
	yscale = (U32)(DREG[20])+(U32)(DREG[21]<<16);
	iscale = (U32)(DREG[38])+(U32)(DREG[39]<<16);
	pause = 0;
	number=0;
	xposi=0;
	while(1){
		inold = innew;
		if(temp_in==(FIO0PIN&INDATA)){
			if(in_count>8){
				innew = temp_in;
				in_count = 0;
			}
		} else {
			in_count = 0;
		}
		temp_in = FIO0PIN&INDATA;
		
//===========================================================		
		if(innew&IN10){SETSTOP();CLRSTART();	}		// 停止
		
		if(WSTOP){//----------------停止
			CLRSTOP();
			DREG[58] =0;
		    runf = 0;
		    X_Stop();
		    Y_Stop();
		  }
//-------------------------------------		
if(innew&IN9){				// 启动
	 SETSTART();
	DREG[57]=0;	
	
	number=0;   
 }
 //-----------------------------
 if((relay&bit5)&&(!WSTART)){		  //手动/自动
 	relay&=0xffdf;
   if(!WAUTOF){SETAUTOF(); relaysd|=bit5;  }
   
 	else {CLRAUTOF(); relaysd&=0xffdf; }
  }	
  //----------------------------
 if(WAUTOF){//手动操作
			
			if((innew&IN6)||(relay&bit1)){
				if(X_Status()==CP_STOP) X_HandMove(CCW);  	//X正转
				
				SETF5();
			}else if((innew&IN5)||(relay&bit2)){
				
				if(X_Status()==CP_STOP) X_HandMove(CW);		//X反转
				SETF5();
			}else if(WF5){
				
				if(X_Status()!=CP_STOP) X_Stop();
				CLRF5();}
			//------------------
			if((innew&IN4)||(relay&bit3)){
				if(Y_Status()==CP_STOP) Y_HandMove(CCW);  	//Y正转
				
				SETF6();
			}else if((innew&IN3)||(relay&bit4)){
				
				if(Y_Status()==CP_STOP) Y_HandMove(CW);		//Y反转
				SETF6();
			}else if(WF6){
				
				if(Y_Status()!=CP_STOP) Y_Stop();
				CLRF6();}
			
		 }
			
		  
//----------------------------------------------------		
if((WSTART)&&(!WAUTOF)){
	
    if(runf==0){
    	if(Y_Status()==CP_STOP){ 
    	     FIO0SET = Y8;	//气缸
    	     FIO0SET = Y7;
    	     speed_temp=DREG[32];
    	     xposi=0;
      		 setxpara(CW);
      
             DREG[58] =1;  //test
	 		 runf++;
	 		
	    }
     }
    else if(runf==1){ 
    		 if(X_Status()==CP_STOP){
    			out1dtime_c=400;	 
    		    runf++;	 
    		  }  
    	 }
    else if(runf==2){ 
    		 if(out1dtime_c==0){
    		 		DREG[58] =2;  //test
    		 	    speed_temp=DREG[51];
    		        setxpara(CCW);
    			    runf++;
    			  
    	     }
          }
     else if(runf==3){   
     		 if(X_Status()==CP_STOP){	
     				  
     		          ++DREG[57];
     		          
     		     if(DREG[57]<DREG[50]){
     		            
     					 DREG[58] =3;  //test
     			   		 setypara(0);
                   		 runf=0;
                   		 
                   }
                   else if(DREG[57]>DREG[50]) {
                         	
                   			 CLRSTART();	
                        	 DREG[58] =4;	//完成
                        	 DREG[57]--;
                       	 	 FIO0CLR = Y8; 
                       		 FIO0CLR = Y7;
                        	 runf=0;
                        } 
                
                  
              }
		  }
		DREG[53]  = abs(xposi*(S32)(xscale)/(S32)(1000));   //显示位置  
	
}
//==================================================		
		SendRS();												// 串口发送数据
		if(FIO0PIN&WDI) FIO0CLR = WDI; else FIO0SET = WDI;
	}
	return(0);
}

//----------------------------------------------//
// 	Function   : setpara						//
// 	Description: 				x轴自动运行		//
//----------------------------------------------//
void setxpara(U32 dir)
{
	xscale = (U32)(DREG[24])+(U32)(DREG[25]<<16);
	xpara.lowsp = DREG[28];
	xpara.upsp = DREG[29];
	xpara.downsp = DREG[30];
	xpara.hisp = speed_temp*100000/xscale;//  (U32)(DREG[32])*100000/xscale;
	xpara.distance = (U32)(DREG[16])*1000/xscale;
	xpara.dir = dir;
	xpara.mode = 0;		//定长
	X_Motion(xpara);
}
//----------------------------------------------//
// 	Function   : setpara						//
// 	Description: 		Y轴自动运行						//
//----------------------------------------------//
void setypara(U8 dir)
{
	yscale = (U32)(DREG[20])+(U32)(DREG[21]<<16);
	iscale = (U32)(DREG[38])+(U32)(DREG[39]<<16);
	
	ypara.lowsp = DREG[35];//起加速
	ypara.upsp = DREG[36];//加
	ypara.downsp = DREG[41];//咸
	ypara.hisp = DREG[34]*100000/yscale;//运行速度
	ypara.mode = 0;	//定长
	ypara.dir = dir;//放向
	ypara.distance =(U32)(DREG[37])*1000/yscale;
	Y_Motion(ypara);//发脉冲
}
//----------------------------------------------//
// 	Function   : setpara						//
// 	Description: 		x		轴	手动运行				//
//----------------------------------------------//
void X_HandMove(U8 dir)
{
	xscale = (U32)(DREG[24])+(U32)(DREG[25]<<16);
	xpara.lowsp = DREG[28];
	xpara.upsp = DREG[29];
	xpara.downsp = DREG[30];
	xpara.hisp = (U32)(DREG[31])*100000/xscale;
	xpara.dir = dir;
	xpara.mode = 1;
	xpara.distance = 10000;
	X_Motion(xpara);
}
//----------------------------------------------//
// 	Function   : setpara						//
// 	Description: 								//
//----------------------------------------------//
void Y_HandMove(U8 dir)
{
	yscale = (U32)(DREG[20])+(U32)(DREG[21]<<16);
	ypara.lowsp = DREG[35];
	ypara.upsp = DREG[36];
	ypara.downsp = DREG[41];
	ypara.hisp = (U32)(DREG[33])*100000/yscale;
	ypara.dir = dir;
	ypara.mode = 1;
	ypara.distance = 10000;
	Y_Motion(ypara);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -