Просмотр исходного кода

update mc100

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 лет назад
Родитель
Сommit
d8e2382515

+ 3 - 0
Applications/app/nv_storage.c

@@ -54,6 +54,9 @@ static void nv_default_foc_params(void) {
 	foc_params.n_minThroVol = CONFIG_THROTTLE_LOW_VALUE;
 	foc_params.n_minThroVol = CONFIG_THROTTLE_LOW_VALUE;
 	foc_params.n_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
 	foc_params.n_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
 	foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
 	foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
+	foc_params.n_acc_time = CONFIG_ACC_TIME;
+	foc_params.n_dec_time = CONFIG_DEC_TIME;
+	foc_params.n_ebrk_time = CONFIG_EBRK_RAMP_TIME;
 	
 	
 	foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld);
 	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].ki = (MOTOR_R/MOTOR_Ld);

+ 3 - 0
Applications/app/nv_storage.h

@@ -21,6 +21,9 @@ typedef struct {
 	float n_maxThroVol;
 	float n_maxThroVol;
 	u8    n_brkShutPower;
 	u8    n_brkShutPower;
 	u8    n_autoHold;
 	u8    n_autoHold;
+	u32   n_acc_time;
+	u32   n_dec_time;
+	u32   n_ebrk_time;
 	pid_conf_t pid_conf[PID_Max_id];
 	pid_conf_t pid_conf[PID_Max_id];
 	u16   crc16;
 	u16   crc16;
 }foc_params_t;
 }foc_params_t;

+ 14 - 2
Applications/foc/commands.c

@@ -15,6 +15,9 @@
 extern float target_d;
 extern float target_d;
 extern float target_q;
 extern float target_q;
 #endif
 #endif
+static void _reboot_timer_handler(shark_timer_t *);
+static shark_timer_t _reboot_timer = TIMER_INIT(_reboot_timer, _reboot_timer_handler);
+
 static u32 foc_command_task(void *args);
 static u32 foc_command_task(void *args);
 static void process_foc_command(foc_cmd_body_t *command);
 static void process_foc_command(foc_cmd_body_t *command);
 
 
@@ -339,7 +342,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		{
 		{
 			if (mc_is_start()) {
 			if (mc_is_start()) {
 				erroCode = FOC_NotAllowed;
 				erroCode = FOC_NotAllowed;
-			}else if (command->len < 19) {
+			}else if (command->len < 32) {
 				erroCode = FOC_Param_Err;
 				erroCode = FOC_Param_Err;
 			}else {
 			}else {
 				nv_get_foc_params()->s_PhaseCurrLim = decode_s16((u8 *)command->data);
 				nv_get_foc_params()->s_PhaseCurrLim = decode_s16((u8 *)command->data);
@@ -351,8 +354,13 @@ static void process_foc_command(foc_cmd_body_t *command) {
 				nv_get_foc_params()->n_maxThroVol = (float)decode_s16((u8 *)command->data + 12)/100.0f;
 				nv_get_foc_params()->n_maxThroVol = (float)decode_s16((u8 *)command->data + 12)/100.0f;
 				nv_get_foc_params()->s_maxEpmRPM = decode_s16((u8 *)command->data + 14);
 				nv_get_foc_params()->s_maxEpmRPM = decode_s16((u8 *)command->data + 14);
 				nv_get_foc_params()->s_maxEpmPhaseCurrLim = decode_s16((u8 *)command->data + 16);
 				nv_get_foc_params()->s_maxEpmPhaseCurrLim = decode_s16((u8 *)command->data + 16);
-				nv_get_foc_params()->n_brkShutPower = decode_s16((u8 *)command->data + 18);
+				nv_get_foc_params()->n_brkShutPower = decode_u8((u8 *)command->data + 18);
+				nv_get_foc_params()->n_autoHold = decode_u8((u8 *)command->data + 19);
+				nv_get_foc_params()->n_acc_time = decode_u32((u8 *)command->data + 20);
+				nv_get_foc_params()->n_dec_time = decode_u32((u8 *)command->data + 24);
+				nv_get_foc_params()->n_ebrk_time = decode_u32((u8 *)command->data + 28);
 				nv_save_foc_params();
 				nv_save_foc_params();
+				shark_timer_post(&_reboot_timer, 200);
 			}
 			}
 			break;
 			break;
 		}
 		}
@@ -374,3 +382,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 }
 }
 
 
 
 
+static void _reboot_timer_handler(shark_timer_t *t) {
+	system_reboot();
+}
+

+ 2 - 5
Applications/foc/core/PMSM_FOC_Core.c

