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

📄 调试程序1._c

📁 这段程序是步进电机的细分驱动程序
💻 _C
📖 第 1 页 / 共 4 页
字号:
	
//***************************************************//
//进样泵0吸样1和进样
//any_muter进样多少  //updown 0排样//1吸样
//***************************************************//
  void  mustermotor_contorl (uint any_muter,uchar updown) 
  {    uint i;                                                
     if(updown)
      {
        for (i=0;i<any_muter;i++)
           {
             motor_right (4,2,350);
           }
      }
    else
      {
        for (i=0;i<any_muter;i++)
          {
            motor_left (4,2,350);
          }
      }
	       OutputMotor(0x04,0x00,0x00); 
  }
//**********************************************//
//旋转盘逆时针进样走一个齿
//**********************************************//
  void   plate_oneround  (void)       
  {    uint i;                     
       for(i=0;i<640;i++)
	     {
            motor_right (3,1,500);
         }
	        PIND=PORTD;
	        g[4]=PIND&0x20;
	        while(g[4]==0)
	         {
	           PIND=PORTD;
	           g[4]=PIND&0x20;
	           motor_right (3,1,500);
	         }
		    while(g[4]==0);
  }     
//***************************************************//
//旋转盘逆时针进样
//sample=0试剂 sample=1样品    
//sample_number 进样盘标号 
//***************************************************//
  void   plate_round  ( uchar newplate_number,uchar sample)        
 {  uint i,y;                                              
    if (sample)                                      //样品盘号计算
      {  
	    if(newplate_number>30)
		   newplate_number=30;
	       if(newplate_number>=oldplate_number)
		   plate_sport=newplate_number-oldplate_number;
		   else
		   plate_sport=(newplate_number+30)-oldplate_number;
	          for(i=0;i<plate_sport;i++)
	             {
                  plate_oneround(); 
		         }
	              oldplate_number=newplate_number;
	  }
    else                                            //标样盘号计算
      { 
	     if(newplate_number>5)
		    newplate_number=5;
            if(((newplate_number-1)*6)>=(oldplate_number-1))
		        plate_sport=((newplate_number-1)*6)-(oldplate_number-1); 
	        else
			    plate_sport=(((newplate_number-1)*6)+30)-(oldplate_number-1);
		  
		          for(i=0;i<plate_sport;i++)
	                {
	                  plate_oneround(); 
                    }
			          oldplate_number=(newplate_number-1)*6+1;
	   }
	              
	 if(oldplate_number>30)
	    oldplate_number-=30;
	  //  OutputMotor(0x03,0x00,0x00);    
  }
  
  
//*******************************************************//
//leftOrRight 表示方向,0表示left ,1表示rigth
//GuOu 表示要跨过几个光耦
//movenum 表示总行程
//*******************************************************//

