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

📄 调试程序1._c

📁 这段程序是步进电机的细分驱动程序
💻 _C
📖 第 1 页 / 共 4 页
字号:
		ControlData.wCount += ControlData.wLength;
		EIMSK=0x00;								 
		control_state = 0;
		EIMSK=0x01;
	}
}

//获取固件版本号
void get_firmware_version()
{
	unsigned char i;

	i = 0x30; // firmware version number
	single_transmit((unsigned char *)&i, 1);
}

//获取端点2缓存区大小
void get_buffer_size()
{
	unsigned char i[4];

	if(bNoRAM != 0) {
		i[0] = 64;
		i[1] = 0;
		i[2] = 0;
		i[3] = 0;
	} else {
		i[0] = 0;
		i[1] = 1;
		i[2] = 0;
		i[3] = 0;
	}
	single_transmit((unsigned char *)&i, 4);
}

//厂商请求处理
void read_write_register(void)
{
	unsigned char len,epstatus;

	if(ControlData.DeviceRequest.bmRequestType & 0x80) {

		if(ControlData.DeviceRequest.wIndex == 0x0472 &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 1)
			get_firmware_version();//获取固件版本号
		else
		if(ControlData.DeviceRequest.wIndex == 0x0474 &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 4)
			get_buffer_size();//获取缓冲区大小
		else{
			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
		}

	}	// if read register
	else{

		if(ControlData.DeviceRequest.wIndex == 0x0471 &&
			ControlData.DeviceRequest.wValue == 0 &&
			ControlData.DeviceRequest.wLength == 6)
		   	{
				if(ControlData.dataBuffer[5]==0x81)
				{
					D12_WriteEndpoint(5, ControlData.dataBuffer[3], MainBuf);//发送数据
				}
				if(ControlData.dataBuffer[5]==0x80)
				{
					EIMSK=0x00;
					outportb(D12_COMMAND, 0x80 + 4);//读取端点状态
					epstatus = inportb(D12_DATA);
					EIMSK=0x01;

					epstatus &= 0x60;
					if (epstatus == 0x60)
						len = Isr_D12_ReadEndpoint(4, 64, MainBuf);//读取双缓冲区数据
 				}
				single_transmit(0, 0);
			}				
		else
			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
	}	
}

//请求处理子程序
void control_handler()
{
	uchar type, req;
	type = ControlData.DeviceRequest.bmRequestType & (uchar)0x60;   //设备请求类型
	req = ControlData.DeviceRequest.bRequest & (uchar)0x0F;         //USB请求类型
    			          
	if (type == (uchar)0x00) 
	{
	 	switch(req) //调用标准请求
		{
			case 0x00:get_status();
					  break;
			case 0x01:clear_feature();
					  break;
			case 0x03:set_feature();
					  break;
			case 0x05:set_address();
					  break; 
			case 0x06:get_descriptor();
					  break;	  
			case 0x08:get_configuration();
					  break;
			case 0x09:set_configuration();
					  break; 
			case 0x0a:get_interface();
					  break; 
			case 0x0b:set_interface();
					  break; 
			case 0x04:
			case 0x02:
			case 0x07:
			case 0x0c:
			case 0x0d: 
			case 0x0e:
			case 0x0f:D12_SetEndpointStatus(0, 1);
					  D12_SetEndpointStatus(1, 1);
					  break; 
			default	 :break;					  
		}
	}
	else if (type == (uchar)0x40)
	{
		switch(req) //调用标准请求
		{
			case 0x0c:read_write_register();
						 break;
			case 0x00:
			case 0x01:
			case 0x02:
			case 0x03: 
			case 0x04:	  
			case 0x05:
			case 0x06: 
			case 0x07: 
			case 0x08: 
			case 0x09:
			case 0x0a:
			case 0x0b:
			case 0x0d: 
			case 0x0e:
			case 0x0f:
			case 0x10:D12_SetEndpointStatus(0, 1);
						 D12_SetEndpointStatus(1, 1);
						 break;
 
			default	 :break;					  
		}
	}
	else
	{
		D12_SetEndpointStatus(0, 1);
		D12_SetEndpointStatus(1, 1);
	}
}

