Ver código fonte

限制功率变化需要重新设置挡位信息(主要是限制母线电流和相电流)

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 anos atrás
pai
commit
628640a1a2

+ 1 - 1
Applications/bsp/board_mc100_v1.h

@@ -15,7 +15,7 @@
 #define CONFIG_MAX_MOT_RPM      9000.0f
 #define CONFIG_MAX_PHASE_CURR   400.0F
 #define CONFIG_MAX_PHASE_VOL    (CONFIG_MOS_MAX_VOL - 20.0F)
-#define CONFIG_MAX_TORQUE       50.0F
+#define CONFIG_MAX_TORQUE       CONFIG_MAX_PHASE_CURR
 
 #define CONFIG_CURRENT_BANDWITH  1000.0f /* 电流环带宽 */
 //#define CONFIG_BEEP 

+ 14 - 3
Applications/foc/core/PMSM_FOC_Core.c

@@ -572,7 +572,8 @@ void PMSM_FOC_idqCalc(void) {
 	PMSM_FOC_idq_Assign();
 }
 
-void PMSM_FOC_RunTime_Limit(void) {
+bool PMSM_FOC_RunTime_Limit(void) {
+	bool changed = false;
 	float dclim = (float)vbus_current_vol_lower_limit();
 	float phaselim = (float)phase_current_temp_high_limit();
 
@@ -585,8 +586,12 @@ void PMSM_FOC_RunTime_Limit(void) {
 	if (dclim < gFoc_Ctrl.rtLim.DCCurrLimRamp.target) {
 		eRamp_set_step_target(&gFoc_Ctrl.rtLim.DCCurrLimRamp, dclim, CONFIG_eCTRL_STEP_TS);
 	}
-	gFoc_Ctrl.protLim.s_iDCLim = dclim;
-	gFoc_Ctrl.protLim.s_PhaseCurrLim = phaselim;
+	if (gFoc_Ctrl.protLim.s_iDCLim != dclim || gFoc_Ctrl.protLim.s_PhaseCurrLim != phaselim) {
+		gFoc_Ctrl.protLim.s_iDCLim = dclim;
+		gFoc_Ctrl.protLim.s_PhaseCurrLim = phaselim;
+		changed = true;
+	}
+	return changed;
 }
 
 void PMSM_FOC_Slow_Task(void) {
@@ -703,6 +708,12 @@ void PMSM_FOC_TorqueLimit(float torqueLimit) {
 		torqueLimit = gFoc_Ctrl.hwLim.s_torqueMax;
 	}
 	gFoc_Ctrl.userLim.s_torqueLim = torqueLimit;
+
+	if (ABS(gFoc_Ctrl.in.s_motRPM) < 10){
+		eRamp_reset_target(&gFoc_Ctrl.rtLim.phaseCurrLimRamp, torqueLimit);
+	}else {
+		eRamp_set_step_target(&gFoc_Ctrl.rtLim.phaseCurrLimRamp, torqueLimit, CONFIG_eCTRL_STEP_TS);
+	}
 }
 float PMSM_FOC_GetTorqueLimit(void) {
 	return gFoc_Ctrl.userLim.s_torqueLim;

+ 1 - 1
Applications/foc/core/PMSM_FOC_Core.h

@@ -282,7 +282,7 @@ void PMSM_FOC_GetPid(u8 id, float *kp, float *ki, float *kb);
 bool PMSM_FOC_AutoHoldding(void);
 void PMSM_FOC_Slow_Task(void);
 void PMSM_FOC_Set_PlotType(Plot_t t);
-void PMSM_FOC_RunTime_Limit(void);
+bool PMSM_FOC_RunTime_Limit(void);
 void PMSM_FOC_RT_PhaseCurrLim(float lim);
 void PMSM_FOC_RT_LimInit(void);
 float PMSM_FOC_Get_Real_Torque(void);

+ 3 - 3
Applications/foc/motor/motor.c

@@ -135,7 +135,7 @@ static void mc_gear_vmode_changed(void) {
 	sys_debug("limit %d-%d-%d, mode = %s\n", gears[motor.n_gear].u_maxRPM, gears[motor.n_gear].u_maxIdc, gears[motor.n_gear].u_maxTorque, motor.b_is96Mode?"96V":"48V");
 	PMSM_FOC_SpeedRampLimit(gears[motor.n_gear].u_maxRPM, 500, 500);
 	PMSM_FOC_DCCurrLimit(gears[motor.n_gear].u_maxIdc);
-	PMSM_FOC_PhaseCurrLim(gears[motor.n_gear].u_maxTorque);
+	PMSM_FOC_TorqueLimit(gears[motor.n_gear].u_maxTorque);
 }
 
 void mc_init(void) {
@@ -837,11 +837,11 @@ void Sched_MC_mTask(void) {
 	u8 runMode = PMSM_FOC_CtrlMode();
 
 	/*保护功能*/
-	PMSM_FOC_RunTime_Limit();
+	bool limted = PMSM_FOC_RunTime_Limit();
 	/* 母线电流,实际采集的相电流矢量大小的计算 */
 	PMSM_FOC_Calc_Current();
 
-	if (is96v_prev != motor.b_is96Mode) {
+	if ((is96v_prev != motor.b_is96Mode) || limted) {
 		mc_gear_vmode_changed();
 	}
 	if (motor.b_calibrate || (motor.mode == CTRL_MODE_OPEN)) {

+ 1 - 0
Applications/foc/samples.c

@@ -211,6 +211,7 @@ void sample_motor_temp(void) {
 	motor_temp.value = ntc_get_motor_temp(r);
 	LowPass_Filter(motor_temp.filted_value, motor_temp.value, motor_temp.lowpass);
 #endif
+	motor_temp.filted_value = 0;
 }
 
 void sample_mos_temp(void) {