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

📄 main.c

📁 自动控制电机程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
		IO0PIN = (0xD << 10) | (0x0 << 21);
	}
	else if( q3 == 3)
	{
		IO0PIN = (0x9 << 10) | (0x0 << 21);
  	}
  	else if( q3 == 4)
	{
		IO0PIN = (0xB << 10) | (0x1 << 21);
	}
	else if( q3 == 5)
	{
		IO0PIN = (0x3 << 10) | (0x1 << 21);
  	}
  	else if( q3 == 6)
	{
		IO0PIN = (0x7 << 10) | (0x1 << 21);
	}
	else if( q3 == 7)
	{
		IO0PIN = (0x6 << 10) | (0x1 << 21);
  	}
	q3++;
}
void SMC4_out() 
{
	q4 = q4%8;
	if(Direction == 0 )	//顺时针
	{ 
		if( q4 == 0 )
		{
			IO0PIN = (0xE << 3) | (0x0 << 20);
  		}
		else if( q4 == 1)
		{
			IO0PIN = (0xC << 3) | (0x0 << 20);
  		}
		else if( q4 == 2)
		{
			IO0PIN = (0xD << 3) | (0x1 << 20);
		}
		else if( q4 == 3)
		{
			IO0PIN = (0x9 << 3) | (0x1 << 20);
  		}
  		else if( q4 == 4)
		{
			IO0PIN = (0xB << 3) | (0x1 << 20);
		}
		else if( q4 == 5)
		{
			IO0PIN = (0x3 << 3) | (0x1 << 20);
  		}
  		else if( q4 == 6)
		{
			IO0PIN = (0x7 << 3) | (0x1 << 20);
		}
		else if( q4 == 7)
		{
			IO0PIN = (0x6 << 3) | (0x0 << 20);
  		}
	}
	else if(Direction == 1)	//逆时针
	{
		if(q4 == 0 )
		{
  			IO0PIN = (0x6 << 3) | (0x0 << 20);
  		}
		else if( q4 == 1)
		{
			IO0PIN = (0x7 << 3) | (0x1 << 20);
  		}
		else if( q4 == 2)
		{
			IO0PIN = (0x3 << 3) | (0x1 << 20);
  		}
		else if( q4 == 3)
		{
			IO0PIN = (0xB << 3) | (0x1 << 20);
 		}
  		else if( q4 == 4 )
		{
  			IO0PIN = (0x9 << 3) | (0x1 << 20);
  		}
		else if( q4 == 5)
		{
			IO0PIN = (0xD << 3) | (0x1 << 20);
  		}
		else if( q4 == 6)
		{
			IO0PIN = (0xC << 3) | (0x0 << 20);
  		}
		else if( q4 == 7)
		{
			IO0PIN = (0xE << 3) | (0x0 << 20);
  		}
	}
	q4++;
} 
void SMC4_out1()
{
	q4 = q4%8;
	if(Direction == 0)	//顺时针
	{
		;
	}
	else if(Direction == 1)	//逆时针
	{
		q4 = q4+6;
	}
	q4 = q4%8;
	if( q4 == 0 )
	{
		IO0PIN = (0xE << 3) | (0x0 << 20);
  	}
	else if( q4 == 1)
	{
		IO0PIN = (0xC << 3) | (0x0 << 20);
  	}
	else if( q4 == 2)
	{
		IO0PIN = (0xD << 3) | (0x1 << 20);
	}
	else if( q4 == 3)
	{
		IO0PIN = (0x9 << 3) | (0x1 << 20);
  	}
  	else if( q4 == 4)
	{
		IO0PIN = (0xB << 3) | (0x1 << 20);
	}
	else if( q4 == 5)
	{
		IO0PIN = (0x3 << 3) | (0x1 << 20);
  	}
  	else if( q4 == 6)
	{
		IO0PIN = (0x7 << 3) | (0x1 << 20);
	}
	else if( q4 == 7)
	{
		IO0PIN = (0x6 << 3) | (0x0 << 20);
  	}
	q4++;
}
void T0_ini()
{
	T0TC  = 0;							//定时器设置为0
	T0PR  = 0;							//时钟不分频
	T0MCR = 0x03;						//设置T0MR0匹配后复位T0TC,并产生中断标志
	T0MR0 = Fpclk / 290;				//1/290秒定时
	T0TCR = 0x01;						//启动定时器
}
void SMC_ini()
{
	PINSEL0 = 0x00000000;				//所有管脚连接GPIO	
	PINSEL1 = 0x00000000;	
	PINSEL2 = PINSEL2 & (~0x08);		//P1[25:16]连接GPIO
	IO0DIR  = M;
	IO1DIR  = ~MD;
}
void Motor(int num,int dir,int step,int speed)
{
	int i;
	T0_ini();
	
	if(speed == 0)
	{
		T0MR0  = Fpclk / 100;			//100Hz
	}
	else if(speed == 1)
	{
		T0MR0  = Fpclk / 150;			//150Hz
	}
	else if(speed == 2)
	{
		T0MR0  = Fpclk / 200;			//200Hz
	}
	else if(speed == 3)
	{
		T0MR0  = Fpclk / 250;			//250Hz
	}
	else if(speed == 4)
	{
		T0MR0  = Fpclk / 290;			//290Hz
	}
	else
	{
		T0MR0  = Fpclk / 290;			//290Hz
	}
	MotorSelected = num;
	Direction = dir;

	for(i=0;i<step;i++)
	{				
		while((T0IR & 0x01) == 0);
		T0IR = 0x01;
		if(MotorSelected == 0)
		{
			;
		}
		else if(MotorSelected == 1)
		{
			//SMC1_out();
		}
		else if(MotorSelected == 2)
		{
			SMC2_out1();
			if(SampleOverFlag == 1)
			{
				Continue[8]++;
				if(Continue[8] == '9')
				{
					Continue[8] = '0';
					Continue[7]++;
					if(Continue[7] == '9')
					{
						Continue[7] = '0';
						Continue[6]++;
						if(Continue[6] == '9')
						{
							Continue[6] = '0';
							Continue[5]++;
						}
					}
				}
			}
			USB_WriteEndpoint(3, 10, Continue);//GenEpBuf);			/* 发送10个字节到PC */
		}
		else if(MotorSelected == 3)
		{
			SMC3_out1();
			USB_WriteEndpoint(3, 10, Continue);//GenEpBuf);			/* 发送10个字节到PC */
		}
		else if(MotorSelected == 4)
		{
			SMC4_out1();
			USB_WriteEndpoint(3, 10, Continue);//GenEpBuf);			/* 发送10个字节到PC */
		}
	}
}