//中断设置
void INT_Init(void)
{
   EIMSK = 0x00;
   MCUCR = 0X80;
   EICRA = 0x00;  ///
   EIMSK = 0x00;
   
   XMCRA = 0X00;
}

//***************************************************//
//延时函数
//***************************************************//
void DelayMs(uint TimeNum)       //delay  17Ms
 {
   uint i;
   for(;TimeNum>0;TimeNum--)
    {
       for(i=0;i<30000;i++);
    }
 }
//*****************************************************//
//清洗针头(时间)
//*****************************************************//
void   Pump_Delay(uint delayTime)  //Delay Ms     1//17Ms
  {                                             
     PORTF&=0XFC;                 //开水阀
	 DelayMs(10);                 //150MS
     PORTF&=0XFE;                 //开气阀
     DelayMs(delayTime);          //清洗时间          
	 PORTF|=0X02;                 //关气阀
     DelayMs(10);                 //150MS
	 PORTF|=0X01;                 //关水阀
  }
//*****************************************************//
//  进样泵排气泡
//*****************************************************//
  void  push_air (void)
  {
     PORTF&=0XFC;                                         
	 DelayMs(10);
     PORTF&=0XFE;
     mustermotor_contorl (17000,1);            //进样泵吸推满量程
	 mustermotor_contorl (17000,0);            //进样泵吸拉满量程
	 DelayMs(30);
	 mustermotor_contorl (17000,1);
     mustermotor_contorl (17000,0);
	 DelayMs(30);
	 PORTF|=0X02;
     DelayMs(10);
	 PORTF|=0X01;
  }

//*****************************************************//
//   吸样针头保护
//*****************************************************//
 void  needle_egis (void)
  {
      PIND=PORTD;
	  g[5]=PIND&0x10;
	  while(g[5]==0)                       //旋转定位小盘如不透光 则等待   
	  {
	    PIND=PORTD;
	    g[5]=PIND&0x10;
	  }
  }
//*****************************************************//
  //上升臂初始化
//*****************************************************//
void  armup_init  (void)
 {
     PIND=PORTD;
       g[0]=PIND&0x04;  
       while(g[0])                  //上升到铜片挡住光耦
       {                               
        PIND=PORTD;
        g[0]=PIND&0x04;
        motor_right (1,1,50);
	   }
	   OutputMotor(0x01,0x00,0x00);  
 }
//*****************************************************//
//      进样器初始化
//*****************************************************//
void  muster_init (void)
 { 
	
	 armup_init ();               //上升臂初始化          
	
	 plate_oneround ();               
	 plate_init();                //进样盘初始化  
	 OutputMotor(0x03,0x00,0x00); 
	 armround_init();             //旋转臂初始化  

	 DelayMs(15);

	 needle_egis ();               //旋转臂是否到位  不到位则进入等待状态  
	 arm_down(3150*8);             //升降臂下降40MM  电机25200步(微分系数1)
	 OutputMotor(0x02,0x00,0x00);
     mustermotor_init();           //进样泵初始化 
	 Pump_Delay(130);              //清洗针头2S
	// push_air ();
	 // arm_up ();
  }

