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

📄 drv_s_motor.c

📁 uCOS2 for 51系列
💻 C
📖 第 1 页 / 共 3 页
字号:
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年5月12日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/   
		void 	StepMotor0SetVelocity( INT16S vt)
{
	INT32U	tmp;
	INT8U	i;
	static INT16S	buf_vt;
	
	
	if(buf_vt != vt)
	{
		buf_vt = vt;
		
		if( vt > 0 )
			DIR_SIG0_SET();
		else
		{
			vt = -vt;
			DIR_SIG0_CLR();
		}
		if(vt != 0)
		{
			tmp = SYSCLK / 2 /vt/STEP_MOTOR_CONTROL_PERIOD_DIVIDER/PWM_REPEATE_TIMES;
			for(i = 0;i < 8 ;i++)
			{
				if(tmp > 0xFFFF)
					tmp /= 2;
				else
					break;
			}
			
			if(i<8)
			{
				T2CON &= ~TENABLE;
				T2CON &= (~(TPS2|TPS1|TPS0));
				T2CON |= i << 8;
				T2PER = ( SYSCLK >> (i+1))  / vt /STEP_MOTOR_CONTROL_PERIOD_DIVIDER/PWM_REPEATE_TIMES ;	
				T2CON |= TENABLE;
			}
			else
			{
				T2CON &= ~TENABLE;
				T2CON |= TPS2|TPS1|TPS0;
				T2PER = 0xFFFF ;	
				T2CON |= TENABLE;
			}						
		}
	}
}
 

