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

📄 chap2.c

📁 用凌阳16位单片机SPMC75F2413A来控制无刷直流电动机的详细程序包
💻 C
字号:

/* ========================================================================= */
/* The information contained herein is the exclusive property of             */
/* Sunplus Technology Co. And shall not be distributed, reproduced,          */
/* or disclosed in whole in part without prior written permission.           */
/*             (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.                     */
/*                    ALL RIGHTS RESERVED                                    */
/* The entire notice above must be reproduced on all authorized copies.      */
/* ========================================================================= */
/* 																			 */
/* ========================================================================= */
/* Project Name  : AN_SPMC75_0003	            							 */
/* File Name     : chap2.c 													 */
/* Description   : 系统服务函数												 */
/*                                                 						     */
/* Processor     : SPMC75F2413A											     */
/* Tools	     : u'nSP IDE tools v1.18.1A or later version				 */
/* ========================================================================= */
/* Revision																	 */
/* ========================================================================= */
/* Version       :  1.00   													 */
/* Date			 :	2005.9.1												 */
/* Modified by   :	更换正规的文件头和最新的头文件							 */
/* Description	 :												    		 */
/* ========================================================================= */

//=============================================//
//Include File
//=============================================//
#include	"BLDC.h"
//=============================================//
//120度方波控制信号PWM加入方式选择及正反转选择
//=============================================//
#define		Turnaround		6
/*
	0 -- 正转、上相PWM120度方波
	1 -- 反转、上相PWM120度方波
	2 -- 正转、下相PWM120度方波
	3 -- 反转、下相PWM120度方波
	
	4 -- 正转、前半相PWM120度方波
	5 -- 反转、前半相PWM120度方波
	6 -- 正转、后半相PWM120度方波
	7 -- 反转、后半相PWM120度方波	
*/
//=============================================//
static PID	 sPID;
PID	 *sptr = &sPID ;
static CONTROLSM sCtrlSM;
static CONTROLSM *sCSptr = &sCtrlSM;
static unsigned int uiFilter[CAPBSIZE]={0};
static unsigned int *ptr = uiFilter;
//=============================================//
static void Speedcalc(void);
static void IPM_Charge(void);
/*=================================================================*/
/*   Increment PID计算
/*=================================================================*/
static int IncPIDCalc(unsigned int NextPoint)
{
	register int dError, incpid;

	dError = sptr->SetPoint - NextPoint;

	incpid = sptr->Proportion * dError
           - sptr->Integral   * sptr->LastError
           + sptr->Derivative * sptr->PrevError;

	sptr->PrevError = sptr->LastError;
	sptr->LastError = dError;
	
	return(incpid);
}

/*=================================================================*/
/*BLDC 调速
/*=================================================================*/
#define		limpoint		MAXPWM/2
#define		inclength		2
static long summation = 0;

int abs(int number)
{	return(number>0? number:(-number));	}

void BLDC_Motor_Actiyator(void)
{
	static unsigned int count = 0;
	unsigned int uiSpeed = 0;

	if(!sCSptr->B._charge && sCSptr->B._workflag)
	{
		IPM_Charge();						//IPM充电
		count ++;
		if(count > 100)						//充电时间100*定时周期
		{
			IPM_Trigger_Off();
			sCSptr->B._slowflag = 1;
			sCSptr->B._charge = 1;
			count = 0;
		}	
	}
	else if(sCSptr->B._startup)
	{
		uiSpeed = 1875000L/(summation>>SHIFTDIV);		//计算速度
		
		if(sptr->IncPoint < 400)	sptr->IncPoint += inclength;
		else	sptr->IncPoint += IncPIDCalc(uiSpeed);	//PID调节
														//PWM限幅
		if(sptr->IncPoint > MAXPWM)	sptr->IncPoint = MAXPWM;
		if(sptr->IncPoint < MINPWM)	sptr->IncPoint = MINPWM;
		P_TMR3_TGRA->W = sptr->IncPoint;
		P_TMR_LDOK->W = CW_TMR_LDOK0;
	}
//	else 	uiSpeed = 0;												//DMC监视数据
	sptr->SetPoint = SPMC_DMC_Load_SpdCmd(1);
	SPMC_DMC_Save_SpdNow(1, uiSpeed);
	SPMC_DMC_Save_Aux(0, sptr->IncPoint);
	SPMC_DMC_Save_Aux(1, abs(sptr->SetPoint - uiSpeed));
}

/*=================================================================*/
/*BLDC 启动
/*=================================================================*/
void BLDC_Motor_Startup(void)
{
	if(sCSptr->B._slowflag)
	{
		sCtrlSM.B._startup = 0;
		if(sptr->IncPoint < limpoint)
		{
			sptr->IncPoint += 5;
			P_TMR3_TGRA->W = sptr->IncPoint;
			P_TMR_LDOK->W  = CW_TMR_LDOK0;
		}
		else
		{
			sptr->IncPoint = MINPWM;
			P_TMR3_TGRA->W = sptr->IncPoint;
			P_TMR_LDOK->W  = CW_TMR_LDOK0;
		}
		
#if Turnaround == 0		/* 上相PWM120度方波控制	*/
		IPM_Trigger_PU120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 1	
		IPM_Trigger_NU120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 2	/* 下相PWM120度方波控制	*/
		IPM_Trigger_PD120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 3
		IPM_Trigger_ND120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 4	/* 前半相PWM120度方波控制	*/
		IPM_Trigger_PF120HalfPWM(P_POS0_DectData->W);
#elif Turnaround == 5
		IPM_Trigger_NF120HalfPWM(P_POS0_DectData->W);
#elif Turnaround == 6	/* 后半相PWM120度方波控制	*/
		IPM_Trigger_PB120HalfPWM(P_POS0_DectData->W);
#elif Turnaround == 7
		IPM_Trigger_NB120HalfPWM(P_POS0_DectData->W);
#else
	#error -> define Turnaround error <- \
		The Value of Turnaround can be defined 0 to 7
#endif
	}
	else  IPM_Trigger_Off();
}