/////////////////////////////////////////////////////////////////

//void __irq IRQ_Eint1 (void)
//{
	//Motor(2,1,1,4);		//走一步
	//EXTINT = 0x02;		//清除EINT1中断标志
	//VICVectAddr = 0x00;	//向量中断结束
//}
//void EINT1_ini()
//{
	//PINSEL0 = (PINSEL0 & 0xCFFFFFFF) | EINT1;	//P0.14连接EINT1
	
	//VICIntSelect   = 0x00000000;				//设置所有中断分配为IRQ中断
	//VICVectCntl0   = 0x20 | 15;					//分配外部中断1到向量中断0
	//VICVectAddr0   = (uint32)IRQ_Eint1;			//设置中断服务程序地址
	//VICIntEnable   = 1 << 15;					//使能EINT1中断
	//EXTINT         = 0x02;						//清除EINT1中断标志
//}

////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////
//Motor(int num,int dir,int step,int speed);

void M2Position_ini()	//上下电机初始化
{
	if(((IO1PIN & M2P) == 0))	//5不挡
	{
		if((IO1PIN & M2D)>>17 == 1)	//6挡
		{
			Motor(2,1,5,4);	//先向下走5步
			M2PF = (IO1PIN & M2P);
			M2DF = (IO1PIN & M2D);
			while((M2PF == 0) | (M2DF == 0))	//先下,走到都挡为止
			{
				Motor(2,1,1,4);
				M2PF = (IO1PIN & M2P);
				M2DF = (IO1PIN & M2D);
			}
			Motor(2,0,80,4);
			while((IO1PIN & M2D)>>17 == 1)	//再上,走到6不挡为止
			{
				Motor(2,0,1,4);
			}
		}
	}
	else if(((IO1PIN & M2P)>>16 == 1))// & ((IO1PIN & M2D) == 1))	//5挡住
	{
		if((IO1PIN & M2D)>>17 == 1)	//6挡住
		{
			while((IO1PIN & M2D)>>17 == 1)	//往上,走到6不挡为止
			{
				Motor(2,0,1,4);
			}
			Motor(2,0,80,4);	//先向上走80步
			if((IO1PIN & M2P)>>16 == 1)	//5挡
			{				
				while((IO1PIN & M2D)>>17 == 1)	//往上,走到6不挡为止
				{
					Motor(2,0,1,4);
				}
			}
			else if(IO1PIN & M2P == 0)	//5不挡
			{
				while((IO1PIN & M2D)>>17 == 1)	//往下,走到6不挡为止
				{
					Motor(2,1,1,4);
				}
			}
		}
		else if((IO1PIN & M2D) == 0)	//6不挡
		{
			Motor(2,0,80,4);	//先向上走80步
			if((IO1PIN & M2P)>>16 == 1)	//5挡
			{				
				while((IO1PIN & M2D)>>17 == 1)	//往上,走到6不挡为止
				{
					Motor(2,0,1,4);
				}
			}
			else if(IO1PIN & M2P == 0)	//5不挡
			{
				;
			}
		}
	}
}

