Quellcode durchsuchen

1. 解决打齿和加速响应之间的平衡,主要修改 crosszero_step_towards 函数
2. 零速起步和正常加速的ramp时间做一个渐进变化

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui vor 3 Jahren
Ursprung
Commit
8a2305aabe

+ 2 - 2
Applications/app/app.c

@@ -147,7 +147,7 @@ static u32 _app_report_task(void *p) {
 	}
 	return 200;
 }
-int plot_type = 10;
+int plot_type = 0;
 static void plot_smo_angle(void) {
 	float smo_angle = foc_observer_sensorless_angle();
 	float delta = smo_angle - PMSM_FOC_Get()->in.s_motAngle;
@@ -161,7 +161,7 @@ static u32 _app_plot_task(void * args) {
 		//can_plot2((s16)foc_observer_sensorless_speed(), (s16)PMSM_FOC_GetSpeed());
 		can_plot3((s16)PMSM_FOC_GetSpeed() + 1000, (s16)PMSM_FOC_GetSpeed(), (s16)PMSM_FOC_GetSpeed() - 1000);
 	}else if (plot_type == 2) {
-		can_plot2(eCtrl_get_RefTorque(), eCtrl_get_FinalTorque());
+		can_plot2(eCtrl_get_FinalTorque(), PMSM_FOC_Get()->in.s_targetTorque);
 	}else if (plot_type == 3) {
 		plot_smo_angle();
 	}else if (plot_type == 4) {

+ 19 - 7
Applications/foc/core/PMSM_FOC_Core.c

@@ -572,27 +572,39 @@ u8 PMSM_FOC_CtrlMode(void) {
 	return gFoc_Ctrl.out.n_RunMode;
 }
 
+#define RAMPE_1 CONFIG_RAMP_FIRST_TARGET
 static void crosszero_step_towards(float *value, float target) {
 	float v_now = *value;
 	bool cross_zero = false;
+	float high_ramp_torque = CONFIG_RAMP_SECOND_TARGET;
 	if (target > 0) {
-		if (v_now >= -CONFIG_RAMP_SECOND_TARGET && v_now <= CONFIG_RAMP_SECOND_TARGET*1.5f) {
-			step_towards(value, target, 0.02f);
+		if (v_now <= -RAMPE_1) {
+			step_towards(value, -RAMPE_1, 2.0f);
+			cross_zero = true;
+		}else if (v_now >= -RAMPE_1 && v_now <= high_ramp_torque) {
+			step_towards(value, target, 0.03f);
 			cross_zero = true;
 		}
 	}else if (target == 0) {
-		if (v_now >= 0 && v_now <= CONFIG_RAMP_SECOND_TARGET) {
-			step_towards(value, target, 0.02f);
+		if (v_now > high_ramp_torque) {
+			step_towards(value, high_ramp_torque, 1.0f);
+			cross_zero = true;
+		}else if (v_now >= RAMPE_1 && v_now <= high_ramp_torque) {
+			step_towards(value, target, 0.03f);
 			cross_zero = true;
 		}
 	}else {
-		if (v_now >= -CONFIG_RAMP_SECOND_TARGET && v_now <= CONFIG_RAMP_SECOND_TARGET*1.5f) {
-			step_towards(value, target, 0.02f);
+		if (v_now > high_ramp_torque) {
+			step_towards(value, high_ramp_torque, 20.0f);
+			cross_zero = true;
+		}else if (v_now >= -RAMPE_1 && v_now <= high_ramp_torque) {
+			step_towards(value, target, 0.03f);
 			cross_zero = true;
 		}
 	}
 	if (!cross_zero) {
-		*value = target;
+		//*value = target;
+		step_towards(value, target, 2.0f);
 	}
 }
 

+ 5 - 0
Applications/foc/core/e_ctrl.h

@@ -222,6 +222,11 @@ static void eRamp_set_X2_target(e_Ramp *r, float c) {
 }
 
 #endif
+extern e_Ctrl g_eCtrl;
+static u16 eCtrl_get_torque_acc_time(void) {
+	return (u16)g_eCtrl.torque.acct;
+}
+
 //y=Ax^2;
 void eCtrl_init(u16 accl_time, u16 dec_time);
 void eCtrl_brake_signal(bool hw_brake);

+ 36 - 10
Applications/foc/core/thro_torque.c

@@ -112,31 +112,54 @@ static void thro_torque_request(void) {
 		return;
 	}
 	if (!mc_throttle_released()) {
+		float curr_rpm = PMSM_FOC_GetSpeed();
 		if (_torque.accl) { //加速需求
 			float ref_torque = thro_torque_for_accelerate();
 			float hold_torque = PMSM_FOC_Get()->out.f_autohold_trq;
-			float curr_rpm = PMSM_FOC_GetSpeed();
 			if (hold_torque < 0) { //下坡驻车,最小给0扭矩
 				hold_torque = 0;
 			}
+			ref_torque	= MAX(hold_torque, ref_torque);
 			if (curr_rpm <= CONFIG_ZERO_SPEED_RPM) {//从静止开始加速
-				ref_torque	= MAX(hold_torque, ref_torque);
-				if (hold_torque != 0) {
+				if (_torque.torque_req < hold_torque) {
 					_torque.torque_req = hold_torque;
-					PMSM_FOC_Get()->out.f_autohold_trq = 0;
+					eCtrl_reset_Torque(hold_torque);
 				}
+			}else {
+				PMSM_FOC_Get()->out.f_autohold_trq = 0;
 			}
+			/* 处理加速ramp时间的变化,需要缓慢变小,变大可以立即处理,
+			*  加速时间缓慢变小可以防止突然大扭矩加速
+			*/
+			u16 now_ramp_time = eCtrl_get_torque_acc_time();
+			u16 next_ramp_time = mc_get_gear_config()->n_accl_time;
 			if (curr_rpm < CONFIG_ZERO_SPEED_RAMP_RMP) {
-				u16 start_time = mc_get_gear_config()->n_zero_accl;
-				if (start_time == 0) {
-					start_time = 100;
+				next_ramp_time = mc_get_gear_config()->n_zero_accl;
+			}
+			if (next_ramp_time == 0) {
+				next_ramp_time = 100;
+			}
+			if (now_ramp_time != next_ramp_time) {
+				if (next_ramp_time > now_ramp_time) {
+					eCtrl_set_accl_time(next_ramp_time);
+				}else {
+					float f_now = (float)now_ramp_time;
+					float f_next = (float)next_ramp_time;
+					step_towards(&f_now, f_next, 0.5f);
+					if (f_now <= 10) {
+						f_now = 10;
+					}
+					eCtrl_set_accl_time((u16)f_now);
 				}
-				step_towards(&_torque.torque_req, ref_torque, ref_torque/(float)start_time);
-			}else {
-				_torque.torque_req = ref_torque;
 			}
+			_torque.torque_req = ref_torque;
 		}else {
 			float ref_torque = thro_torque_for_decelerate();
+			/* autohold 启动的情况下,转把在0位置附近小幅抖动 */
+			if (curr_rpm <= CONFIG_ZERO_SPEED_RPM) {
+				float hold_torque = PMSM_FOC_Get()->out.f_autohold_trq;
+				ref_torque = MAX(hold_torque, ref_torque);
+			}
 			_torque.torque_req = ref_torque;
 		}
 		PMSM_FOC_Set_Torque(_torque.torque_req);
@@ -172,6 +195,9 @@ void thro_torque_process(u8 run_mode, float f_throttle) {
 		if (!_torque.accl) {
 			_torque.thro_ration_last = _torque.thro_ration;
 			_torque.torque_real = PMSM_FOC_Get()->in.s_targetTorque;
+			if (_torque.torque_real < 0) { //电子刹车的时候,扭矩可能为负
+				_torque.torque_real = 0;
+			}
 		}
 		_torque.gear = n_gear;
 		_torque.accl = true;

+ 6 - 4
Applications/foc/foc_config.h

@@ -32,12 +32,12 @@
 #define CONFIG_FOC_VDQ_RAMP_TS 100
 #define CONFIG_FOC_VDQ_RAMP_FINAL_TIME 1000
 #define CONFIG_ZERO_SPEED_RPM  10
-#define CONFIG_ZERO_SPEED_RAMP_RMP 100 //从0速启动到结束的速度
+#define CONFIG_ZERO_SPEED_RAMP_RMP 60 //从0速启动到结束的速度
 /* 电子刹车,动能回收,加速 */
 #define CONFIG_eCTRL_STEP_TS CONFIG_SPD_CTRL_MS     /* 斜率给定的step的时间值,单位 ms */
 #define CONFIG_eCTRL_Brake_TIME 1500     /* 捏住刹车的时间,超过这个时间启动ebrake,单位 ms */
-#define CONFIG_ACC_TIME 50
-#define CONFIG_DEC_TIME 50
+#define CONFIG_ACC_TIME 200
+#define CONFIG_DEC_TIME 10
 #define CONFIG_EBRK_RAMP_TIME 500
 #define CONFIG_AUTOHOLD_DETECT_TIME 3000
 
@@ -48,7 +48,9 @@
 #define CONFIG_MTPA_CALI_RAMP_TIME (10 * 1000)
 
 #define CONFIG_RAMP_SECOND_STEP (0.1F)
-#define CONFIG_RAMP_SECOND_TARGET (5.0F)
+
+#define CONFIG_RAMP_FIRST_TARGET (1.0F)
+#define CONFIG_RAMP_SECOND_TARGET (5.0F * 1.5F)
 
 #define CONFIG_RAMP_CROSS_ZERO_STEP (0.1F)
 

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

@@ -177,7 +177,7 @@ static void mc_gear_vmode_changed(void) {
 	PMSM_FOC_SpeedLimit(gears->n_max_speed);
 	PMSM_FOC_DCCurrLimit(min(gears->n_max_idc, motor.idc_user_lim));
 	PMSM_FOC_TorqueLimit(gears->n_max_trq);
-	eCtrl_set_accl_time((u16)gears->n_accl_time);
+	//eCtrl_set_accl_time((u16)gears->n_accl_time); 放到转把处理的地方设置
 }
 
 static s16 mc_get_gear_idc_limit(void) {
@@ -198,7 +198,7 @@ void mc_init(void) {
 	thro_torque_init();
 	mc_detect_vbus_mode();
 	PMSM_FOC_CoreInit();
-	eCtrl_init(mc_get_gear_config()->n_accl_time, nv_get_foc_params()->n_dec_time);
+	eCtrl_init(mc_get_gear_config()->n_zero_accl, nv_get_foc_params()->n_dec_time);
 	mc_gpio_init();
 	MC_Check_MosVbusThrottle();
 	sched_timer_enable(CONFIG_SPD_CTRL_US);
@@ -287,7 +287,7 @@ bool mc_start(u8 mode) {
 
 	thro_torque_reset();
 	mc_gear_vmode_changed();
-	eCtrl_init(mc_get_gear_config()->n_accl_time, nv_get_foc_params()->n_dec_time);
+	eCtrl_init(mc_get_gear_config()->n_zero_accl, nv_get_foc_params()->n_dec_time);
 	motor_encoder_start(true);
 	PMSM_FOC_Start(mode);
 	PMSM_FOC_RT_LimInit();