/*********************************************************************************************************
** 函数名称: Task_StepMotor
** 功能描述: StepMotor控制任务函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  
 
 		void Task_StepMotor(void *pData)
{    
	INT8U	err = OS_NO_ERR;
	INT8U 	i;
	INT8U	temp;
	void 	*ptr;
	 
	INT8U 	kill_task = 0;
	
	INT16S	threadhold_s;
	INT16S	Vt,Vm,dV,St,Sr;
	
	STEPMOTOR_PROPERTY	buf_StepMotorSetting;
	STEPMOTOR_CTRL	* pStepMotor_Ctrl;
	
	pStepMotor_Ctrl = (STEPMOTOR_CTRL *)pData;
	
	buf_StepMotorSetting .dir = DIRECTION_FORWARD ;
	buf_StepMotorSetting .dV = 1;
	buf_StepMotorSetting .Vm = 0;
	buf_StepMotorSetting .St = 0;
	
	pStepMotor_Ctrl->property .Vt = 0;
	pStepMotor_Ctrl->property .mode = 0;
    
	do
	{
		ptr = OSMboxPend(pStepMotor_Ctrl->api.Mbox, STEP_MOTOR_CONTROL_PERIOD ,&err);
		
		if(err == OS_NO_ERR )
		{
			temp = *((INT8U *)ptr + POINTER_LENGTH);
			
			switch(temp)
			{
				case	STEPMOTOR_KILL_TASK:   
					kill_task = 1;
					break;
	    	 		case	STEPMOTOR_SET_DIRECTION:	
					switch(*(INT16U *)((INT8U *)ptr + POINTER_LENGTH + sizeof(INT16U)))
					{
					case	'F'	:
					case	'f'	:	buf_StepMotorSetting .dir = DIRECTION_FORWARD; 
					break;
					case	'B'	:
					case	'b'	:	buf_StepMotorSetting .dir = DIRECTION_BACKWARD; 
					break;
					default		:	break;
					}
					break;
				case	STEPMOTOR_SET_ACCELERATE:	
					buf_StepMotorSetting .dV = *(INT16U *)((INT8U *)ptr + POINTER_LENGTH + sizeof(INT16U)); 
					break;
	    	 		case	STEPMOTOR_SET_MAX_VELOCITY:	
					buf_StepMotorSetting .Vm = *(INT16U *)((INT8U *)ptr + POINTER_LENGTH + sizeof(INT16U)); 
					break;
	    	 		case	STEPMOTOR_SET_MAX_STEPS:	
					buf_StepMotorSetting .St = *(INT16U *)((INT8U *)ptr + POINTER_LENGTH + sizeof(INT16U)); 
					break;
				case	STEPMOTOR_ACTION:	
					if(( buf_StepMotorSetting .St > 0 ) && (pStepMotor_Ctrl->property .Vt == 0))  //只有当当前速度为0时,才允许设定位移
					{
						pStepMotor_Ctrl->property .dir = buf_StepMotorSetting .dir;
						pStepMotor_Ctrl->property .dV = buf_StepMotorSetting .dV;
						pStepMotor_Ctrl->property .Sr = 0;
						pStepMotor_Ctrl->property .mode = STEP_MOTOR_ACTION;
					
						if(buf_StepMotorSetting .dir == DIRECTION_FORWARD)
						{
							pStepMotor_Ctrl->property .St = buf_StepMotorSetting .St;
				    	 						    	 				
							if( ( ((buf_StepMotorSetting .Vm) / (buf_StepMotorSetting .dV) + 1 )* (buf_StepMotorSetting .Vm)) <= ( buf_StepMotorSetting .St ) )
							{
								pStepMotor_Ctrl->property .Vm = buf_StepMotorSetting .Vm;
								threadhold_s = buf_StepMotorSetting .St - ((buf_StepMotorSetting) .Vm / (buf_StepMotorSetting) .dV + 1 ) * ((buf_StepMotorSetting) .Vm) / 2;
							}	
							else
							{
								INT8U	i;
								for(i = (buf_StepMotorSetting) .Vm / (buf_StepMotorSetting) .dV;i--;)
								{
									if(( (i * (i+1) )* (buf_StepMotorSetting) .dV ) < buf_StepMotorSetting .St )
										break;
								}
								pStepMotor_Ctrl->property .Vm = buf_StepMotorSetting .dV * i ;
								threadhold_s =  buf_StepMotorSetting .St - ( i * (i+1) ) *(buf_StepMotorSetting) .dV / 2;
							}
						}
						else
						{
							pStepMotor_Ctrl->property .St = -buf_StepMotorSetting .St;

							if( ( ((buf_StepMotorSetting .Vm) / (buf_StepMotorSetting .dV) + 1 )* (buf_StepMotorSetting .Vm) ) <= (buf_StepMotorSetting .St ) )
							{
								pStepMotor_Ctrl->property .Vm = -buf_StepMotorSetting .Vm;
								threadhold_s = -buf_StepMotorSetting .St + ((buf_StepMotorSetting) .Vm / (buf_StepMotorSetting) .dV + 1 ) * (buf_StepMotorSetting .Vm) / 2;
							}	
							else
							{
								INT8U	i;
								for(i = (buf_StepMotorSetting) .Vm / (buf_StepMotorSetting) .dV;i--;)
								{
									if(( (i * (i+1) ) *(buf_StepMotorSetting) .dV ) < buf_StepMotorSetting .St )
										break;
								}
								pStepMotor_Ctrl->property .Vm = -buf_StepMotorSetting .dV * i ;
								threadhold_s = -buf_StepMotorSetting .St + ( i * (i+1)) *(buf_StepMotorSetting) .dV / 2;
							}
						}
						Vm = (pStepMotor_Ctrl->property) .Vm;
						St = threadhold_s + Vm;
					}
					else if(buf_StepMotorSetting .St == 0)
					{
						pStepMotor_Ctrl->property .dir = buf_StepMotorSetting .dir;
						pStepMotor_Ctrl->property .dV = buf_StepMotorSetting .dV;
						pStepMotor_Ctrl->property .Sr = 0;
						pStepMotor_Ctrl->property .mode = STEP_MOTOR_ACTION;
						
						if(buf_StepMotorSetting .dir == DIRECTION_FORWARD)
						{
							pStepMotor_Ctrl->property .St = buf_StepMotorSetting .St;
							pStepMotor_Ctrl->property .Vm = buf_StepMotorSetting .Vm;
						}
						else
						{
							pStepMotor_Ctrl->property .St = -buf_StepMotorSetting .St;
							pStepMotor_Ctrl->property .Vm = -buf_StepMotorSetting .Vm;
						}
						St = pStepMotor_Ctrl->property .St;
						Vm = pStepMotor_Ctrl->property .Vm;
					}
		    			    	 								
					Sr = 0;
	    			    	 								
					break;
	    	 		case	STEPMOTOR_HALT	:	
					pStepMotor_Ctrl->property .mode = STEP_MOTOR_HALT;
					pStepMotor_Ctrl->property .dir = 0;
					pStepMotor_Ctrl->property .dV = 0;
					pStepMotor_Ctrl->property .Sr = 0;
					pStepMotor_Ctrl->property .St = 0;
					pStepMotor_Ctrl->property .Vt = 0;
					pStepMotor_Ctrl->property .Vm = 0;
					buf_StepMotorSetting .St = 0;
					buf_StepMotorSetting .Vm = 0;
					buf_StepMotorSetting .Sr = 0;
					buf_StepMotorSetting .Vt = 0;
					break;
	    	 		default	:	
					break;
	    	 	}
    	 	
    	 		OSMemPut( SysBuf_2, (void *)ptr);
    	 		OSSemPost(SysBufSem_2);
    	 		OSSemPost(pStepMotor_Ctrl->api.MboxSem);
    		}
	    	else if( err == OS_TIMEOUT)
	    	{
	    		if(pStepMotor_Ctrl->property .mode == STEP_MOTOR_ACTION)
	    		{
	    			Vt = (pStepMotor_Ctrl->property) .Vt;
	    			dV = (pStepMotor_Ctrl->property) .dV;
	    			Sr = (pStepMotor_Ctrl->property) .Sr;
	    			
	    			if(pStepMotor_Ctrl->property .St)
	    			{
	    				if(pStepMotor_Ctrl->property .dir == DIRECTION_FORWARD)
		    			{
			    			if(pStepMotor_Ctrl->property .Sr > threadhold_s)
			    			{
			    				St += (pStepMotor_Ctrl->property) .Vm;
								
							if( (pStepMotor_Ctrl->property) .Vm >= dV )
								(pStepMotor_Ctrl->property) .Vm -= dV;
							else
								(pStepMotor_Ctrl->property) .Vm = 0;
									
							(pStepMotor_Ctrl->property) .Vt = (St - Sr);
								
							if((pStepMotor_Ctrl->property) .Vt > Vm )
								(pStepMotor_Ctrl->property) .Vt = Vm ;
									
							pStepMotor_Ctrl->func .SetVelocity(pStepMotor_Ctrl->property .Vt)  ;	
						}
						else 
						{
							if( Vt <= (Vm - dV))
								(pStepMotor_Ctrl->property) .Vt += (pStepMotor_Ctrl->property) .dV;
							else if (Vt >= (Vm + dV))
								(pStepMotor_Ctrl->property) .Vt -= (pStepMotor_Ctrl->property) .dV;
							else
								(pStepMotor_Ctrl->property) .Vt = (pStepMotor_Ctrl->property) .Vm;
							pStepMotor_Ctrl->func .SetVelocity(pStepMotor_Ctrl->property .Vt)  ;					
						}	
					}
					else
					{
						if(pStepMotor_Ctrl->property .Sr < threadhold_s)
			    			{
							St += (pStepMotor_Ctrl->property) .Vm;
							
							if( (pStepMotor_Ctrl->property) .Vm <= (-dV)  )
								(pStepMotor_Ctrl->property) .Vm += dV;
							else
								(pStepMotor_Ctrl->property) .Vm = 0;
									
							(pStepMotor_Ctrl->property) .Vt = (St - Sr);
								
							if((pStepMotor_Ctrl->property) .Vt < Vm )
								(pStepMotor_Ctrl->property) .Vt = Vm ;
									
							pStepMotor_Ctrl->func .SetVelocity(pStepMotor_Ctrl->property .Vt)  ;	
						}
						else 
						{
							if( Vt <= ( Vm - dV))
								(pStepMotor_Ctrl->property) .Vt += (pStepMotor_Ctrl->property) .dV;
							else if ( Vt >= ( Vm + dV) )
								(pStepMotor_Ctrl->property) .Vt -= (pStepMotor_Ctrl->property) .dV;
							else
								(pStepMotor_Ctrl->property) .Vt = (pStepMotor_Ctrl->property) .Vm;
							pStepMotor_Ctrl->func .SetVelocity(pStepMotor_Ctrl->property .Vt)  ;					
						}
					}
				}
				else 
				{
					if( Vt <= ( Vm - dV))
						(pStepMotor_Ctrl->property) .Vt += (pStepMotor_Ctrl->property) .dV;
					else if ( Vt >= ( Vm + dV))
						(pStepMotor_Ctrl->property) .Vt -= (pStepMotor_Ctrl->property) .dV;
					else
						(pStepMotor_Ctrl->property) .Vt = (pStepMotor_Ctrl->property) .Vm;
					pStepMotor_Ctrl->func .SetVelocity(pStepMotor_Ctrl->property .Vt)  ;					
				}				
			}
		}
	}while(!kill_task);
	
	pStepMotor_Ctrl->func .SetVelocity(0);
	
	pStepMotor_Ctrl->api.ObjLoaded = OBJ_UNLOADED;
	
	OSSemDel(pStepMotor_Ctrl->api.MboxSem,OS_DEL_ALWAYS,&err);
	OSMboxDel(pStepMotor_Ctrl->api.Mbox,OS_DEL_ALWAYS,&err);
	OSTaskDel(OS_PRIO_SELF);
}

⌨️ 快捷键说明

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