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

📄 drv_s_motor.c

📁 uCOS2 for 51系列
💻 C
📖 第 1 页 / 共 3 页
字号:
    	if(StepMotor1_Ctrl.api.ObjLoaded != OBJ_UNLOADED)
    	{		
			OSSemPend(SysBufSem_2,0,err);
			pData = (INT8U * )OSMemGet(SysBuf_2,err);
												
			*((INT8U *)pData + POINTER_LENGTH) = STEPMOTOR_KILL_TASK ;
			OSMboxPost(StepMotor1_Ctrl.api.Mbox,pData);
		}
		else
		{
			*err = ERROR_CMD_REJECTED;
			return;
		}
	}*/	 
}


/*********************************************************************************************************
** 函数名称: StepMotorSet
** 功能描述: StepMotor属性调整函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  
 
		void 	StepMotorSet(void * pData,INT8U * err)
{   
	INT8U	para_num;
	INT8U	i;
	
	INT8U	selected_obj;
	INT8U	temp_para;
	
	INT8U	*pMsg;
	
	para_num = ((PARAMETER_PACKAGE *)pData)->para_num;
	
	selected_obj = NULL;
	
	selected_obj |= STEPMOTOR0_SELECTED;							//假如前面的参数没指定对象的话,默认是全部对象
	selected_obj |= STEPMOTOR1_SELECTED;
																			
	
	for(i = 0; i<para_num ;i++)
	{
		temp_para = ((PARAMETER_TBL *)((PARAMETER_PACKAGE * )pData)->ppara)->para_name[i];
		
		switch(temp_para)
		{
			case	STEPMOTOR_SELECT_0	:   	
				selected_obj &= ~STEPMOTOR1_SELECTED;
				selected_obj |= STEPMOTOR0_SELECTED;
				break;
			case	STEPMOTOR_SELECT_1	:   	
				selected_obj &= ~STEPMOTOR0_SELECTED;
				selected_obj |= STEPMOTOR1_SELECTED;
				break;
			default	:	
				if(selected_obj & STEPMOTOR0_SELECTED)
				{	
					switch(temp_para)
					{
						case	STEPMOTOR_SET_MODE			:   
						case	STEPMOTOR_SET_DIRECTION		:   
						case	STEPMOTOR_SET_MAX_VELOCITY	:   
						case	STEPMOTOR_SET_ACCELERATE	:   
						case	STEPMOTOR_SET_MAX_STEPS		:   	
							OSSemPend(SysBufSem_2,0,err);
							pMsg = (INT8U * )OSMemGet(SysBuf_2,err);
							* ((INT8U *)pMsg + POINTER_LENGTH) = temp_para ;
							* (INT16U *)((INT8U *)pMsg + POINTER_LENGTH + sizeof(INT8U) ) = ((PARAMETER_TBL *)((PARAMETER_PACKAGE * )pData)->ppara)->para_value[i];
							OSSemPend(StepMotor0_Ctrl.api.MboxSem ,0 ,err);
							OSMboxPost(StepMotor0_Ctrl.api.Mbox,pMsg);
							break;
						default									:	break;	
					} 
				}
											/*	if(selected_obj & STEPMOTOR1_SELECTED)
											    {	
											    	switch(temp_para)
													{
														case	STEPMOTOR_SET_MODE			:   
														case	STEPMOTOR_SET_DIRECTION		:   
														case	STEPMOTOR_SET_MAX_VELOCITY	:   
														case	STEPMOTOR_SET_MAX_STEPS		:   OSSemPend(SysBufSem_2,0,err);
																								pMsg = (INT8U * )OSMemGet(SysBuf_2,err);
																								* ((INT8U *)pMsg + POINTER_LENGTH) = temp_para ;
																								* (INT16U *)((INT8U *)pMsg + POINTER_LENGTH + sizeof(INT8U) ) = ((PARAMETER_TBL *)((PARAMETER_PACKAGE * )pData)->ppara)->para_value[i];
																								OSMboxPost(StepMotor1_Ctrl.api.Mbox,pMsg);
																								break;
														default								:	break;	
													} 
												}*/
												
				break;
		}		
	}	    	    
}



