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

📄 drv_motor.c

📁 uCOS2 for 51系列
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************************************************************
**				                         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 + -