//*******************************************************//
//连电脑主机的进样过程
//*******************************************************//
 void   one_course  (void)
    {
	     uint i;
	   
	   	ArmState=0;//清洗位
			
		arm_up ();                                              //升降臂上升
	   mustermotor_contorl (7500,1);                            //吸入空气 (12UL)
	   plate_round(Work.strat_number,Work.mission_number);      //进样盘定位
		if(Work.mission_number)                                 //旋转臂定位 (1样品 0标液)
		    armround_control1(0,1,3703);//0-1
		else 
		    armround_control1(0,2,6385);//0-2
		//OutputMotor(0x02,0x00,0x00); 
		DelayMs(20);                                            //延时340MS
	    
		arm_down(3220*8);                                       //升降臂下降42MM
		
		ArmState=2;//样品位
	    OutputMotor(0x03,0x00,0x00);
		
		mustermotor_contorl (volume,1);                         //吸入样品(标样)
        DelayMs(20);                                            //延时340MS
		if(Work.clear_select==0)
		DelayMs(50);                                            //如酸洗 延时1S
	    arm_up ();                                              //升降臂上升                                
		mustermotor_contorl (500,1);                            //吸入空气1UL
	
	    if(Work.clear_select==1)                                //如果在工作状态,臂转到钨舟处                             
		   {
			   if(Work.mission_number)
			       armround_control1(1,3,9421);//1-3
			   else 
			       armround_control1(2,3,12103);//2-3
				
			   // OutputMotor(0x02,0x00,0x00);
			   DelayMs(20);                                      //延时340MS
			   arm_down(6650*8);                                 //臂下降到钨舟中
			   
			   ArmState=1;//钨舟位  下降85MM
			   mustermotor_contorl (volume+1300,0);               //吐样,多吐1UL
		       DelayMs(10);
		       arm_up ();                                        //臂升起
			  
			  ArmState=0;//清洗位
			  
		      over_flag=1;                                       //放样完成标志,工步起动
           
			  armround_control1(3,0,5718);//3-0                  //臂转到清洗杯处
		  } 
		  else                                                //如果酸洗,则直接从标样处走到清洗杯
		  {
			if(Work.mission_number)
			  armround_control1(1,0,3703);//1-0
		      else 
		          armround_control1(2,0,6385);//2-0
		  }
		     //OutputMotor(0x02,0x00,0x00);
			  DelayMs(20);                                       //延时340MS
		     
			  arm_down(3120*8);   //下降40MM  针入水杯
		      OutputMotor(0x02,0x00,0x00); 
			  mustermotor_init();                                //进样泵初始化                             
	          Pump_Delay(clear_S);                               //清洗针头
			 
			 DelayMs(100);                                       //延时1。5S
             
		     if(Work.clear_select==0)
		     over_flag=2;
			
    }
//******************************************************//
//电机逆时针旋转   motor_right(电机号,微分系数,延时时间)
//******************************************************//
void   motor_right (uchar motor_number,uchar modulus ,uint delaytime)
   {   uint t;
       uchar  change;
	   OutputMotor(motor_number,H1DACData[step1[motor_number]],H2DACData[step1[motor_number]]);
	   step1[motor_number]+=modulus;
	   for(t=0;t<delaytime;t++);
	}
//******************************************************//
//电机顺时针旋转   motor_left (电机号,微分系数,延时时间)
//******************************************************//
void   motor_left (uchar motor_number,uchar modulus,uint delaytime) 
   {   uint t;
       uchar  change;
       OutputMotor(motor_number,H1DACData[step1[motor_number]],H2DACData[step1[motor_number]]);
	   step1[motor_number]-=modulus;
	   for(t=0;t<delaytime;t++);
	 }

//******************************************************//
//上升臂上升变速运动  两边延时(50-1500)  ,中间匀速50
//******************************************************//
 void  arm_up (void)
   {  
    	  uint i,Count;
      PIND=PORTD;
      g[0]=PIND&0x04; 
	  
	  //加速
	  for(Count=0;Count<1500;Count++)
	  {
	  	   motor_right (1,1,1550-Count);
		   PIND=PORTD;
      	   g[0]=PIND&0x04; 
		   if(!g[0])
		   {
			   break;
		   }
	  }
	  
	  //匀速
	  if(ArmState==1)//钨舟位,臂下到底
	  {
	   	  for(i=52800-2*1500;i>0;i--)
	 	   {
		     	motor_right (1,1,50);
				PIND=PORTD;
      	   		g[0]=PIND&0x04; 
		   		if(!g[0])
		   		{
			   	 break;
		   		}
	  		}
	  }
	  else
	  {
	   	  for(i=26400-2*1500;i>0;i--)
	 	   {
		     	motor_right (1,1,50);
				PIND=PORTD;
      	   		g[0]=PIND&0x04; 
		   		if(!g[0])
		   		{
			   	 break;
		   		}
	  		}
	  }
	  
	  //减速
	  for(Count=0;Count<1500;Count++)
	  {
	  	   motor_right (1,1,50+Count);
		   PIND=PORTD;
      	   g[0]=PIND&0x04; 
		   if(!g[0])
		   {
			   break;
		   }
	  }	  
	  //慢匀速
       while(g[0])          
       {
        PIND=PORTD;
        g[0]=PIND&0x04;
        motor_right (1,1,1550);
	   }	  

	      for(i=0;i<10;i++)
	       { 
		    motor_left (1,1,1550);
		   }
		  for(i=0;i<50;i++)
	       { 
		      motor_right (1,1,1550);
		   }
	      while(g[0]);
		  OutputMotor(0x01,0x00,0x00);
 
    }