/*********************************************************************************************************
** 函数名称: StepMotorTest
** 功能描述: StepMotor测试函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  
 
		void 	StepMotorTest(void * pData,INT8U * err)
{
	StepMotorLoad(pData,err);
	
	OSTimeDly(OS_TICKS_PER_SEC * 2);
	
	StepMotorUnLoad(pData,err);
}


/*********************************************************************************************************
** 函数名称: StepMotorDeamon
** 功能描述: StepMotor任务守护函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  
 
		void 	StepMotorDeamon(void * pData,INT8U * err)
{
	INT32S	tmp;
	
	OSSemPend(Ocb_Disp.api.IdleSem,0,err);

//	Ocb_Disp.op->clr(0,0,128,8,LCM_NORMAL_DISP);
	
	Ocb_Disp.op->disp_char(0,0,(INT8U *)("STEP Motor Monitor"),LCM_NORMAL_DISP);
		
	Ocb_Disp.op->disp_int(40,1,(StepMotor0_Ctrl.property) .dV,LCM_NORMAL_DISP);
	Ocb_Disp.op->disp_char(0,1,(INT8U *)(" dV :"),LCM_NORMAL_DISP);
	Ocb_Disp.op->disp_int(40,2,(StepMotor0_Ctrl.property) .Vm,LCM_NORMAL_DISP);
	Ocb_Disp.op->disp_char(0,2,(INT8U *)(" V_m :"),LCM_NORMAL_DISP);

	Ocb_Disp.op->disp_int(40,3,(StepMotor0_Ctrl.property) .Vt,LCM_NORMAL_DISP);
	Ocb_Disp.op->disp_char(0,3,(INT8U *)(" V_t :"),LCM_NORMAL_DISP);

	Ocb_Disp.op->disp_int(40,5,(StepMotor0_Ctrl.property) .St,LCM_NORMAL_DISP);
	Ocb_Disp.op->disp_char(0,5,(INT8U *)(" S_t :"),LCM_NORMAL_DISP);

	Ocb_Disp.op->disp_int(40,6,(StepMotor0_Ctrl.property) .Sr,LCM_NORMAL_DISP);
	Ocb_Disp.op->disp_char(0,6,(INT8U *)(" S_r :"),LCM_NORMAL_DISP);
	
	OSSemPost(Ocb_Disp.api.IdleSem);
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

/*******************************************************************************
*********************			任  务	定	义			************************
********************************************************************************/  


/*********************************************************************************************************
** 函数名称: STEP_SIG0_SET/CLR
** 功能描述: 步进脉冲控制函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年5月12日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  

#define	STEP_SIG0_SET()										\
{	PBDATDIR |= B4_MSK; 	/*置位步进信号*/				\
	GPTCONA |= T2PIN0;		/*把PWM输出强制为高*/			\
}

#define	STEP_SIG0_CLR()										\
{	PBDATDIR &= (~B4_MSK); 	/*清除步进信号*/				\
	GPTCONA &= (~T2PIN0);	/*把PWM输出设为高有效*/			\
}	

/*********************************************************************************************************
** 函数名称: DIR_SIG0_SET/CLR
** 功能描述: 步进脉冲方向控制函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年5月12日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  
/*置位方向信号*/
#define	DIR_SIG0_SET()					PEDATDIR |= B3_MSK

/*清除方向信号*/	
#define	DIR_SIG0_CLR()					PEDATDIR &= (~B3_MSK)

/*********************************************************************************************************
** 函数名称: ISR_StepMotor
** 功能描述: StepMotor周期中断控制函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  
 
 		void ISR_StepMotor0(void)
{
	static INT8U state;
	static INT8U pwm_counter = 0;
	INT32U	tmp;
	
	EVAIFRB |= T2PINT_FLAG;
		
	if( StepMotor0_Ctrl.property.Vt)
	{
		if(pwm_counter)
			pwm_counter -- ;
		else
		{
			pwm_counter = PWM_REPEATE_TIMES;
			
			if(( StepMotor0_Ctrl.property.Sr != StepMotor0_Ctrl.property.St ) || (StepMotor0_Ctrl.property.St == 0))	
			{
				switch(state)
				{
					case	0	:	
						STEP_SIG0_SET();
						T2CMP = 0;
						state ++;
						break;
					case	1		:	
						STEP_SIG0_CLR();
					default			:	
						tmp = T2PER ;
						tmp *= state ;
						tmp /= ( MAX_DIVIDER - 1 );
						T2CMP = tmp ;
						if( state < MAX_DIVIDER )
							state ++;
						else
							state = 0 ;
						break;
				}
				
				if( StepMotor0_Ctrl.property.Vt > 0 )
					StepMotor0_Ctrl.property.Sr ++;	
				else
					StepMotor0_Ctrl.property.Sr --;
						
			}
		}
	}
}
 
 

/*********************************************************************************************************
** 函数名称: StepMotorSetVelocity
** 功能描述: 步进电机速度设置函数
** 输 入: 无

⌨️ 快捷键说明

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