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

📄 app._c

📁 易于atmage128和ucos的手动机器人控制程序。
💻 _C
📖 第 1 页 / 共 4 页
字号:
/*
*********************************************************************************************************
*                                               中断程序区
*********************************************************************************************************
*/
 //////////////////////Timer2计数中断_提供舵机时钟////////////////////
//#pragma interrupt_handler Timer2:11
/*
void Timer2(void)
{ 

	TCNT2=0x06;                                      //2次   每次 0.128ms
	time_count++;
	 if(time_count==84)    							  //   1=0.23ms    86=20ms   9=2ms     2右患  10左极
	 {  
	   PORTC|=0x0f;
	   time_count=0;
	  }

	 if(time_count==hand_cy[0]) PORTC&=~(1<<0);	  //矩形波变化 手抓1
	 if(time_count==hand_cy[1]) PORTC&=~(1<<1);	  //手抓2
	 if(time_count==hand_cy[2]) PORTC&=~(1<<2);	  //手抓3
	 if(time_count==hand_cy[3]) PORTC&=~(1<<3);	  //手抓4
	 //if(hand_cy[0]==7) LED_send_16b(0x0107);
	 //else if(hand_cy[0]==5) LED_send_16b(0x0105);
	 //else if(hand_cy[0]==4) LED_send_16b(0x0104);	  
}
*/
/*
*********************************************************************************************************
*                                               电机驱动
*********************************************************************************************************
*/

//运动左侧电机驱动(有慢起功能,自主运行)----------------------------------------------
static void  motor_move_l(void *p_arg)    //m_action 1正转 0反转 2停  m_speed 16bit 0~1024全速
{
    INT16U key=0x000b,speed_old=0x2000,move_fx[2]={0x0002,0x0002};			  			//运动方向 1 正 0 反 2 停 
	INT16U pwm_speed[2]={0x0000,0x0000},
	pwm_speed_real=0x0000,pwm_speed_real_dely=0x0000; //预定pwm波 和实际pwm波 0x0000-0x03ff  值越大速度越大
	p_arg = p_arg;
	while(1)
	{	
	
	   motor_l_key=OSMboxAccept(motor_l_Box);		                     //查看邮箱
	   if( motor_l_key!=0)			  				                  	 //如果收到邮件
	   {
	   	   key			   =*motor_l_key;				              	 //获得钥匙
	   	   pwm_speed[1]    =(speed[speed_model][1][0][key]&0x0fff);  	 //提取速度目标值
	   	   move_fx[1] 	   =speed[speed_model][1][0][key]>>12;  		 //提取方向值
		   
		   if(speed[speed_model][1][0][key]!=speed_old)
		   {
		   	   speed_old=speed[speed_model][1][0][key];  				 //保存方向速度 
		   	   if(move_fx[1]!=move_fx[0]) pwm_speed_real=0x0000;pwm_speed_real_dely=0x0000;//如果方向改变 速度先降为0
		      
			   pwm_speed[0]=pwm_speed[1]; 						//保存新速度值
			   move_fx[0]  =move_fx[1];							//保存新方向值
		   	   switch(move_fx[0])			   		  		   //运动方向切换
		   	   {
		   	        case 0:PORTA &=~(1<<0);PORTA &=~(1<<1);break; //正传
		  	 		case 1:PORTA |=(1<<0);PORTA &=~(1<<1);break;  //反转
			 		case 2:pwm_speed[0]=0X0000;pwm_speed_real=0X0000;pwm_speed_real_dely=0x0000;break; //停 需求运动速度清零
		   	   }
 		   }
	   }
	 
	 //接近预定值,全加上---------------
	 if(((speed[speed_model][1][0][key]&0x0fff)-pwm_speed_real_dely)<(((speed[speed_model][1][0][key]&0x0fff)-(speed[speed_model][0][0][key]&0x0fff))/dly_time[speed_model][1][key]/10))
	 {pwm_speed_real=(speed[speed_model][1][0][key]&0x0fff);}
	 //第一速度区间---------------
	 else if((speed[speed_model][0][0][key]&0x0fff)>pwm_speed_real_dely)  //假速度 小于 设定值
	 {
	       pwm_speed_real_dely  += (speed[speed_model][0][0][key]&0x0fff)/dly_time[speed_model][0][key]/10; //假速度提升
	       if(heading[speed_model][0][key]==0) pwm_speed_real=(speed[speed_model][0][0][key]&0x0fff); //如果立即加电模式   延时
	 	   else if(heading[speed_model][0][key]==1) pwm_speed_real = pwm_speed_real_dely;	//逐步加电模式  磨蹭时间
		   else 
		   {
		       pwm_speed_real=(speed[speed_model][0][0][key]&0x0fff);
			   pwm_speed_real_dely =pwm_speed_real ;
			}											  //否则立即加电  并不延时
	 }
	 //第二速度区间---------------
	 else if((speed[speed_model][1][0][key]&0x0fff)>pwm_speed_real_dely) //假速度 小于 设定值
	 {
	 	   pwm_speed_real_dely  +=((speed[speed_model][1][0][key]&0x0fff)-(speed[speed_model][0][0][key]&0x0fff))/dly_time[speed_model][1][key]/10; //假速度提升
	       if(heading[speed_model][1][key]==0) pwm_speed_real=(speed[speed_model][1][0][key]&0x0fff); //如果立即加电模式  
	 	   else pwm_speed_real = pwm_speed_real_dely; 
	 }
	 else pwm_speed_real=(speed[speed_model][1][0][key]&0x0fff);	  //如果速度超出预定值
	 OCR3A=pwm_speed_real;	
	 OSTimeDly(OS_TICKS_PER_SEC/10);	  //1/20s
	}				   		  			
}

