فهرست منبع

加入速度限制的功能,每次开电门需要用户设置

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 2 سال پیش
والد
کامیت
1b7d9153cd
2فایلهای تغییر یافته به همراه15 افزوده شده و 15 حذف شده
  1. 12 15
      Applications/foc/motor/motor.c
  2. 3 0
      Applications/foc/motor/motor.h

+ 12 - 15
Applications/foc/motor/motor.c

@@ -48,6 +48,7 @@ static m_contrl_t motor = {
 	.b_ind_start = false,
 	.s_target_speed = MAX_S16,
 	.u_set.idc_lim = IDC_USER_LIMIT_NONE,
+	.u_set.rpm_lim = RPM_USER_LIMIT_NONE,
 	.u_set.ebrk_lvl = 0,
 	.u_set.n_brkShutPower = CONFIG_Settings_BrkShutPower,
 	.u_set.b_tcs = CONFIG_Settings_TcsEnable,
@@ -224,23 +225,12 @@ static void mc_gear_vmode_changed(void) {
 		eRamp_set_time(&(PMSM_FOC_Get()->rtLim.rpmLimRamp), CONFIG_SENSORLESS_RAMP_TIME, CONFIG_SENSORLESS_RAMP_TIME);
 		eRamp_set_time(&(PMSM_FOC_Get()->rtLim.DCCurrLimRamp), CONFIG_SENSORLESS_RAMP_TIME, CONFIG_SENSORLESS_RAMP_TIME);
 	}
-	PMSM_FOC_SpeedLimit((float)gears->max_speed);
+	PMSM_FOC_SpeedLimit((float)min(gears->max_speed, motor.u_set.rpm_lim));
 	PMSM_FOC_DCCurrLimit((float)min(gears->max_idc, motor.u_set.idc_lim));
 	PMSM_FOC_TorqueLimit((float)gears->max_torque);
 	sys_debug("change %d, %d, %d\n", gears->max_idc, gears->max_speed, gears->max_torque);
 }
 
-static s16 mc_get_gear_idc_limit(void) {
-	if (!foc_observer_is_encoder()) {
-		return sensorless_gear.max_idc;
-	}
-	if (motor.b_is96Mode) {
-		return mc_conf()->g_n[motor.n_gear].max_idc;
-	}else {
-		return mc_conf()->g_l[motor.n_gear].max_idc;
-	}
-}
-
 void mc_init(void) {
 	fan_pwm_init();
 	adc_init();
@@ -514,11 +504,18 @@ void mc_set_idc_limit(s16 limit) {
 		return;
 	}
 	motor.u_set.idc_lim = limit;
-	s16 g_limit = mc_get_gear_idc_limit();
-	limit = min(g_limit, limit);
-	PMSM_FOC_DCCurrLimit(limit);
+	mc_gear_vmode_changed();
 }
 
+void mc_set_rpm_limit(s16 limit) {
+	if ((limit == motor.u_set.rpm_lim) || (limit < 0)) {
+		return;
+	}
+	motor.u_set.rpm_lim = limit;
+	mc_gear_vmode_changed();
+}
+
+
 bool mc_set_ebrk_level(u8 level) {
 	if (level < CONFIG_EBRK_LVL_NUM) {
 		motor.u_set.ebrk_lvl = level;

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

@@ -7,6 +7,7 @@
 #include "foc/mc_config.h"
 
 #define IDC_USER_LIMIT_NONE ((s16)0x3fff)
+#define RPM_USER_LIMIT_NONE ((s16)0x3fff)
 
 typedef struct {
 	bool running;
@@ -18,6 +19,7 @@ typedef struct {
 
 typedef struct {
 	s16 idc_lim;
+	s16 rpm_lim;
 	u8  ebrk_lvl;
 	u8  n_brkShutPower;
 	bool  b_tcs;
@@ -96,6 +98,7 @@ bool mc_enable_cruise(bool enable);
 bool mc_is_cruise_enabled(void);
 bool mc_set_cruise_speed(bool rpm_abs, float target_rpm);
 void mc_set_idc_limit(s16 limit);
+void mc_set_rpm_limit(s16 limit);
 gear_t *mc_get_gear_config(void);
 gear_t *mc_get_gear_config_by_gear(u8 n_gear);
 void mc_set_motor_lim_level(u8 l);