Limit Speed

用getTickCount判断

于thread内进行Paused和Resume

/***************************************************************************** ** \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) 使能这两个限制,能解决我的上述问题吗
最新发布
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值