//运动右侧电机驱动(有慢起功能,自主运行)----------------------------------------------
static void  motor_move_r(void *p_arg)    //m_action 1正转 0反转 2停  m_speed 16bit 0~1024全速
{
    INT16U key=0x000b,speed_old=0x2000,move_fx[2]={0x0002,0x0002};			  			//运动方向 1 正 0 反 2 停 
	INT16U pwm_speed[2]={0x0000,0x0000},
	pwm_speed_real=0x0000,pwm_speed_real_dely=0x0000; //预定pwm波 和实际pwm波 0x0000-0x03ff  值越大速度越大
	p_arg = p_arg;
	while(1)
	{	
	
	   motor_r_key=OSMboxAccept(motor_r_Box);		                     //查看邮箱
	   if( motor_r_key!=0)			  				                  	 //如果收到邮件
	   {
	   	   key			   =*motor_r_key;				              	 //获得钥匙
	   	   pwm_speed[1]    =(speed[speed_model][1][1][key]&0x0fff);  	 //提取速度目标值
	   	   move_fx[1] 	   =speed[speed_model][1][1][key]>>12;  		 //提取方向值
		   
		   if(speed[speed_model][1][1][key]!=speed_old)
		   {
		   	   speed_old=speed[speed_model][1][1][key];  				 //保存方向速度 
		   	   if(move_fx[1]!=move_fx[0]) pwm_speed_real=0x0000;pwm_speed_real_dely=0x0000;//如果方向改变 速度先降为0
		      
			   pwm_speed[0]=pwm_speed[1]; 						//保存新速度值
			   move_fx[0]  =move_fx[1];							//保存新方向值
		   	   switch(move_fx[0])			   		  		   //运动方向切换
		   	   {
		   	        case 1:PORTB &=~(1<<4);PORTB &=~(1<<5);break; //正传
		  	 	    case 0:PORTB &=~(1<<4);PORTB |=(1<<5);break;  //反转 
			 		case 2:pwm_speed[0]=0X0000;pwm_speed_real=0X0000;pwm_speed_real_dely=0x0000;break; //停 需求运动速度清零
		   	   }
 		   }
	   }
	   
	   
	 if(((speed[speed_model][1][1][key]&0x0fff)-pwm_speed_real_dely)<(((speed[speed_model][1][1][key]&0x0fff)-(speed[speed_model][0][1][key]&0x0fff))/dly_time[speed_model][1][key]/10))
	 {pwm_speed_real=(speed[speed_model][1][1][key]&0x0fff);}
	 //第一速度区间---------------
	 else if((speed[speed_model][0][1][key]&0x0fff)>pwm_speed_real_dely)  //假速度 小于 设定值
	 {
	       pwm_speed_real_dely  += (speed[speed_model][0][1][key]&0x0fff)/dly_time[speed_model][0][key]/10; //假速度提升
	       if(heading[speed_model][0][key]==0) pwm_speed_real=(speed[speed_model][0][1][key]&0x0fff); //如果立即加电模式  
	 	   else if(heading[speed_model][0][key]==1) pwm_speed_real = pwm_speed_real_dely;	//逐步加电模式  磨蹭时间
		   else 
		   {
		       pwm_speed_real=(speed[speed_model][0][1][key]&0x0fff);
			   pwm_speed_real_dely = pwm_speed_real;
			}															  //否则 磨蹭时间
	 }
	 //第二速度区间---------------
	 else if((speed[speed_model][1][1][key]&0x0fff)>pwm_speed_real_dely) //假速度 小于 设定值
	 {
	 	   pwm_speed_real_dely  +=((speed[speed_model][1][1][key]&0x0fff)-(speed[speed_model][0][1][key]&0x0fff))/dly_time[speed_model][1][key]/10; //假速度提升
	       if(heading[speed_model][1][key]==0) pwm_speed_real=(speed[speed_model][1][1][key]&0x0fff); //如果立即加电模式  
	 	   else pwm_speed_real = pwm_speed_real_dely; 
	 }
	 else pwm_speed_real=(speed[speed_model][1][1][key]&0x0fff);	  //如果速度超出预定值
	 OCR1C=pwm_speed_real;	
	 OSTimeDly(OS_TICKS_PER_SEC/10);	  //1/20s
	}				   		  			
}

