📄 drv_s_motor.c
字号:
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 + -