📄 drv_s_motor.c
字号:
/*********************************************************************************************************
** uC/OS 2 FOR TI TMS320240X
** The Real-Time Kernel(For CCS2.2)
**
**
** V0.00.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: Drv_StepStepMotor.C
**创 建 人: 龚树强
**版 本: V0.01.3
**最后修改日期: 2005年5月10日
**描 述: 步进电机控制函数源文件
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 龚树强
** 版 本: V0.01.3
** 日 期: 2005年3月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "..\source\includes.h"
/*******************************************************************************
********************* 常 量 定 义 ************************
********************************************************************************/
const INT8U name_stepmotor[] = "smotor";
const struct obj_operation StepMotorOperation = {
StepMotorIOCtrl, /* void (*ioctrl)(void *,INT8U *) */
StepMotorLoad, /* void (*load)(void *,INT8U *) */
StepMotorUnLoad, /* void (*unload)(void *,INT8U *) */
StepMotorSet, /* void (*set)(void *,INT8U *) */
StepMotorTest, /* void (*test)(void *,INT8U *) */
NULL /* void (*deamon)(void *,INT8U *) */
};
/*******************************************************************************
********************* 变 量 定 义 ************************
********************************************************************************/
STEPMOTOR_CTRL StepMotor0_Ctrl;
OS_STK STK_StepMotor0[TASK_STK_SIZE];
STEPMOTOR_CTRL StepMotor1_Ctrl;
OS_STK STK_StepMotor1[TASK_STK_SIZE];
/*
INT16U I_KP; //电流调节比例系数
INT16U I_KI; //电流调节积分系数
INT16U I_KC; //电流调节积分饱和修正系数
INT16U I_REF; //电流参考值
INT16U I_EK; //电流偏差
INT16U I_RK; //电流第K次积分调节累计
INT16U I_U; //电流调节输出
INT16U I_ELPI; //电流极限偏差
INT16U I_MIN; //电流最小值
INT16U I_MAX; //电流最大值
*/
/*******************************************************************************
********************* 功 能 函 数 定 义 ************************
********************************************************************************/
/*********************************************************************************************************
** 函数名称: StepMotor_Init
** 功能描述: StepMotor初始化函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void StepMotor0_Init(void * pData,INT8U * err)
{
MCRA |= B13_MSK; //STEP_PWM (T2PWM)
MCRA &= (~(B12_MSK)); //STEP_SIG (T1PWM)
PBDATDIR |= B12_MSK;
MCRC &= (~(B3_MSK)); //STEP_DIR (PWM9)
PEDATDIR |= B11_MSK;
ISR_Reg( T2PINT_ISR ,ISR_StepMotor0 , err);
T2CON = TMODE0|TENCMP; /*连续增减计数模式,不预分频,使能定时器比较操作,定时器比较寄存器在计数值为0时重装载*/
GPTCONA |= TCOMPOE|T2PIN1; /*使能通用定时器比较输出*/
EVAIFRB |= T2PINT_FLAG;
EVAIMRB |= T2PINT_ENA; /*允许周期中断*/
// T2PER = (( SYSCLK / OS_TICKS_PER_SEC ) * 2 + 1 ) / 2;
T2CON |= TENABLE;
IMR |= INT3MASK;
}
/*********************************************************************************************************
** 函数名称: StepMotorIOCtrl
** 功能描述: StepMotorIO函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void StepMotorIOCtrl(void * pData,INT8U * err)
{
}
/*********************************************************************************************************
** 函数名称: StepMotorLoad
** 功能描述: StepMotor任务装载函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void StepMotorLoad(void * pData,INT8U * err)
{
INT8U para_num;
INT8U i;
INT8U selected_obj;
INT8U temp_para;
para_num = ((PARAMETER_PACKAGE *)pData)->para_num;
selected_obj = NULL;
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 |= STEPMOTOR0_SELECTED;
break;
case STEPMOTOR_SELECT_1 :
selected_obj |= STEPMOTOR1_SELECTED;
break;
default :
break;
}
}
if(selected_obj == NULL)
{
selected_obj |= STEPMOTOR0_SELECTED;
selected_obj |= STEPMOTOR1_SELECTED;
}
if(selected_obj & STEPMOTOR0_SELECTED)
{
if(StepMotor0_Ctrl.api.ObjLoaded != OBJ_LOADED)
{
StepMotor0_Ctrl.api.Mbox = OSMboxCreate((void *)0);
StepMotor0_Ctrl.api.MboxSem = OSSemCreate(1);
StepMotor0_Ctrl.api.ObjLoaded = OBJ_LOADED;
StepMotor0_Ctrl.property.mode = STEPMOTOR_HALT;
StepMotor0_Ctrl.property.Vm = 0;
StepMotor0_Ctrl.property.Vt = 0;
StepMotor0_Ctrl.property.St = 0;
StepMotor0_Ctrl.property.Sr = 0;
StepMotor0_Ctrl.func.SetVelocity = StepMotor0SetVelocity;
OSTaskCreate( Task_StepMotor, //create a task
(void *)(&StepMotor0_Ctrl), //parameter
&STK_StepMotor0[0], //BOS
STEPMOTOR_0_PRIO //task prio
);
StepMotor0_Init((void *)NULL,NULL);
}
else
{
* err = ERROR_CMD_REJECTED;
return;
}
}
/* if(selected_obj & STEPMOTOR1_SELECTED)
{
if(StepMotor1_Ctrl.api.ObjLoaded != OBJ_LOADED)
{
StepMotor1_Ctrl.api.Mbox = OSMboxCreate((void *)0);
StepMotor1_Ctrl.api.MboxSem = OSSemCreate(1);
StepMotor1_Ctrl.api.ObjLoaded = OBJ_LOADED;
StepMotor1_Ctrl.property.mode = 0;
//StepMotor1_Ctrl.func.led_on = Led_DS2_On;
//StepMotor1_Ctrl.func.led_off = Led_DS2_Off;
OSTaskCreate( Task_StepMotor, //create a task
(void *)(&StepMotor1_Ctrl), //parameter
&STK_StepMotor1[0], //BOS
STEPMOTOR_1_PRIO //task prio
);
}
else
{
* err = ERROR_CMD_REJECTED;
return;
}
}
*/
StepMotorSet(pData,err);
return;
}
/*********************************************************************************************************
** 函数名称: StepMotorUnLoad
** 功能描述: StepMotor任务卸载函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void StepMotorUnLoad(void * pData,INT8U * err)
{
INT8U para_num;
INT8U i;
INT8U selected_obj;
INT8U temp_para;
para_num = ((PARAMETER_PACKAGE *)pData)->para_num;
selected_obj = NULL;
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 |= STEPMOTOR0_SELECTED;
break;
case STEPMOTOR_SELECT_1 :
selected_obj |= STEPMOTOR1_SELECTED;
break;
default :
break;
}
}
if(selected_obj == NULL)
{
selected_obj |= STEPMOTOR0_SELECTED;
selected_obj |= STEPMOTOR1_SELECTED;
}
if(selected_obj & STEPMOTOR0_SELECTED)
{
if(StepMotor0_Ctrl.api.ObjLoaded != OBJ_UNLOADED)
{
OSSemPend(SysBufSem_2,0,err);
pData = (INT8U * )OSMemGet(SysBuf_2,err);
*((INT8U *)pData + POINTER_LENGTH) = STEPMOTOR_KILL_TASK ;
OSMboxPost(StepMotor0_Ctrl.api.Mbox,pData);
}
else
{
*err = ERROR_CMD_REJECTED;
return;
}
}
/* if(selected_obj & STEPMOTOR1_SELECTED)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -