Pārlūkot izejas kodu

加入刹车能量回收

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 gadi atpakaļ
vecāks
revīzija
0cf5cb2253

+ 3 - 2
Applications/app/nv_storage.c

@@ -45,13 +45,14 @@ static void nv_default_foc_params(void) {
 	foc_params.s_maxRPM = 8200;
 	foc_params.s_maxEpmRPM = 133;
 	foc_params.s_maxTorque = 180;
-	foc_params.s_maxBrkCurrent = 10.0f;
+	foc_params.s_PhaseCurreBrkLim = 10.0f;
 	foc_params.n_currentBand = 500;
 	foc_params.n_modulation = 1.0f;
 	foc_params.n_PhaseFilterCeof = 0.2f;
 	foc_params.n_brkShutPower = 1;
 	foc_params.s_LimitiDC = 20.0f;
-
+	foc_params.s_iDCeBrkLim = 15.0f;
+	
 	foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld);
 	foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
 	foc_params.pid_conf[PID_D_id].kb = 0;

+ 2 - 1
Applications/app/nv_storage.h

@@ -14,7 +14,8 @@ typedef struct {
 	float s_maxRPM;
 	float s_maxEpmRPM;
 	float s_maxTorque;
-	float s_maxBrkCurrent;
+	float s_PhaseCurreBrkLim;
+	float s_iDCeBrkLim;
 	float s_LimitiDC;
 	float n_modulation;
 	float n_PhaseFilterCeof;

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

@@ -166,7 +166,8 @@ static void PMSM_FOC_UserInit(void) {
 	_gFOC_Ctrl.userLim.s_PhaseCurrLim = nv_get_foc_params()->s_PhaseCurrLim;
 	_gFOC_Ctrl.userLim.s_vDCMaxLim = nv_get_foc_params()->s_maxvDC;
 	_gFOC_Ctrl.userLim.s_vDCMinLim = _gFOC_Ctrl.userLim.s_vDCMaxLim / 3;
-	_gFOC_Ctrl.userLim.s_iDCeBrkLim = nv_get_foc_params()->s_maxBrkCurrent;
+	_gFOC_Ctrl.userLim.s_iDCeBrkLim = nv_get_foc_params()->s_iDCeBrkLim;
+	_gFOC_Ctrl.userLim.s_PhaseCurreBrkLim = nv_get_foc_params()->s_PhaseCurreBrkLim;
 	_gFOC_Ctrl.userLim.s_PhaseeVoleBrkLim = _gFOC_Ctrl.hwLim.s_PhaseVolMax - 20;
 }
 
@@ -511,11 +512,11 @@ float PMSM_FOC_GetTorqueLimit(void) {
 }
 
 void PMSM_FOC_SeteBrkPhaseCurrent(float curr) {
-	_gFOC_Ctrl.userLim.s_iDCeBrkLim = curr;
+	_gFOC_Ctrl.userLim.s_PhaseCurreBrkLim = curr;
 }
 
 float PMSM_FOC_GeteBrkPhaseCurrent(void) {
-	return _gFOC_Ctrl.userLim.s_iDCeBrkLim ;
+	return _gFOC_Ctrl.userLim.s_PhaseCurreBrkLim ;
 }
 
 void PMSM_FOC_VbusVoltage(float vbusVol) {

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

@@ -59,6 +59,7 @@ typedef struct {
 	float s_iDCLim;
 	float s_PhaseCurrLim; //最大相电流
 	float s_iDCeBrkLim; //最大母线回收电流
+	float s_PhaseCurreBrkLim;
 	float s_PhaseeVoleBrkLim;
 	float s_vDCMinLim;
 	float s_vDCMaxLim;

+ 20 - 8
Applications/foc/core/e_ctrl.c

@@ -9,6 +9,7 @@ e_Ctrl g_eCtrl;
 static void _eCtrl_set_TgtCurrent(float c);
 static void _eCtrl_set_TgtSpeed(float s);
 static void _eCtrl_set_TgtTorque(float t);
+static bool _eCtrl_isHwBrk_shutPower(void);
 
 void eCtrl_init(u16 accl_time, u16 dec_time){
 	g_eCtrl.dec_time = dec_time;
@@ -46,12 +47,17 @@ void eCtrl_set_TgtSpeed(float s) {
 	g_eCtrl.speed_shadow = s;
 }
 
-void eCtrl_enable_eBrake(bool enable) {
+bool eCtrl_enable_eBrake(bool enable) {
+	if (PMSM_FOC_GeteBrkPhaseCurrent() == 0.0f) {
+		g_eCtrl.is_ebrake_shadow = false;
+		return g_eCtrl.is_ebrake_shadow;
+	}
 	if (enable && PMSM_FOC_GetSpeed() > MIN_RPM_FOR_EBRAKE) {
 		g_eCtrl.is_ebrake_shadow = true;
-	}else if (!enable){
+	}else if (!enable && !_eCtrl_isHwBrk_shutPower()){
 		g_eCtrl.is_ebrake_shadow = false;
 	}
+	return g_eCtrl.is_ebrake_shadow;
 }
 
 void _eCtrl_clear_ramp(void) {
@@ -73,6 +79,9 @@ void _eCtrl_process_eBrake(void) {
 	}
 }
 
+bool eCtrl_is_eBrk_enabled(void) {
+	return (g_eCtrl.is_ebrake || g_eCtrl.is_ebrake_shadow);
+}
 
 void eCtrl_Running(void) {
 	bool etime_changed = false;
@@ -99,6 +108,10 @@ void eCtrl_Running(void) {
 	eRamp_running(&g_eCtrl.torque);
 }
 
+static bool _eCtrl_isHwBrk_shutPower(void) {
+	return (g_eCtrl.hw_brake && nv_get_foc_params()->n_brkShutPower);
+}
+
 static void _eCtrl_set_target(e_Ramp *ramp, float c) {
 	float c_now = eRamp_get_intepolation(ramp);
 	float step_val = 0;
@@ -168,14 +181,13 @@ void eCtrl_brake_signal(bool hw_brake) {
 	if (hw_brake != g_eCtrl.hw_brake) {
 		g_eCtrl.hw_brake = hw_brake;
 		if (hw_brake) {
-			g_eCtrl.brake_ts = shark_get_mseconds();
+			g_eCtrl.brake_ts = get_tick_ms();
 		}
 	}
-	if (g_eCtrl.hw_brake && nv_get_foc_params()->n_brkShutPower) {
-		eRamp_init(&g_eCtrl.speed);
-		eRamp_init(&g_eCtrl.torque);
-		g_eCtrl.torque_shadow = 0.0f;
-		g_eCtrl.speed_shadow = 0.0f;
+	if (_eCtrl_isHwBrk_shutPower()) {
+		if (!eCtrl_is_eBrk_enabled() && !eCtrl_enable_eBrake(true)) {
+			_eCtrl_clear_ramp();
+		}
 	}
 	cpu_exit_critical(mask);
 }

+ 3 - 2
Applications/foc/core/e_ctrl.h

@@ -16,7 +16,7 @@ typedef struct {
 	u16  dec_time;  //降速时间
 	bool hw_brake;
 	bool is_ebrake;
-	u64  brake_ts;//检测到刹车开始时间
+	u32  brake_ts;//检测到刹车开始时间
 	e_Ramp current;
 	e_Ramp torque;
 	e_Ramp speed;
@@ -67,10 +67,11 @@ static float eRamp_get_target(e_Ramp *r) {
 void eCtrl_init(u16 accl_time, u16 dec_time);
 void eCtrl_set_ebrk_time(u16 ebrk_time);
 void eCtrl_brake_signal(bool hw_brake);
+bool eCtrl_is_eBrk_enabled(void);
 void eCtrl_set_TgtCurrent(float c);
 void eCtrl_set_TgtTorque(float t);
 void eCtrl_set_TgtSpeed(float s);
-void eCtrl_enable_eBrake(bool enable);
+bool eCtrl_enable_eBrake(bool enable);
 float eCtrl_get_RefSpeed(void);
 float eCtrl_get_RefCurrent(void);
 float eCtrl_get_RefTorque(void);

+ 1 - 0
Applications/foc/core/torque.c

@@ -54,6 +54,7 @@ void torque_speed_target(u8 run_mode, float f_throttle) {
 	}else if (run_mode == CTRL_MODE_TRQ) {
 		if (mc_throttle_released()) {
 			eCtrl_enable_eBrake(true);
+			PMSM_FOC_Set_Torque(0);
 		}else {
 			float torque = torque_target_from_throttle(f_throttle);
 			eCtrl_enable_eBrake(false);