📄 chap2.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 + -