void armround_move(uchar leftOrRight,uchar GuOu,ulong movenum)
{
	ulong count;
	ulong GuOucount=0;

	if(GuOu==1)
		GuOucount=4500;
	else if(GuOu==2)
		GuOucount=8000;
	//加速,不判断光耦
	if(leftOrRight==0)//left
	{
		for(count=0;count<400;count++)
		{
			motor_left(2,1,1100-count*2);
		}
	}
	else
	{
		for(count=0;count<400;count++)
		{
			motor_right(2,1,1100-count*2);
		}
	}

	//如果要跨光耦  不判断光耦

	if(leftOrRight==0)//left
	{
		for(count=GuOucount;count>0;count--)
		{
			motor_left(2,1,300);
		}
	}
	else
	{
		for(count=GuOucount;count>0;count--)
		{
			motor_right(2,1,300);
		}
	}
		

	//匀速  判断光耦
	if(leftOrRight==0)//left
	{
		for(count=movenum-GuOucount-400*2-82;count>0;count--)
		{
			//PIND=PORTD;
	        g[5]=PIND&0x10;
			if(g[5]!=0)
				break;
			motor_left(2,1,300);
		}
	}
	else
	{
		for(count=movenum-GuOucount-400*2-82;count>0;count--)
		{
			//PIND=PORTD;
	        g[5]=PIND&0x10;
			if(g[5]!=0)
				break;
			motor_right(2,1,300);
		}
	}
	//减速  判断光耦
	if(leftOrRight==0)//left
	{
		for(count=0;count<400;count++)
		{
			//PIND=PORTD;
	        g[5]=PIND&0x10;
			if(g[5]!=0)
				break;
			motor_left(2,1,300+count*2);
		}
	}
	else
	{
		for(count=0;count<400;count++)
		{
			//PIND=PORTD;
	        g[5]=PIND&0x10;
			if(g[5]!=0)
				break;
			motor_right(2,1,300+count*2);
		}
	}

	//慢匀速  判断光耦
	if(leftOrRight==0)//left
	{
		while(1)
		{
			//PIND=PORTD;
	        g[5]=PIND&0x10;
			if(g[5]!=0)
				break;
			motor_left(2,1,1100);
		}
	}
	else
	{
		while(1)
		{
			//PIND=PORTD;
	        g[5]=PIND&0x10;
			if(g[5]!=0)
				break;
			motor_right(2,1,1100);
		}
	}

}
//****************************************************************//
//旋转臂进样出样控制
//initstate为初始状态,endstate为终止状态,0 表示清洗位,1 表示样品位,2 表示标液位,3 表示钨舟位
//状态转换为 0-1  0-2  2-3  2-0  1-0  1-3  3-0
//movenum为总行程
//****************************************************************//
void armround_control1(uchar initstate,uchar endstate,ulong movenum)
{
 	 ulong count;
	if( (initstate==0) && (endstate==1) )//0-1
	{
		armround_move(0,0,movenum);//left
		for(count=0;count<15+yp_value;count++)
		     motor_left(2,1,1100);
	}
	else if( (initstate==0) && (endstate==2) )//0-2,跳过1个光耦
	{
		armround_move(0,1,movenum);//left
		for(count=0;count<15+by_value;count++)
		     motor_left(2,1,1100);
	}
	else if( (initstate==2) && (endstate==3) )//2-3,跳过2个光耦
	{
		armround_move(1,2,movenum);//right
		for(count=0;count<(15+wz_value);count++)
		     motor_right(2,1,1100);
	}
	else if( (initstate==2) && (endstate==0) )//2-0,跳过1个光耦
	{
		armround_move(1,1,movenum);//right
		
        for(count=0;count<400;count++)
		    motor_right(2,1,1100);
			
		while(1)
		{
		     g[5]=PIND & 0x10;
			 if(g[5])
			      break;
			motor_left(2,1,1100);	
		}
		for(count=0;count<82;count++)
		     motor_left(2,1,1100);	
	}
	else if( (initstate==1) && (endstate==0) )//1-0
	{
		armround_move(1,0,movenum);//right
		
		for(count=0;count<400;count++)
		    motor_right(2,1,1100);
			
		while(1)
		{
		     g[5]=PIND & 0x10;
			 if(g[5])
			      break;
			motor_left(2,1,1100);	
		}
		for(count=0;count<82;count++)
		     motor_left(2,1,1100);				  
	}
	else if( (initstate==1) && (endstate==3) )//1-3,跳过1个光耦
	{
		armround_move(1,1,movenum);//right
		
		for(count=0;count<(15+wz_value);count++)
		     motor_right(2,1,1100);
	}
	else if( (initstate==0) && (endstate==3) )//0-3
	{
		armround_move(1,0,movenum);//right
		
		for(count=0;count<15+wz_value;count++)
		     motor_right(2,1,1100);
	}
	else if( (initstate==3) && (endstate==0) )//3-0
	{
	 	 armround_move(0,0,movenum);//right
		 
		 for(count=0;count<82;count++)
		     motor_left(2,1,1100);
    }
	 
}
                       
//*******************************************************//
//定时器1益出中断函数(3S定时)
//******************************************************//
#pragma  interrupt_handler TIMER1: 15
void   TIMER1  (void)
  {   uint i;
      CLI();
	  TCNT1 = 0X78F5;
	  TCNT1 = 0X78F5;
	  switch(over_flag)                             //传送两个字节 (3S一次) 
	   { 
		 case 0:                               //TxdBuf[0]状态标志(0未完成,A进样完成,B酸洗完成)
		 TxdBuf[0]=0x00;
		 break;                                  //TxdBuf[1] 任意时刻6个光耦状态
		 case 1:
		 {
		   over_flag=0;
	       TxdBuf[0]=0x0A;
	       TCCR1B = 0x00;
		   break;
		  }
		 case 2:
		 {     
		 over_flag=0;
	     TxdBuf[0]=0x0B;
		 TCCR1B = 0x00;
		 break;
		 }
		 default:
		 break;
		 }   
		   PIND=PORTD;
	       TxdBuf[1]=PIND&0X3F;
		   D12_WriteEndpoint(3,2,TxdBuf);
		   SEI();
	      
   }
//*******************************************************//    
//写EEPROM
//******************************************************//
 void  write_eeprom  (void)
  {  
      EIMSK = 0x00;
      while(EECR&0X02);
      switch( Debugger.place_number)         //选择EEP地址
       {
         case 0:                           
              EEAR=0X0001;
              break;
         case 1:
              EEAR=0X0002;
              break;
         case 2:
              EEAR=0X0003;
              break;
         case 3:
              EEAR=0X0004;
              break;
         default:
              break;
       }
             
          EEDR=Debugger.recoup_value;         //数据送入EEP
          EECR|=0X04;
          EECR|=0X02;
          EIMSK = 0x01;
  }
//**********************************************************//
//读EEPROM
//**********************************************************//
uchar  read_eeprom (uint  address)
  { 
    EIMSK = 0x00; 
    while(EECR&0X02);   
    EEAR=address;
	EECR|=0X01; 
	return EEDR;
	EIMSK = 0x01;
 }        