@@ -497,10 +497,6 @@ void PMSM_FOC_idqCalc(void) {
 			gFoc_Ctrl.pi_torque->min = refTorque;
 			gFoc_Ctrl.pi_torque->min = refTorque;
 			gFoc_Ctrl.pi_torque->max = gFoc_Ctrl.userLim.s_PhaseCurreBrkLim;
 			gFoc_Ctrl.pi_torque->max = gFoc_Ctrl.userLim.s_PhaseCurreBrkLim;
 		}
 		}
-		if ((eCtrl_get_FinalTorque() == 0) && (gFoc_Ctrl.in.s_motRPM < CONFIG_MIN_RPM_EXIT_EBRAKE)) {
-			gFoc_Ctrl.pi_torque->max = 0;
-			gFoc_Ctrl.pi_torque->min = 0; //防止倒转
-		}
 		float errRef = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
 		float errRef = eRamp_get_intepolation(&gFoc_Ctrl.rtLim.rpmLimRamp) - gFoc_Ctrl.in.s_motRPM;
 		float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_torque, errRef);
 		float maxTrq = PI_Controller_RunSat(gFoc_Ctrl.pi_torque, errRef);
 		gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_iDC(maxTrq);
 		gFoc_Ctrl.in.s_targetTorque = PMSM_FOC_Limit_iDC(maxTrq);
@@ -795,6 +791,7 @@ void PMSM_FOC_MTPA_Calibrate(bool enable) {
 	if (enable) {
 	if (enable) {
 		gFoc_Ctrl.in.b_MTPA_calibrate = true;
 		gFoc_Ctrl.in.b_MTPA_calibrate = true;
 		gFoc_Ctrl.in.s_manualAngle = 0;
 		gFoc_Ctrl.in.s_manualAngle = 0;
+		eCtrl_set_ebrk_time(CONFIG_MTPA_CALI_RAMP_TIME);
 	}else {
 	}else {
 		gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
 		gFoc_Ctrl.in.s_manualAngle = INVALID_ANGLE;
 		gFoc_Ctrl.in.b_MTPA_calibrate = false;
 		gFoc_Ctrl.in.b_MTPA_calibrate = false;
@@ -913,7 +910,7 @@ float PMSM_FOC_Calc_iDC(void) {
 		iDC x vDC = 2/3(iq x vq + id x vd);
 		iDC x vDC = 2/3(iq x vq + id x vd);
 	*/
 	*/
 	float m_pow = (vd * id + vq * iq); //s32q10
 	float m_pow = (vd * id + vq * iq); //s32q10
-	float raw_idc = m_pow / gFoc_Ctrl.in.s_vDC;// * 1.5f * 0.66f; //s16q5
+	float raw_idc = m_pow / get_vbus_float() * 0.82f;// * 1.5f * 0.66f; //s16q5
 	LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.01f);
 	LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.01f);
 	return gFoc_Ctrl.out.s_FilteriDC;
 	return gFoc_Ctrl.out.s_FilteriDC;
 }
 }

+ 16 - 13
Applications/foc/core/e_ctrl.c

@@ -15,25 +15,25 @@ void eCtrl_init(u16 accl_time, u16 dec_time){
 	g_eCtrl.dec_time = dec_time;
 	g_eCtrl.dec_time = dec_time;
 	g_eCtrl.accl_time = accl_time;
 	g_eCtrl.accl_time = accl_time;
 	if (g_eCtrl.accl_time == 0) {
 	if (g_eCtrl.accl_time == 0) {
-		g_eCtrl.accl_time = CONFIG_DEFAULT_D_TIME;
+		g_eCtrl.accl_time = nv_get_foc_params()->n_acc_time;
 	}
 	}
 	if (g_eCtrl.dec_time == 0) {
 	if (g_eCtrl.dec_time == 0) {
-		g_eCtrl.dec_time = CONFIG_DEFAULT_D_TIME;
+		g_eCtrl.dec_time = nv_get_foc_params()->n_dec_time;
 	}
 	}
-	g_eCtrl.ebrk_time = CONFIG_EBRK_RAMP_TIME;
+	g_eCtrl.ebrk_time = nv_get_foc_params()->n_ebrk_time;
 	
 	
-	g_eCtrl.ebrk_shadow = g_eCtrl.ebrk_time;
-	g_eCtrl.accl_shadow = g_eCtrl.accl_time;
-	g_eCtrl.dec_shadow = g_eCtrl.dec_time;
+	g_eCtrl.ebrk_time_shadow = g_eCtrl.ebrk_time;
+	g_eCtrl.accl_time_shadow = g_eCtrl.accl_time;
+	g_eCtrl.dec_time_shadow = g_eCtrl.dec_time;
 	g_eCtrl.hw_brake = false;
 	g_eCtrl.hw_brake = false;
 	g_eCtrl.is_ebrake_shadow = g_eCtrl.is_ebrake = false;
 	g_eCtrl.is_ebrake_shadow = g_eCtrl.is_ebrake = false;
-	eRamp_init(&g_eCtrl.current, g_eCtrl.accl_time, g_eCtrl.dec_time);
+	eRamp_init(&g_eCtrl.current, g_eCtrl.ebrk_time, g_eCtrl.ebrk_time);
 	eRamp_init(&g_eCtrl.speed, g_eCtrl.accl_time, g_eCtrl.dec_time);
 	eRamp_init(&g_eCtrl.speed, g_eCtrl.accl_time, g_eCtrl.dec_time);
 	eRamp_init(&g_eCtrl.torque, g_eCtrl.accl_time, g_eCtrl.dec_time);
 	eRamp_init(&g_eCtrl.torque, g_eCtrl.accl_time, g_eCtrl.dec_time);
 }
 }
 
 
 void eCtrl_set_ebrk_time(u16 ebrk_time) {
 void eCtrl_set_ebrk_time(u16 ebrk_time) {
-	g_eCtrl.ebrk_shadow = ebrk_time;
+	g_eCtrl.ebrk_time_shadow = ebrk_time;
 }
 }
 
 
 
 
@@ -63,7 +63,7 @@ bool eCtrl_enable_eBrake(bool enable) {
 }
 }
 
 
 void _eCtrl_clear_ramp(void) {
 void _eCtrl_clear_ramp(void) {
-	eRamp_init(&g_eCtrl.current, CONFIG_EBRK_RAMP_TIME, CONFIG_EBRK_RAMP_TIME);
+	eRamp_init(&g_eCtrl.current, nv_get_foc_params()->n_ebrk_time, nv_get_foc_params()->n_ebrk_time);
 	eRamp_init(&g_eCtrl.speed, g_eCtrl.accl_time, g_eCtrl.dec_time);
 	eRamp_init(&g_eCtrl.speed, g_eCtrl.accl_time, g_eCtrl.dec_time);
 	eRamp_init(&g_eCtrl.torque, g_eCtrl.accl_time, g_eCtrl.dec_time);
 	eRamp_init(&g_eCtrl.torque, g_eCtrl.accl_time, g_eCtrl.dec_time);
 	g_eCtrl.current_shadow = 0.0f;
 	g_eCtrl.current_shadow = 0.0f;
@@ -87,14 +87,17 @@ bool eCtrl_is_eBrk_enabled(void) {
 
 
 void eCtrl_Running(void) {
 void eCtrl_Running(void) {
 	bool etime_changed = false;
 	bool etime_changed = false;
-	if (g_eCtrl.accl_shadow != g_eCtrl.accl_time || g_eCtrl.dec_shadow != g_eCtrl.dec_time) {
-		g_eCtrl.dec_time = g_eCtrl.dec_shadow;
-		g_eCtrl.accl_time = g_eCtrl.accl_shadow;
-		eRamp_set_time(&g_eCtrl.current, g_eCtrl.accl_time, g_eCtrl.dec_time);
+	if (g_eCtrl.accl_time_shadow != g_eCtrl.accl_time || g_eCtrl.dec_time_shadow != g_eCtrl.dec_time) {
+		g_eCtrl.dec_time = g_eCtrl.dec_time_shadow;
+		g_eCtrl.accl_time = g_eCtrl.accl_time_shadow;
 		eRamp_set_time(&g_eCtrl.speed, g_eCtrl.accl_time, g_eCtrl.dec_time);
 		eRamp_set_time(&g_eCtrl.speed, g_eCtrl.accl_time, g_eCtrl.dec_time);
 		eRamp_set_time(&g_eCtrl.torque, g_eCtrl.accl_time, g_eCtrl.dec_time);
 		eRamp_set_time(&g_eCtrl.torque, g_eCtrl.accl_time, g_eCtrl.dec_time);
 		etime_changed = true;
 		etime_changed = true;
 	}
 	}
+	if (g_eCtrl.ebrk_time_shadow != g_eCtrl.ebrk_time) {
+		g_eCtrl.ebrk_time = g_eCtrl.ebrk_time_shadow;
+		eRamp_set_time(&g_eCtrl.current, g_eCtrl.ebrk_time, g_eCtrl.ebrk_time);
+	}
 	if (g_eCtrl.current_shadow != g_eCtrl.current.target || etime_changed) {
 	if (g_eCtrl.current_shadow != g_eCtrl.current.target || etime_changed) {
 		_eCtrl_set_TgtCurrent(g_eCtrl.current_shadow);
 		_eCtrl_set_TgtCurrent(g_eCtrl.current_shadow);
 	}
 	}

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

@@ -26,9 +26,9 @@ typedef struct {
 	e_Ramp current;
 	e_Ramp current;
 	e_Ramp torque;
 	e_Ramp torque;
 	e_Ramp speed;
 	e_Ramp speed;
-	u16  ebrk_shadow;
-	u16  accl_shadow;
-	u16  dec_shadow;
+	u16  ebrk_time_shadow;
+	u16  accl_time_shadow;
+	u16  dec_time_shadow;
 	float ebrake_current;
 	float ebrake_current;
 	float current_shadow;
 	float current_shadow;
 	float torque_shadow;
 	float torque_shadow;

+ 2 - 1
Applications/foc/foc_config.h

@@ -32,7 +32,6 @@
 #define CONFIG_FOC_VDQ_RAMP_FINAL_TIME 3000
 #define CONFIG_FOC_VDQ_RAMP_FINAL_TIME 3000
 
 
 /* 电子刹车,动能回收,加速 */
 /* 电子刹车,动能回收,加速 */
-#define CONFIG_DEFAULT_D_TIME 3000       /* 默认的斜率给定时间,越大,越慢到给定值*/
 #define CONFIG_eCTRL_STEP_TS CONFIG_SPD_CTRL_MS     /* 斜率给定的step的时间值,单位 ms */
 #define CONFIG_eCTRL_STEP_TS CONFIG_SPD_CTRL_MS     /* 斜率给定的step的时间值,单位 ms */
 #define CONFIG_eCTRL_Brake_TIME 1500     /* 捏住刹车的时间,超过这个时间启动ebrake,单位 ms */
 #define CONFIG_eCTRL_Brake_TIME 1500     /* 捏住刹车的时间,超过这个时间启动ebrake,单位 ms */
 #define CONFIG_ACC_TIME 3000
 #define CONFIG_ACC_TIME 3000
@@ -42,6 +41,8 @@
 
 
 #define CONFIG_LIMIT_RAMP_TIME (10 * 1000)
 #define CONFIG_LIMIT_RAMP_TIME (10 * 1000)
 
 
+#define CONFIG_MTPA_CALI_RAMP_TIME (10 * 1000)
+
 #define CURRENT_LOOP_RAMP_COUNT 300
 #define CURRENT_LOOP_RAMP_COUNT 300
 
 
 #endif /* _FOC_CONFIG_H__ */
 #endif /* _FOC_CONFIG_H__ */

+ 5 - 2
Applications/foc/motor/motor.c

@@ -81,7 +81,7 @@ void mc_init(void) {
 	foc_command_init();
 	foc_command_init();
 	torque_init();
 	torque_init();
 	PMSM_FOC_CoreInit();
 	PMSM_FOC_CoreInit();
-	eCtrl_init(CONFIG_ACC_TIME, CONFIG_DEC_TIME);
+	eCtrl_init(nv_get_foc_params()->n_acc_time, nv_get_foc_params()->n_dec_time);
 	mc_brk_gpio_init();
 	mc_brk_gpio_init();
 	limter_set_under_voltage(nv_get_foc_params()->s_minDCVol);
 	limter_set_under_voltage(nv_get_foc_params()->s_minDCVol);
 	MC_Check_MosVbusThrottle();
 	MC_Check_MosVbusThrottle();
@@ -131,7 +131,7 @@ bool mc_start(u8 mode) {
 
 
 	_mc_internal_init(mode, true);
 	_mc_internal_init(mode, true);
 
 
-	eCtrl_init(CONFIG_ACC_TIME, CONFIG_DEC_TIME);
+	eCtrl_init(nv_get_foc_params()->n_acc_time, nv_get_foc_params()->n_dec_time);
 	motor_encoder_start(motor.s_direction);
 	motor_encoder_start(motor.s_direction);
 	PMSM_FOC_Start(mode);
 	PMSM_FOC_Start(mode);
 	PMSM_FOC_RT_LimInit();
 	PMSM_FOC_RT_LimInit();
@@ -611,6 +611,9 @@ static void _autohold_beep_timer_handler(shark_timer_t *t) {
 }
 }
 
 
 static void mc_autohold_process(void) {
 static void mc_autohold_process(void) {
+	if (nv_get_foc_params()->n_autoHold == 0) {
+		return;
+	}
 	if (PMSM_FOC_AutoHoldding() && !mc_throttle_released()) {
 	if (PMSM_FOC_AutoHoldding() && !mc_throttle_released()) {
 		mc_auto_hold(false);
 		mc_auto_hold(false);
 	}
 	}