void M3Position_ini()	//左右电机初始化
{
	Motor(3,1,15,4);	//先逆15步
	while(((IO1PIN & M3P)>>21 == 1) & ((IO1PIN & M3D)>>18 == 1))	//再顺转,走到3或4不挡为止
	{
		Motor(3,0,1,4);
	}
	if((IO1PIN & M3P) == 0)	//是3先不挡,停
	{
		;
	}
	else if((IO1PIN & M3D) == 0)	//是4先不挡
	{
		while((IO1PIN & M3P)>>21 == 1)	//顺转,走到3不挡为止
		{
			Motor(3,0,1,4);
		}
	}
}

void M4Position_ini()	//盘电机初始化
{
	while((IO1PIN & M4P)>>19 == 1)	//逆转,走到1不挡为止
	{
		Motor(4,1,1,4);
	}
	while((IO1PIN & M4D)>>20 == 1)	//顺转,走到2不挡为止
	{
		Motor(4,0,1,4);
	}
	Motor(4,1,CDiskStep,4);
	DiskNumNow = 1;
}

////////////////////////////////////////////////////////////////

void DelayNS(uint32 dly)	//软件延时
{
	uint32 i;
	
	for ( ; dly>0; dly--)
	{
		for (i=0; i<50000; i++);
		USB_WriteEndpoint(3, 10, Delay);//GenEpBuf);			/* 发送10个字节到PC */
	}
}

////////////////////////////////////////////////////////////////
void inStep(int ins,unsigned char *Frame)	//微调步数统计
{
	if(ins/10 == 0)
	{
		Frame[4] = '0';
		Frame[5] = '0';
		Frame[6] = ins + 0x30;
	}
	else if(ins/100 == 0)
	{
		Frame[4] = '0';
		Frame[5] = ins/10 + 0x30;
		Frame[6] = (ins - ins/10*10) + 0x30;
	}
	else if(ins/1000 == 0)
	{
		Frame[4] = ins/100 + 0x30;
		Frame[5] = (ins/10-ins/100*10) + 0x30;
		Frame[6] = (ins-ins/10*10) + 0x30;
	}
}
void GF()	//对准石墨管
{
	M2Position_ini();	//上下电机初始化
	M3Position_ini();	//左右电机初始化
	while((IO1PIN & M3D)>>18 == 1)	//逆转,走到4不挡为止
	{
		Motor(3,1,1,4);
	}
	Motor(2,1,80,4);	//先向下走80步
	while((IO1PIN & M2D)>>17 == 1)	//往下,走到6不挡为止
	{
		Motor(2,1,1,4);
	}
}
void GFin()	//调进入深度
{	
	while(GFinFlag == 1)
	{
		ENABLE();
		inStep(GFinStep,GFinStepF);	//微调步数统计
		USB_WriteEndpoint(3, 10, GFinStepF);//GenEpBuf);			/* 发送10个字节到PC */
		if(bEPPflags.bits.configuration == 1)
		{	
			if(bEPPflags.bits.ep1_rxdone == 1)
			{												/* 逻辑端点1收到数据 */
				DISABLE();
				bEPPflags.bits.ep1_rxdone = 0;				/* 清除逻辑端点1收到数据标志 */
				if(GenEpBuf[0]=='g' & GenEpBuf[1]=='f' & GenEpBuf[2]=='s' & GenEpBuf[3]=='t' & GenEpBuf[4]=='o' & GenEpBuf[5]=='p')
				{
					//inStep(GFinStep,GFinStepF);	//微调步数统计
					USB_WriteEndpoint(3, 10, ControlOK);//GenEpBuf);			/* 发送10个字节到PC */

					//if(GenEpBuf[6]=='#')
					//{
					//	GFRStep = 0;
					//}
					//else if(GenEpBuf[7]=='#')
					//{
					//	GFRStep = GenEpBuf[6] - 0x30;
					//}
					//else if(GenEpBuf[8]=='#')
					//{
					//	GFRStep = (GenEpBuf[6] - 0x30) * 10 + (GenEpBuf[7] - 0x30);
					//}
					//else if(GenEpBuf[9]=='#')
					//{
					//	GFRStep = (GenEpBuf[6] - 0x30) * 100 + (GenEpBuf[7] - 0x30) * 10 + (GenEpBuf[8] - 0x30);
					//}
					//USB_WriteEndpoint(3, 10, ReceiveOK);
					GFinFlag = 0;
					//Motor(2,0,GFRStep+30,4);	//先往上多走30步					
					//while((IO1PIN & M2D)>>17 == 1)	//往下,走到6不挡为止
					//{
					//	Motor(2,1,1,4);
					//}
					//Motor(2,1,GFRStep,4);
					//USB_WriteEndpoint(3, 10, ControlOK);//GenEpBuf);			/* 发送10个字节到PC */
				}	
				else
				{
					if(GFinStep < 99)
					{
						if((IO1PIN & K1) == 0)	//往下的按钮按下
						{
							K1Flag = 1;						
						}
						if(((IO1PIN & K1)>>25 == 1) & K1Flag == 1)	//往下的按钮弹起
						{
							GFinStep++;
							Motor(2,1,1,4);
							K1Flag = 0;						

⌨️ 快捷键说明

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