📄 drv_motor.c
字号:
/*********************************************************************************************************
** uC/OS 2 FOR TI TMS320240X
** The Real-Time Kernel(For CCS2.2)
**
**
** V0.00.1
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: Drv_Motor.C
**创 建 人: 龚树强
**版 本: V0.01.3
**最后修改日期: 2005年3月10日
**描 述: 直流电机控制函数源文件
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 龚树强
** 版 本: V0.01.3
** 日 期: 2005年3月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "..\source\includes.h"
/*******************************************************************************
********************* 常 量 定 义 ************************
********************************************************************************/
//const INT8U name_dc_motor[] = "dc_motor";
const INT8U name_dc_motor[] = "motor";
const struct obj_operation DCMotorOperation = {
NULL, /* void (*ioctrl)(void *,INT8U *) */
DCMotorLoad, /* void (*load)(void *,INT8U *) */
DCMotorUnLoad, /* void (*unload)(void *,INT8U *) */
DCMotorSet, /* void (*set)(void *,INT8U *) */
DCMotorTest, /* void (*test)(void *,INT8U *) */
NULL /* void (*deamon)(void *,INT8U *) */
};
/*******************************************************************************
********************* 变 量 定 义 ************************
********************************************************************************/
DC_MOTOR_CTRL DCMotor0_Ctrl;
OS_STK STK_DCMotor0[TASK_STK_SIZE];
DC_MOTOR_CTRL DCMotor1_Ctrl;
OS_STK STK_DCMotor1[TASK_STK_SIZE];
INT16S I_Kp; //电流调节比例系数 (Q12格式)
INT16S I_Ki; //电流调节积分系数 (Q12格式)
INT16S I_Kc; //电流调节积分饱和修正系数 (Q12格式)
INT16S I_Ref; //电流参考值 (Q12格式)
INT32S N_Kp; //速度调节比例系数 (Q12格式)
INT32S N_Ki; //速度调节积分系数 (Q12格式)
INT32S N_Kc; //速度调节积分饱和修正系数 (Q12格式)
INT16S tmp_I_Kp;
INT16S tmp_I_Ki;
INT32S tmp_N_Kp;
INT32S tmp_N_Ki;
INT16S KSPEED; //编码脉冲-速度转换系数 (Q12格式)
INT32S N_Ref; //速度参考值 (Q12格式)
INT32S N_Ek; //速度偏差 (Q12格式)
INT32S N_Rk; //速度第K次积分调节累计 (Q12格式)
INT32S N_U; //速度调节输出 (Q12格式)
INT16S I_Ek; //电流偏差 (Q12格式)
INT16S I_Rk; //电流第K次积分调节累计 (Q12格式)
INT16S I_U; //电流调节输出 (Q12格式)
INT32S N_U_Min; //速度环电流最小值 (Q12格式)
INT32S N_U_Max; //速度环电流最大值 (Q12格式)
INT16S I_U_Min; //电流环输出最小值 (Q12格式)
INT16S I_U_Max; //电流环输出最大值 (Q12格式)
INT16U gADC_BUF; //SPI接口AD的寄存器
/*******************************************************************************
********************* 功 能 函 数 定 义 ************************
********************************************************************************/
/*********************************************************************************************************
** 函数名称: DCMotor_Init
** 功能描述: DCMotor初始化函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DCMotor0_Init(void * pData,INT8U * err)
{
// ISR_Reg( ADCINT_H_ISR , ISR_DCMotor0 , err);
ISR_Reg( T3PINT_ISR , ISR_DCMotor0 , err);
/******************************** 定 时 器 3 设 置 ****************************************/
T3CON = TMODE1; /*连续增计数模式,不预分频*/
GPTCONB |= T3STAT|T3TOADC1; /*增计数,设置由周期中断标志来启动AD转换*/
GPTCONB &= ~T3TOADC0;
EVBIFRA |= T3PINT_FLAG;
EVBIMRA |= T3PINT_ENA; /*允许周期中断*/
T3PER = (( SYSCLK / DC_MOTOR_CONTROL_CYCLE / CURRENT_MODULATE_CYCLE ) * 2 + 1 ) / 2;
T3CON |= TENABLE;
IMR |= INT2MASK;
/******************************** 比 较 器 B 设 置 ****************************************/
COMCONB = CENABLE|FCOMPOE; /*使能比较输出,PWM输出引脚使能,CMPRx下溢重载,方式寄存器下溢重载*/
ACTRB = CMP7ACT0|CMP8ACT1; /*CMP8高有效,CMP7低有效*/
DBTCONB = 0; /*不使能死区控制*/
/******************************** IO 口 设 置 ****************************************/
MCRC |= B1_MSK|B2_MSK|B7_MSK|B8_MSK; /*使能PWM7,PWM8,QEP3,QEP4*/
/******************************** SPI 设 置 ****************************************/
SPI_Init();
/******************************** ADC 设 置 ****************************************/
// ADCTRL1 |= CONT_RUN;/*连续运行模式*/
/* 当置为连续运行模式时,只要把中断标志位清除就会马上开始新一次得转换,从而使中断系统出现混乱,
故尽可能不要用连续运行模式*/
// ADCTRL1 |= CPS|ACQ_PS3|ACQ_PS2|ACQ_PS1; /*采样周期为2us*/
// ADCTRL2 |= EVB_SOC_SEQ2 | INT1_ENA_SEQ2 ; /*可以用EVB的一个事件信号触发AD转换,且用中断模式1*/
// MAXCONV = 7<<4;
// CHSELSEQ3 = 0x1010; /*用SEQ2时,排序器指针依次从CONV8指到CONV12*/
// CHSELSEQ4 = 0x1010;
// MAXCONV = 0<<4;
// CHSELSEQ3 = 0x0000; /*用SEQ2时,排序器指针依次从CONV8指到CONV12*/
// CHSELSEQ4 = 0x0000;
// EVB_QEP_Init();
/******************************** PID 变 量 设 置 ****************************************/
N_U_Max = N_U_MAX; //速度环电流最小值
N_U_Min = -N_U_Max; //速度环电流最大值
I_U_Max = I_U_MAX; //电流环输出最大值
I_U_Min = -I_U_Max; //电流环输出最小值
I_Kp = 800 ; //电流调节比例系数 (Q12格式)
I_Ki = 400 ; //电流调节积分系数 (Q12格式)
I_Kc = ((INT32S)I_Ki<<12)/I_Kp ; //电流调节积分饱和修正系数 (Q12格式)
I_Ref =0 ; //电流参考值 (Q12格式)
I_Rk = 0;
N_Kp = 800 ; //电流调节比例系数 (Q12格式)
N_Ki = 800 ; //电流调节积分系数 (Q12格式)
N_Kc = ((INT32S)N_Ki<<12)/N_Kp ; //电流调节积分饱和修正系数 (Q12格式)
N_Rk = 0;
N_Ref = 0;
tmp_I_Kp = I_Kp;
tmp_I_Ki = I_Ki ;
tmp_N_Kp = N_Kp;
tmp_N_Ki = N_Ki;
}
/*********************************************************************************************************
** 函数名称: DCMotorIOCtrl
** 功能描述: DCMotorIO函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DCMotorIOCtrl(void * pData,INT8U * err)
{
}
/*********************************************************************************************************
** 函数名称: DCMotorLoad
** 功能描述: DCMotor任务装载函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DCMotorLoad(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 DC_MOTOR_SELECT_0 :
selected_obj |= DC_MOTOR0_SELECTED;
break;
case DC_MOTOR_SELECT_1 :
selected_obj |= DC_MOTOR1_SELECTED;
break;
default :
break;
}
}
if(selected_obj == NULL)
{
selected_obj |= DC_MOTOR0_SELECTED;
selected_obj |= DC_MOTOR1_SELECTED;
}
if(selected_obj & DC_MOTOR0_SELECTED)
{
if(DCMotor0_Ctrl.api.ObjLoaded != OBJ_LOADED)
{
DCMotor0_Ctrl.api.Mbox = OSMboxCreate((void *)0);
DCMotor0_Ctrl.api.MboxSem = OSSemCreate(1);
DCMotor0_Ctrl.api.ObjLoaded = OBJ_LOADED;
DCMotor0_Ctrl.property.mode = DC_MOTOR_HALT;
DCMotor0_Ctrl.func.SetVelocity = DCMotor0SetVelocity;
OSTaskCreate ( Task_DCMotor, //create a task
(void *)(&DCMotor0_Ctrl), //parameter
&STK_DCMotor0[0], //BOS
DC_MOTOR_0_PRIO //task prio
);
DCMotor0_Init((void *)NULL,NULL);
}
else
{
* err = ERROR_CMD_REJECTED;
return;
}
}
DCMotorSet(pData,err);
return;
}
/*********************************************************************************************************
** 函数名称: DCMotorUnLoad
** 功能描述: DCMotor任务卸载函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年4月22日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DCMotorUnLoad(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++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -