/*****************************************************************************
** \brief void MC_Speed_Control(void)
**
** \param [in] none
** \return none
** \note 电机转速控制,限转速与限功率控制
*****************************************************************************/
void MC_Speed_Control(void)
{
static u8 SpeedLimit_Flag = 0;
static u16 SpeedLimit_Count = 0;
static u16 SpeedTargetBeforeLimit;
#if (Power_Limit_Mode == Hardware_Limit)
s32 Temp_Power=0;
/* 硬件功率计算 */
Samp.ARR[CH_IBUS] = FRACMPY_Q10((Samp.ADVal[CH_IBUS] - Samp.REF[CH_IBUS]),Samp.G_Ib);
Basic.Ibus = DFILTER(Samp.ARR[CH_IBUS], Basic.Ibus, Para.Lpf.Samp_Ibus);
if(Basic.Ibus < 0) {Basic.Ibus = 0;}
// Temp_Power = FRACMPY_Q15(Basic.Vbus,Basic.Ibus);
Temp_Power = Motor_Actual.Vbus*Motor_Actual.Ibus*Motor_Actual.G_Power/10000;
// Basic.Power = Temp_Power;//(Temp_Power, Basic.Power, Para.Lpf.Samp_Ibus);
Basic.Power = DFILTER(Temp_Power, Basic.Power, Para.Lpf.Samp_Vctrl);
#else
/* 软件功率计算 */
Basic.Power = Basic.dq_power;
#endif
if(MOTOR_STATE == MC_RUN)
{
// 调速控制模式,恒转矩/恒转速/恒功率
if(++FOC.W_Cycle >= FOC.WRAMP)
{
FOC.W_Cycle = 0;
// 调速信号爬坡处理
MC_Ramp_Control(&s_SpeedCtrl, FOC.Speed_Ref);
// 力矩环控制
#if (Config_Contorl_Mode == Torgue_Loop)
{
// 限功率使能,若限功率和限转速同时使能,则执行限功率控制
#if (LIMIT_POWER_ENABLE)
// 非限制状态下判断当前功率是否超过限定功率
if(!SpeedLimit_Flag)
{
if(Basic.Power > FOC.PowerLimit)
{
// 防止频繁进入与退出限速模式
if(++SpeedLimit_Count > 500/FOC.WRAMP)
{
SpeedLimit_Flag = 1;
SpeedTargetBeforeLimit = s_SpeedCtrl.RampOut; //保存当前档位
PID_WL.Kp = 16384; //功率环KP = _Q15(0.5), 避开浮点运算
PID_WL.Ki = 1638; //功率环KI = _Q15(0.05), 避开浮点运算
PID_WL.KiSum = s_Curr_d_q_ref.Iq<<14;
PID_WL.Integral = s_Curr_d_q_ref.Iq;
}
}
}
//限制状态下判断是否需要取消限制
else
{
//档位下降时取消限制
if(s_SpeedCtrl.RampOut < (SpeedTargetBeforeLimit - 100))
{
SpeedLimit_Flag = 0;
}
if(!SpeedLimit_Flag)
{
PID_WL.Kp = Para.FOC.Wkp; //恢复转速环PI
PID_WL.Ki = Para.FOC.Wki;
}
}
// 限速使能
#elif (LIMIT_SPEED_ENABLE)
// 非限速状态下判断当前转速是否超过限定转速
if(!SpeedLimit_Flag)
{
if(Basic.Mech_Speed > LIMIT_SPEED_VALUE)
{
// 防止频繁进入与退出限速模式
if(++SpeedLimit_Count > 500/FOC.WRAMP)
{
SpeedLimit_Flag = 1;
SpeedTargetBeforeLimit = s_SpeedCtrl.RampOut; //保存当前档位
PID_WL.Kp = 16384; //速度环KP = _Q15(0.5), 避开浮点运算
PID_WL.Ki = 1638; //速度环KI = _Q15(0.05), 避开浮点运算
PID_WL.KiSum = s_Curr_d_q_ref.Iq<<14;
PID_WL.Integral = s_Curr_d_q_ref.Iq;
}
}
}
//限速状态下判断是否需要取消限速
else
{
//档位下降时取消限速
if(s_SpeedCtrl.RampOut < (SpeedTargetBeforeLimit - 100))
{
SpeedLimit_Flag = 0;
}
if(!SpeedLimit_Flag)
{
PID_WL.Kp = Para.FOC.Wkp; //恢复功率环PI
PID_WL.Ki = Para.FOC.Wki;
}
}
#endif //end limit power/speed enable
if(SpeedLimit_Flag)
{
// 限功率使能
#if (LIMIT_POWER_ENABLE)
//恒功率时的PI周期
FOC.WRAMP = POWER_LOOP_TIME;
//限功率时恒功率控制
FOC.Curr_Is_Ref = PID_CALC(&PID_WL, FOC.PowerLimit, Basic.Power);
// 限速使能
#elif (LIMIT_SPEED_ENABLE)
//恒转速时的PI周期
FOC.WRAMP = SPEED_LOOP_TIME;
//限速时恒转速控制
FOC.Curr_Is_Ref = PID_CALC(&PID_WL, Basic.Calb_SpeedLimit, Basic.Calb_Speed);
#endif
}
else
{
//恒力矩时的PI周期
FOC.WRAMP = 1;
//开机状态恒力矩控制
FOC.Curr_Is_Ref = s_SpeedCtrl.RampOut;
}
}
// 转速环控制
#elif (Config_Contorl_Mode == Speed_Loop)
{
// 限功率使能
#if (LIMIT_POWER_ENABLE)
// 非限制状态下判断当前功率是否超过限定功率
if(!SpeedLimit_Flag)
{
if(Basic.Power > FOC.PowerLimit)
{
// 防止频繁进入与退出限速模式
if(++SpeedLimit_Count > 500/FOC.WRAMP)
{
SpeedLimit_Flag = 1;
SpeedTargetBeforeLimit = s_SpeedCtrl.RampOut; //保存当前档位
PID_WL.Kp = 16384; //功率环KP = _Q15(0.5), 避开浮点运算
PID_WL.Ki = 1638; //功率环KI = _Q15(0.05), 避开浮点运算
}
}
}
//限制状态下判断是否需要取消限制
else
{
//档位下降时取消限制
if(s_SpeedCtrl.RampOut < (SpeedTargetBeforeLimit - 100))
{
SpeedLimit_Flag = 0;
}
//当前转速值比限速前档位转速大时退出功率限制
// if(Basic.Calb_Speed > SpeedTargetBeforeLimit)
// {
// SpeedLimit_Flag = 0;
// }
if(!SpeedLimit_Flag)
{
PID_WL.Kp = Para.FOC.Wkp; //恢复转速环PI
PID_WL.Ki = Para.FOC.Wki;
}
}
#endif //end limit power enable
if(SpeedLimit_Flag)
{
//恒功率时的PI周期
FOC.WRAMP = POWER_LOOP_TIME;
//限功率时恒功率控制
FOC.Curr_Is_Ref = PID_CALC(&PID_WL, FOC.PowerLimit, Basic.Power);
}
else
{
//恒转速时的PI周期
FOC.WRAMP = SPEED_LOOP_TIME;
//开机状态恒转速控制
FOC.Curr_Is_Ref = PID_CALC(&PID_WL, s_SpeedCtrl.RampOut, Basic.Calb_Speed);
}
}
// 功率环控制
#elif (Config_Contorl_Mode == Power_Loop)
{
// 限速使能
#if (LIMIT_SPEED_ENABLE)
// 非限速状态下判断当前转速是否超过限定转速
if(!SpeedLimit_Flag)
{
if(Basic.Mech_Speed > LIMIT_SPEED_VALUE)
{
// 防止频繁进入与退出限速模式
if(++SpeedLimit_Count > 500/FOC.WRAMP)
{
SpeedLimit_Flag = 1;
SpeedTargetBeforeLimit = s_SpeedCtrl.RampOut; //保存当前档位
PID_WL.Kp = 16384; //速度环KP = _Q15(0.5), 避开浮点运算
PID_WL.Ki = 1638; //速度环KI = _Q15(0.05), 避开浮点运算
}
}
}
//限速状态下判断是否需要取消限速
else
{
//档位下降时取消限速
if(s_SpeedCtrl.RampOut < (SpeedTargetBeforeLimit - 100))
{
SpeedLimit_Flag = 0;
}
//当前功率值比限速前档位功率大时退出限速
if(Basic.Power > (SpeedTargetBeforeLimit + 100))
{
SpeedLimit_Flag = 0;
}
if(!SpeedLimit_Flag)
{
PID_WL.Kp = Para.FOC.Wkp; //恢复功率环PI
PID_WL.Ki = Para.FOC.Wki;
}
}
#endif //end limit speed enable
if(SpeedLimit_Flag)
{
//恒转速时的PI周期
FOC.WRAMP = SPEED_LOOP_TIME;
//限速时恒转速控制
FOC.Curr_Is_Ref = PID_CALC(&PID_WL, Basic.Calb_SpeedLimit, Basic.Calb_Speed);
}
else
{
//恒功率时的PI周期
FOC.WRAMP = POWER_LOOP_TIME;
//开机状态恒功率控制
FOC.Curr_Is_Ref = PID_CALC(&PID_WL, s_SpeedCtrl.RampOut, Basic.Power);
}
}
#endif //end torgue and speed or power loop
// 限制IQ电流输出
if(FOC.Curr_Is_Ref > FOC.Curr_Iq_Max) FOC.Curr_Is_Ref = FOC.Curr_Iq_Max;
if(FOC.Curr_Is_Ref < FOC.Curr_Iq_Min) FOC.Curr_Is_Ref = FOC.Curr_Iq_Min;
}
}
/* 电机工作在非运行态 */
else
{
SpeedLimit_Flag = 0;
SpeedLimit_Count = 0;
FOC.W_Cycle = 0;
PID_WL.Kp = Para.FOC.Wkp;
PID_WL.Ki = Para.FOC.Wki;
#if (Config_Contorl_Mode == Torgue_Loop)
FOC.WRAMP = 1;
#elif (Config_Contorl_Mode == Speed_Loop)
FOC.WRAMP = SPEED_LOOP_TIME;
#elif (Config_Contorl_Mode == Power_Loop)
FOC.WRAMP = POWER_LOOP_TIME;
#endif
}
}该代码中我要实现功率环控制,#define LIMIT_POWER_ENABLE (1)
#define LIMIT_POWER_VALUE (70) //70
#define LIMIT_SPEED_ENABLE (1)
#define LIMIT_SPEED_VALUE (7000) 使能这两个限制,能解决我的上述问题吗
最新发布