/*=================================================================*/
/*BLDC 正常运转
/*=================================================================*/
void BLDC_Motor_Normalrun(void)
{
	P_TMR0_Status->B.PDCIF = 1;
	if(sCSptr->B._slowflag)
	{
		sCSptr->B._startup = 1;

		Speedcalc();				//滤波
#if Turnaround == 0		/* 上相PWM120度方波控制	*/
		IPM_Trigger_PU120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 1
		IPM_Trigger_NU120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 2	/* 下相PWM120度方波控制	*/
		IPM_Trigger_PD120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 3
		IPM_Trigger_ND120FullPWM(P_POS0_DectData->W);
#elif Turnaround == 4	/* 前半相PWM120度方波控制	*/
		IPM_Trigger_PF120HalfPWM(P_POS0_DectData->W);
#elif Turnaround == 5
		IPM_Trigger_NF120HalfPWM(P_POS0_DectData->W);
#elif Turnaround == 6	/* 后半相PWM120度方波控制	*/
		IPM_Trigger_PB120HalfPWM(P_POS0_DectData->W);
#elif Turnaround == 7
		IPM_Trigger_NB120HalfPWM(P_POS0_DectData->W);
#else
	#error -> define Turnaround error <- \
		The Value of Turnaround can be defined 0 to 7
#endif
	}
	else IPM_Trigger_Off();
}

/*=================================================================*/
/*
/*=================================================================*/
#define		RADIX		(((24.0E+6)*60) / (64*6*2))

#define		MAXRPM		(unsigned int)((long)RADIX/5000)	//187
#define		MINRPM		(unsigned int)((long)RADIX/500)		//1875

static void Speedcalc(void)
{
	unsigned int original;

	original = P_TMR0_TGRA->W;
	if(original > 469)			//最高转速限制在4000rpm(RADIX/4000)
	{
		summation -= *ptr;		//滑动滤波
		*ptr = original;
		summation += *ptr;
		if((++ptr) > (uiFilter+CAPBSIZE-1))		ptr = uiFilter;
	}
}

/*=================================================================*/
/*IPM 充电
/*=================================================================*/
static void IPM_Charge(void)
{
	P_TMR3_OutputCtrl->W = CW_TMR3_POLP_Active_High	|	\
						   CW_TMR3_UPWM_Out_HL | CW_TMR3_UOC_Mode1 |	\
						   CW_TMR3_VPWM_Out_HL | CW_TMR3_VOC_Mode1 |	\
						   CW_TMR3_WPWM_Out_HL | CW_TMR3_WOC_Mode1;
}

/*=================================================================*/
/*
/*=================================================================*/
void BLDC_Run_Service(void)
{
	register int i;
	
	MC75_DMC_UART_Service();			//DMC服务程序

	if(SPMC_DMC_Load_MotorSig(1))		//启动命令判断
	{
		P_IOB_Data->B.bit14 = 1;
		sCSptr->B._workflag = 1;
		P_Fault1_Ctrl->B.FTPINE = 1;
	} 
	else
	{									//复位寄存器
		P_IOB_Data->B.bit14 = 0;
		IPM_Trigger_Off();
		for(i=0;i<CAPBSIZE;i++)	uiFilter[i] = 0;
		sptr->IncPoint  = MINPWM;
	    sptr->LastError = 0;
	    sptr->PrevError = 0;
	    summation = 0;
		sCSptr->W = 0;
		P_Fault1_Ctrl->B.FTPINE = 0;
	}
}

/*=================================================================*/
/*IPM 保护 输出错误保护和输入错误保护
/*=================================================================*/
void IPM_Fault_Protect(void)
{
	if(P_INT_Status->B.FTIF)
	{
/*		if(P_Fault1_Ctrl->B.OSF)
		{									//短路输出错误保护
			P_IOB_Data->B.bit14 = 0;
			P_Fault1_Release->W = 0xAA55;
			P_Fault1_Release->W = 0x55AA;
			P_Fault1_Ctrl->B.OCE  = 1;
			P_IOB_Data->B.bit14 = 1;
		}*/
		
		if(P_Fault1_Ctrl->B.FTPINIF)
		{									//错误输入保护
			P_IOB_Data->B.bit14 = 0;
			P_Fault1_Release->W = 0x55AA;
			P_Fault1_Release->W = 0xAA55;
			P_Fault1_Ctrl->B.FTPINE = 1;
			P_IOB_Data->B.bit14 = 1;
		}
	}
}
/*=================================================================*/
/*	*END*
/*=================================================================*/

⌨️ 快捷键说明

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