//***************************************************//
//旋转臂初始化
//***************************************************//
 void   armround_init  (void)
    {  uint  i;
	  PIND=PORTD;
	  g[1]=PIND&0x08;
	if(g[1])                                       //初始化光耦透光,顺时针转1500步(14度)
	   {
	    for(i=0;i<1500;i++)
	     { 
		   motor_left (2,1,600);
		 }
	    }
	  else                                         //初始化光耦不透光,逆时针转1500步(14度)
	    {
	    for(i=0;i<1500;i++)
	     { 
		   motor_right (2,1,600);
		 }
	    }
	  //PIND=PORTD;
	  g[1]=PIND&0x08;
     if(g[1]==0)                                   //初始化光耦不透光,逆时针转到刚透光时停                                      
	    {
		   //PIND=PORTD;
	       g[1]=PIND&0x08;    
		   while(g[1]==0)
		    {
	          //PIND=PORTD;
	          g[1]=PIND&0x08;
			  motor_right (2,1,600);
		     }
		}  
	 else                                         //初始化光耦透光,逆时针转到刚不透光时停 
      {
		    //PIND=PORTD;
	        g[1]=PIND&0x08;
			while(g[1])
		     {
	           //PIND=PORTD;
	           g[1]=PIND&0x08;
			   motor_left (2,1,600);
		     }
		   }
    //PIND=PORTD;
            g[5]=PIND&0x10;   
            if(g[5])                                        //如果旋转臂光耦已透光,逆时针转400步(3。5度)
	     {                                             //转到不透光处
	   		for(i=400;i>0;i--)
			{
			     motor_right (2,1,600);
			}
			
			while(1)                               //顺时针转(清洗杯) 定位孔沿处停止
			{
			 	  g[5]=PIND&0x10;
				  if(g[5])
				  break;
			      motor_left(2,1,600);
			}
			for(i=0;i<82;i++)                       //顺时针转(清洗杯) 定位孔中心处停止
	       {
	         motor_left (2,1,600);
	       }

	   }
     
 }
 //******************************************************//
//进样盘旋转初使化	 
//******************************************************//
 void  plate_init  (void)
   {	 
	  PIND=PORTD;
	  g[2]=PIND&0x40;
	  while(g[2]==0)                            //进样盘初始化光耦不透光,逆时针转到透光后停止
	    {
	      PIND=PORTD;
	      g[2]=PIND&0x40;
	      motor_right (3,1,400);
	    }
	 
	  PIND=PORTD;
	  g[4]=PIND&0x20;
	  while(g[4]==0)                           //进样盘定位光耦不透光,逆时针转到透光后停止
	    {
	      PIND=PORTD;
	      g[4]=PIND&0x20;
	      motor_right (3,1,400);
	    }
		
	}  
//**************************************************//
//进样泵复位向上初使化
//**************************************************// 
 void  mustermotor_init (void)
   { 
	  PIND=PORTD;
	  g[3]=PIND&0x80;
	  while(g[3])
	   {
	     PIND=PORTD;
	     g[3]=PIND&0x80;
	     motor_left (4,2,350);
	   }
	      while(g[3]);
         OutputMotor(0x04,0x00,0x00);
	}
//**************************************************//
//升降臂下降清洗杯   两边延时(50-1500)  ,中间匀速50
//**************************************************//
 void  arm_down (uint  down)
   {
   	   unsigned  int  s,Count;
	   //加速
   	   for(Count=0;Count<1500;Count++)
	   {
	       motor_left (1,1,1550-Count);
	   }
	   //匀速
	   for (s=down-2*1500;s>0;s--)
       {
          motor_left (1,1,50);
		  needle_egis ();
       }
       for(Count=0;Count<1500;Count++)
	   {
	       motor_left (1,1,50+Count);
		   needle_egis ();
	   }
   	   OutputMotor(0x01,0x00,0x00);
   }

⌨️ 快捷键说明

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