//运动中间电机驱动(有慢起功能,自主运行)----------------------------------------------
static void  motor_move_m(void *p_arg)    //m_action 1正转 0反转 2停  m_speed 16bit 0~1024全速
{
    INT16U key=0x000b,speed_old=0x2000,move_fx[2]={0x0002,0x0002};			  			//运动方向 1 正 0 反 2 停 
	INT16U pwm_speed[2]={0x0000,0x0000},
	pwm_speed_real=0x0000,pwm_speed_real_dely=0x0000; //预定pwm波 和实际pwm波 0x0000-0x03ff  值越大速度越大
	p_arg = p_arg;
	while(1)
	{	
	
	   motor_m_key=OSMboxAccept(motor_m_Box);		                     //查看邮箱
	   if( motor_m_key!=0)			  				                  	 //如果收到邮件
	   {
	   	   key			   =*motor_m_key;				              	 //获得钥匙
	   	   pwm_speed[1]    =(speed[speed_model][1][2][key]&0x0fff);  	 //提取速度目标值
	   	   move_fx[1] 	   =speed[speed_model][1][2][key]>>12;  		 //提取方向值
		   
		   if(speed[speed_model][1][2][key]!=speed_old)
		   {
		   	   speed_old=speed[speed_model][1][2][key];  				 //保存方向速度 
		   	   if(move_fx[1]!=move_fx[0]) pwm_speed_real=0x0000;pwm_speed_real_dely=0x0000;//如果方向改变 速度先降为0
		      
			   pwm_speed[0]=pwm_speed[1]; 						//保存新速度值
			   move_fx[0]  =move_fx[1];							//保存新方向值
		   	   switch(move_fx[0])			   		  		   //运动方向切换
		   	   {
		   	       case 0:PORTA |=(1<<2);PORTA &=~(1<<3);break; //正传
		  	 	   case 1:PORTA &=~(1<<2);PORTA &=~(1<<3);break;  //反转
			 	   case 2:pwm_speed[0]=0X0000;pwm_speed_real=0X0000;pwm_speed_real_dely=0x0000;break; //停 需求运动速度清零
		   	   }
 		   }
	   }
	 
	   if(((speed[speed_model][1][2][key]&0x0fff)-pwm_speed_real_dely)<(((speed[speed_model][1][2][key]&0x0fff)-(speed[speed_model][0][2][key]&0x0fff))/dly_time[speed_model][1][key]/10))
	 {pwm_speed_real=(speed[speed_model][1][2][key]&0x0fff);}
	 //第一速度区间---------------
	 else if((speed[speed_model][0][2][key]&0x0fff)>pwm_speed_real_dely)  //假速度 小于 设定值
	 {
	       pwm_speed_real_dely  += (speed[speed_model][0][2][key]&0x0fff)/dly_time[speed_model][0][key]/10; //假速度提升
	       if(heading[speed_model][0][key]==0) pwm_speed_real=(speed[speed_model][0][2][key]&0x0fff); //如果立即加电模式  
	 	   else if(heading[speed_model][0][key]==1) pwm_speed_real = pwm_speed_real_dely;	//逐步加电模式  磨蹭时间
		   else 
		   {
		       pwm_speed_real=(speed[speed_model][0][2][key]&0x0fff);
			   pwm_speed_real_dely=pwm_speed_real  ;
			}														  //否则 磨蹭时间
	 }
	 //第二速度区间---------------
	 else if((speed[speed_model][1][2][key]&0x0fff)>pwm_speed_real_dely) //假速度 小于 设定值
	 {
	 	   pwm_speed_real_dely  +=((speed[speed_model][1][2][key]&0x0fff)-(speed[speed_model][0][2][key]&0x0fff))/dly_time[speed_model][1][key]/10; //假速度提升
	       if(heading[speed_model][1][key]==0) pwm_speed_real=(speed[speed_model][1][2][key]&0x0fff); //如果立即加电模式  
	 	   else pwm_speed_real = pwm_speed_real_dely; 
	 }
	 else pwm_speed_real=(speed[speed_model][1][2][key]&0x0fff);	  //如果速度超出预定值
	 OCR3B=pwm_speed_real;	
	 OSTimeDly(OS_TICKS_PER_SEC/10);	  //1/20s
	}				   		  			
}


