diff --git a/CHANGELOG b/CHANGELOG index b8df6d3c..78285299 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ * Added COMM_GET_MCCONF_TEMP command. * Added bidirectional current command to VESC remote. * Fixed motor temperature reading on hw with ADC mux. +* Added speed PID input ramping option. === FW 5.01 === * Fixed PPM bug in previous release. diff --git a/confgenerator.c b/confgenerator.c index 032dbd6f..7be5d02d 100644 --- a/confgenerator.c +++ b/confgenerator.c @@ -118,6 +118,7 @@ int32_t confgenerator_serialize_mcconf(uint8_t *buffer, const mc_configuration * buffer_append_float32_auto(buffer, conf->s_pid_kd_filter, &ind); buffer_append_float32_auto(buffer, conf->s_pid_min_erpm, &ind); buffer[ind++] = conf->s_pid_allow_braking; + buffer_append_float32_auto(buffer, conf->s_pid_ramp_erpms_s, &ind); buffer_append_float32_auto(buffer, conf->p_pid_kp, &ind); buffer_append_float32_auto(buffer, conf->p_pid_ki, &ind); buffer_append_float32_auto(buffer, conf->p_pid_kd, &ind); @@ -410,6 +411,7 @@ bool confgenerator_deserialize_mcconf(const uint8_t *buffer, mc_configuration *c conf->s_pid_kd_filter = buffer_get_float32_auto(buffer, &ind); conf->s_pid_min_erpm = buffer_get_float32_auto(buffer, &ind); conf->s_pid_allow_braking = buffer[ind++]; + conf->s_pid_ramp_erpms_s = buffer_get_float32_auto(buffer, &ind); conf->p_pid_kp = buffer_get_float32_auto(buffer, &ind); conf->p_pid_ki = buffer_get_float32_auto(buffer, &ind); conf->p_pid_kd = buffer_get_float32_auto(buffer, &ind); @@ -698,6 +700,7 @@ void confgenerator_set_defaults_mcconf(mc_configuration *conf) { conf->s_pid_kd_filter = MCCONF_S_PID_KD_FILTER; conf->s_pid_min_erpm = MCCONF_S_PID_MIN_RPM; conf->s_pid_allow_braking = MCCONF_S_PID_ALLOW_BRAKING; + conf->s_pid_ramp_erpms_s = MCCONF_S_PID_RAMP_ERPMS_S; conf->p_pid_kp = MCCONF_P_PID_KP; conf->p_pid_ki = MCCONF_P_PID_KI; conf->p_pid_kd = MCCONF_P_PID_KD; diff --git a/confgenerator.h b/confgenerator.h index e832e50a..63b60541 100644 --- a/confgenerator.h +++ b/confgenerator.h @@ -8,7 +8,7 @@ #include // Constants -#define MCCONF_SIGNATURE 3698540221 +#define MCCONF_SIGNATURE 1775793947 #define APPCONF_SIGNATURE 4090856534 // Functions diff --git a/datatypes.h b/datatypes.h index 97cad74e..cc46e5e4 100644 --- a/datatypes.h +++ b/datatypes.h @@ -321,6 +321,7 @@ typedef struct { float s_pid_kd_filter; float s_pid_min_erpm; bool s_pid_allow_braking; + float s_pid_ramp_erpms_s; // Pos PID float p_pid_kp; float p_pid_ki; diff --git a/mcconf/mcconf_default.h b/mcconf/mcconf_default.h index fbd4337c..9c7acff6 100644 --- a/mcconf/mcconf_default.h +++ b/mcconf/mcconf_default.h @@ -136,6 +136,9 @@ #ifndef MCCONF_S_PID_ALLOW_BRAKING #define MCCONF_S_PID_ALLOW_BRAKING true // Allow braking in speed control mode #endif +#ifndef MCCONF_S_PID_RAMP_ERPMS_S +#define MCCONF_S_PID_RAMP_ERPMS_S -1.0 // Default Speed Input Ramp +#endif // Position PID parameters #ifndef MCCONF_P_PID_KP diff --git a/mcpwm_foc.c b/mcpwm_foc.c index c7154bfd..b7adcdfa 100644 --- a/mcpwm_foc.c +++ b/mcpwm_foc.c @@ -111,6 +111,7 @@ typedef struct { bool m_output_on; float m_pos_pid_set; float m_speed_pid_set_rpm; + float m_speed_command_rpm; float m_phase_now_observer; float m_phase_now_observer_override; bool m_phase_observer_override; @@ -798,6 +799,17 @@ void mcpwm_foc_set_duty_noramp(float dutyCycle) { * The electrical RPM goal value to use. */ void mcpwm_foc_set_pid_speed(float rpm) { + if (motor_now()->m_conf->s_pid_ramp_erpms_s > 0.0 ) { + if (motor_now()->m_control_mode != CONTROL_MODE_SPEED || + motor_now()->m_state != MC_STATE_RUNNING) { + motor_now()->m_speed_pid_set_rpm = mcpwm_foc_get_rpm(); + } + + motor_now()->m_speed_command_rpm = rpm; + } else { + motor_now()->m_speed_pid_set_rpm = rpm; + } + motor_now()->m_control_mode = CONTROL_MODE_SPEED; motor_now()->m_speed_pid_set_rpm = rpm; @@ -3632,6 +3644,10 @@ static void run_pid_control_speed(float dt, volatile motor_all_state_t *motor) { return; } + if (conf_now->s_pid_ramp_erpms_s > 0.0) { + utils_step_towards((float*)&motor->m_speed_pid_set_rpm, motor->m_speed_command_rpm, conf_now->s_pid_ramp_erpms_s * dt); + } + const float rpm = mcpwm_foc_get_rpm(); float error = motor->m_speed_pid_set_rpm - rpm;