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

支持通过命令设置转速

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

+ 2 - 2
Applications/app/key_process.c

@@ -24,7 +24,7 @@ static u32 key_task(void *p) {
 			foc_cmd.cmd = Foc_Start_Motor;
 			if (PMSM_FOC_Is_Start()) {
 				PMSM_FOC_Set_Torque(foc_current);
-				PMSM_FOC_Set_Speed(0.0f);
+				PMSM_FOC_Set_TgtSpeed(0.0f);
 			}else {
 				cmd_data[0] = Foc_Start;
 				foc_send_command(&foc_cmd);
@@ -55,7 +55,7 @@ static u32 key_task(void *p) {
 				//PMSM_FOC_EnableCruise(false);
 				PMSM_FOC_SpeedLimit(10000);
 				target_speed += 1000;
-				PMSM_FOC_Set_Speed(target_speed);
+				PMSM_FOC_Set_TgtSpeed(target_speed);
 				
 			}else {
 				//ctrl_mode = CTRL_MODE_TRQ;

+ 8 - 0
Applications/foc/commands.c

@@ -669,6 +669,14 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			}
 			break;
 		}
+		case Foc_Set_Speed_Target:
+		{
+			if (command->len == 2) {
+				s16 tgt_speed = decode_s16((u8 *)command->data);
+				mc_set_target_vel(tgt_speed);
+			}
+			break;
+		}
 		default:
 		{
 			erroCode = FOC_Unknow_Cmd;

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

@@ -1277,7 +1277,7 @@ bool PMSM_FOC_Is_CruiseEnabled(void) {
 	return (gFoc_Ctrl.in.b_cruiseEna && (gFoc_Ctrl.out.n_RunMode == CTRL_MODE_SPD));
 }
 
-bool PMSM_FOC_Set_Speed(float rpm) {
+bool PMSM_FOC_Set_TgtSpeed(float rpm) {
 	if (gFoc_Ctrl.in.b_cruiseEna) {
 		return false;
 	}

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

@@ -267,7 +267,7 @@ u8 PMSM_FOC_GetCtrlMode(void);
 void PMSM_FOC_SetOpenVdq(float vd, float vq);
 void PMSM_FOC_SetOpenVdq_Immediate(float vd, float vq);
 bool PMSM_FOC_EnableCruise(bool enable);
-bool PMSM_FOC_Set_Speed(float rpm);
+bool PMSM_FOC_Set_TgtSpeed(float rpm);
 bool PMSM_FOC_Set_Torque(float trque);
 bool PMSM_FOC_Set_Current(float current);
 bool PMSM_FOC_Set_CruiseSpeed(float rpm);

+ 1 - 1
Applications/foc/core/thro_torque.c

@@ -246,7 +246,7 @@ void thro_torque_process(u8 run_mode, float f_throttle) {
 	}else if (run_mode == CTRL_MODE_SPD) {
 		if (!mc_is_cruise_enabled()) {
 			float speed_Ref = PMSM_FOC_GetSpeedLimit() * _torque.thro_ration;
-			PMSM_FOC_Set_Speed(speed_Ref);
+			PMSM_FOC_Set_TgtSpeed(speed_Ref);
 		}
 	}else if (run_mode == CTRL_MODE_EBRAKE) {
 		float vel = PMSM_FOC_GetSpeed();

+ 1 - 1
Applications/foc/core/torque_unused.c

@@ -149,7 +149,7 @@ void request_torque(float thro_ration) {
 void request_speed(float thro_ration) {
 	if (!mc_is_cruise_enabled()) {
 		float speed_Ref = PMSM_FOC_GetSpeedLimit() * thro_ration;
-		PMSM_FOC_Set_Speed(speed_Ref);
+		PMSM_FOC_Set_TgtSpeed(speed_Ref);
 	}
 }
 

+ 25 - 6
Applications/foc/motor/motor.c

@@ -46,6 +46,7 @@ static m_contrl_t motor = {
 	.mos_lim = 0,
 	.motor_lim = 0,
 	.b_ind_start = false,
+	.s_target_speed = MAX_S16,
 	.u_set.idc_lim = IDC_USER_LIMIT_NONE,
 	.u_set.ebrk_lvl = 0,
 	.u_set.n_brkShutPower = CONFIG_Settings_BrkShutPower,
@@ -482,6 +483,14 @@ bool mc_enable_cruise(bool enable) {
 	return false;
 }
 
+bool mc_set_target_vel(s16 vel) {
+	if (motor.mode != CTRL_MODE_SPD || mc_is_epm()) {
+		return false;
+	}
+	motor.s_target_speed = vel;
+	return true;
+}
+
 bool mc_is_cruise_enabled(void) {
 	return motor.b_cruise;
 }
@@ -656,7 +665,7 @@ bool mc_start_epm_move(EPM_Dir_t dir, bool is_command) {
 #endif
 		}
 		PMSM_FOC_TorqueLimit(motor.f_epm_trq);
-		PMSM_FOC_Set_Speed(motor.f_epm_vel);
+		PMSM_FOC_Set_TgtSpeed(motor.f_epm_vel);
 	}else {
 		motor.b_epm_cmd_move = false;
 #ifdef CONFIG_SPEED_LADRC
@@ -664,7 +673,7 @@ bool mc_start_epm_move(EPM_Dir_t dir, bool is_command) {
 #else
 		PMSM_FOC_Change_VelLoop_Params(mc_conf()->c.pid[PID_Vel_ID].kp, mc_conf()->c.pid[PID_Vel_ID].ki);
 #endif
-		PMSM_FOC_Set_Speed(0);
+		PMSM_FOC_Set_TgtSpeed(0);
 	}
 	cpu_exit_critical(mask);
 	return true;
@@ -1332,7 +1341,7 @@ static void mc_process_epm_move(void) {
 	step_towards(&motor.f_epm_vel, target_vel, step);
 	motor.f_epm_trq = target_trq;
 	PMSM_FOC_TorqueLimit(motor.f_epm_trq);
-	PMSM_FOC_Set_Speed(motor.f_epm_vel);
+	PMSM_FOC_Set_TgtSpeed(motor.f_epm_vel);
 }
 
 static bool mc_process_force_running(void) {
@@ -1406,6 +1415,9 @@ static bool mc_can_stop_foc(void) {
 	if (motor.mode == CTRL_MODE_CURRENT) {
 		return false;
 	}
+	if (motor.mode == CTRL_MODE_SPD && motor.s_target_speed != MAX_S16) {
+		return false;
+	}
 	if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
 		if (!PMSM_FOC_AutoHoldding() && motor.epm_dir == EPM_Dir_None) {
 			return true;
@@ -1423,6 +1435,9 @@ static bool mc_can_restart_foc(void) {
 	if (!foc_observer_is_encoder() && !foc_observer_sensorless_stable()){
 		can_start = false;
 	}
+	if (motor.mode == CTRL_MODE_SPD && motor.s_target_speed != MAX_S16) {
+		can_start = true;
+	}
 	return can_start;
 }
 
@@ -1536,9 +1551,13 @@ void Sched_MC_mTask(void) {
 		}
 		if (runMode != CTRL_MODE_OPEN) {
 			eCtrl_Running();
-			if ((runMode == CTRL_MODE_SPD) && mc_is_epm()) {
-				mc_process_throttle_epm();
-				mc_process_epm_move();
+			if (runMode == CTRL_MODE_SPD) {
+				if (mc_is_epm()) {
+					mc_process_throttle_epm();
+					mc_process_epm_move();
+				}else if (motor.s_target_speed != MAX_S16) {
+					PMSM_FOC_Set_TgtSpeed(motor.s_target_speed);
+				}
 			}else {
 				float thro = throttle_get_signal();
 				if (motor.b_ignor_throttle) {

+ 2 - 0
Applications/foc/motor/motor.h

@@ -58,6 +58,7 @@ typedef struct {
 	u8     mos_lim;
 	u8     motor_lim;
 	s16    s_vbus_hw_min;
+	s16    s_target_speed;
 	user_rt_set u_set; //用户运行时设置
 	fan_t  fan[2];
 }m_contrl_t;
@@ -110,6 +111,7 @@ void mc_start_current_rec(bool rec);
 bool mc_ind_motor_start(bool start);
 void mc_enable_brkshutpower(u8 shut);
 void mc_enable_tcs(bool enable);
+bool mc_set_target_vel(s16 vel);
 
 static __INLINE float motor_encoder_get_angle(void) {
 #ifdef USE_ENCODER_HALL