//***********************************************************//
//EEPROM数椐送入缓存
//***********************************************************//
 void   eeprom_value (void)
  {
	free=read_eeprom (0x0000); 
	by_value=read_eeprom (0x0001);           //标液杯处误差
    yp_value=read_eeprom (0x0002);           //样品杯处误差
    wz_value=read_eeprom (0x0003);           //钨舟处误差
    zx_value=read_eeprom (0x0004);           //钨舟深度误差
    zx_value=zx_value*16;
   
  }
  
//**********************************************************//
//主函数
//**********************************************************//
void main(void)
{
   unsigned int  k,u,ii;
   unsigned char Data;
   unsigned char StrLen;
   
   unsigned int TestCount;
   unsigned int TestCount1;
   unsigned char LeftOrRight=0;
   
  for(u=0;u<10000;u++);

  
   init_devices();                         //MCU初始化
   INT_Init();                             //设置中断
 
   PORTF = 0xFF;
   InitMotor(0x01);                        //四个步进电机初始化
   InitMotor(0x02); 
   InitMotor(0x03); 
   InitMotor(0x04); 
   OutputMotor(0x01,0x00,0x00);
   OutputMotor(0x02,0x00,0x00);
   OutputMotor(0x03,0x00,0x00);
   OutputMotor(0x04,0x00,0x00);

   
   //muster_init();                          //进样过程初始化 
   
   eeprom_value();                         //读缓存中EEPROM的值                        
   
   ArmState=0;
   
   EIMSK = 0x00;
   reconnect_USB();                        //重新连接USB
   EIMSK = 0x01;
 
   TCCR1A=0x00;
   TCCR1B =0x00;
  // TCNT1 = 0X78F5;
   TCNT1 = 0XFFFF;
   TCNT1 = 0XFFFF;
   while(1)
    {
       
	   // if(configuration)                            //设备未配置返回
			//;					    
		if (setup_packet)
		{                                             //Setup包处理
			
		    EIMSK = 0x00;
			setup_packet = 0;
			EIMSK = 0x01;
			control_handler();                        //调用请求处理子程序
		}
	  	/*if(USB_RESET)                          
		{   
		    EIMSK = 0x00; 
            reconnect_USB(); 
		    EIMSK = 0x01; 
		} */
	    if(reset_flag==1)                             //复位进样器初始化
	    {
		    reset_flag=0;
		    muster_init();  
			oldplate_number=1;
		}
		   
	    if(Work_flag)                               //进入工作状态
	    { 
		   Work_flag=0;
		   if(Work.clear_select<2)
		  {
		    one_course ();
		    Work_flag=0;
		  }                                        //完成一次进样过程或用酸清洗
           else if(Work.clear_select==2)
			push_air();                           //进样泵推拉清洗   
		}
        if(debug_flag==1)                           //进入调试状态
         {
           debug_flag=0;
           if(Debugger.place_number<4)                 //写四个位置误差
               write_eeprom(); 
			
		   if(Debugger.place_number==6)
			 {  
              switch( Debugger.init_place)          //旋转臂四个位置定位
               {                                    //0清洗杯,1标液位置,2样品位置,3钨舟位置
				case 0:
			     {
                   armup_init ();
	               armround_init();
				   break;
                 }
			    case 1:
				 {
				   armup_init ();
	               plate_init();
				   armround_init();
				   armround_control1(0,2,6385);//6385+15
				   break;
				  }
			     case 2:
				  {
				   armup_init ();
	               plate_init();
				   armround_init();
				   armround_control1(0,1,3703);//3703+15
				   break;
				  } 
				  case 3:
				  {
				   armup_init ();
				   armround_init();
				   armround_control1(0,3,5718);//5718+15
				   break;
				  }
				  default:
				  break;
			  }
	     }
			  
	   else if(Debugger.place_number==7)            //升降臂升降      
		 {
		   switch(Debugger.armup_down)
			{ 
			  OutputMotor(0x02,0x00,0x00);
			  case 0:
			   {
			     for(k=0;k< Debugger.setp_num;k++)    //上升
	              { 
		            motor_left (1,8,800);
		          }
			     break;
			   }
			  case 1:
			   {
				 for(k=0;k< Debugger.setp_num;k++)     //下降
	              { 
		            motor_right (1,8,800);
		          }
				 break;
			   }
			  default:
			  break;
			 }
		   }
		 
		else if(Debugger.place_number==4)
		 {      
		     if(Debugger.water_pump==1)         //水阀开关
             PORTF&=0XFE;
             else
             PORTF|=0X01;
		 } 
			   
	   else if(Debugger.place_number==5)
		 {               
             if(Debugger.air_pump==1)           //气阀开关
             PORTF&=0XFC;
             else
             PORTF|=0X02;
			   }
		
	      }
     }
 }








		  
		   
		   




		  
		   
		   
		  
		   
		   

⌨️ 快捷键说明

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