//运动提升电机驱动(有慢起功能,自主运行)----------------------------------------------
static void  motor_move_t(void *p_arg)    //m_action 1正转 0反转 2停  m_speed 16bit 0~1024全速
{
    INT16U key=0x000b,speed_old=0x2000,move_fx[2]={0x0002,0x0002};			  			//运动方向 1 正 0 反 2 停 
	INT16U pwm_speed[2]={0x0000,0x0000},
	pwm_speed_real=0x0000,pwm_speed_real_dely=0x0000; //预定pwm波 和实际pwm波 0x0000-0x03ff  值越大速度越大
	p_arg = p_arg;
	while(1)
	{	
	
	   motor_t_key=OSMboxAccept(motor_t_Box);		                     //查看邮箱
	   if( motor_t_key!=0)			  				                  	 //如果收到邮件
	   {
	   	   key			   =*motor_t_key;				              	 //获得钥匙
	   	   pwm_speed[1]    =(speed[speed_model][1][0][key]&0x0fff);  	 //提取速度目标值
	   	   move_fx[1] 	   =speed[speed_model][1][0][key]>>12;  		 //提取方向值
		   
		   if(speed[speed_model][1][0][key]!=speed_old)
		   {
		   	   speed_old=speed[speed_model][1][0][key];  				 //保存方向速度 
		   	   if(move_fx[1]!=move_fx[0]) pwm_speed_real=0x0000;pwm_speed_real_dely=0x0000;//如果方向改变 速度先降为0
		      
			   pwm_speed[0]=pwm_speed[1]; 						//保存新速度值
			   move_fx[0]  =move_fx[1];							//保存新方向值
		   	   switch(move_fx[0])			   		  		   //运动方向切换
		   	   {
		   	       case 1:PORTA |=(1<<4);PORTA &=~(1<<5);break; //正传
		  	 	   case 0:PORTA &=~(1<<4);PORTA &=~(1<<5);break;  //反转
			 	   case 2:pwm_speed[0]=0X0000;pwm_speed_real=0X0000;pwm_speed_real_dely=0x0000;break; //停 需求运动速度清零
		   	   }
 		   }
	   }
	 
	  if(((speed[speed_model][1][0][key]&0x0fff)-pwm_speed_real_dely)<(((speed[speed_model][1][0][key]&0x0fff)-(speed[speed_model][0][0][key]&0x0fff))/dly_time[speed_model][1][key]/10))
	 {pwm_speed_real=(speed[speed_model][1][0][key]&0x0fff);}
	 //第一速度区间---------------
	 else if((speed[speed_model][0][0][key]&0x0fff)>pwm_speed_real_dely)  //假速度 小于 设定值
	 {
	       pwm_speed_real_dely  += (speed[speed_model][0][0][key]&0x0fff)/dly_time[speed_model][0][key]/10; //假速度提升
	       if(heading[speed_model][0][key]==0) pwm_speed_real=(speed[speed_model][0][0][key]&0x0fff); //如果立即加电模式  
	 	   else if(heading[speed_model][0][key]==1) pwm_speed_real = pwm_speed_real_dely;	//逐步加电模式  磨蹭时间
		   else 
		   {
		       pwm_speed_real=(speed[speed_model][0][0][key]&0x0fff);
			   pwm_speed_real_dely=pwm_speed_real  ;
			}												  //否则 磨蹭时间
	 }
	 //第二速度区间---------------
	 else if((speed[speed_model][1][0][key]&0x0fff)>pwm_speed_real_dely) //假速度 小于 设定值
	 {
	 	   pwm_speed_real_dely  +=((speed[speed_model][1][0][key]&0x0fff)-(speed[speed_model][0][0][key]&0x0fff))/dly_time[speed_model][1][key]/10; //假速度提升
	       if(heading[speed_model][1][key]==0) pwm_speed_real=(speed[speed_model][1][0][key]&0x0fff); //如果立即加电模式  
	 	   else pwm_speed_real = pwm_speed_real_dely; 
	 }
	 else pwm_speed_real=(speed[speed_model][1][0][key]&0x0fff);	  //如果速度超出预定值
	 OCR3C=pwm_speed_real;	
	 OSTimeDly(OS_TICKS_PER_SEC/10);	  //1/20s
	}				   		  			
}

⌨️ 快捷键说明

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