diff --git a/CHANGELOG.md b/CHANGELOG.md index f671d0f7..f37e0555 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,17 +18,17 @@ Please add a note of your changes below this heading if you make a Pull Request. * [CAN Communication with CANSimple stack](can-protocol.md) * Gain scheduling for anti-hunt when close to 0 position error * Velocity Limiting in Current Control mode according to `vel_limit` and `vel_gain` -* Regen current limiting according to `max_regen_limit`, in Amps +* Regen current limiting according to `max_regen_current`, in Amps * DC Bus hard current limiting according to `dc_max_negative_current` and `dc_max_positive_current` +* Brake resistor logic now attempts to clamp voltage according to `odrv.config.dc_bus_overvoltage_ramp_start` and `odrv.config.dc_bus_overvoltage_ramp_end` * Unit Testing with Doctest has been started for select algorithms, see [Firmware/Tests/test_runner.cpp](Firmware/Tests/test_runner.cpp) * Added support for Flylint VSCode Extension for static code analysis * Using an STM32F405 .svd file allows CortexDebug to view registers during debugging * Added scripts for building via docker. -* Brake resistor logic now attempts to clamp voltage according to `odrv.config.dc_bus_overvoltage_ramp_start` and `odrv.config.dc_bus_overvoltage_ramp_end` ### Changed * Changed ratiometric `motor.config.current_lim_tolerance` to absolute `motor.config.current_lim_margin` -* Moved `controller.vel_ramp_enable` into `controller.config`. +* Moved `controller.vel_ramp_enable` to INPUT_MODE_VEL_RAMP. * Anticogging map is temporarily forced to 0.1 deg precision, but saves with the config * Some Encoder settings have been made read-only * Cleaned up VSCode C/C++ Configuration settings on Windows with recursive includePath diff --git a/Firmware/MotorControl/controller.cpp b/Firmware/MotorControl/controller.cpp index f4b7f84b..beb93528 100644 --- a/Firmware/MotorControl/controller.cpp +++ b/Firmware/MotorControl/controller.cpp @@ -256,8 +256,7 @@ bool Controller::update(float* current_setpoint_output) { // Velocity limiting float vel_lim = config_.vel_limit; if (config_.enable_vel_limit) { - if (vel_des > vel_lim) vel_des = vel_lim; - if (vel_des < -vel_lim) vel_des = -vel_lim; + vel_des = std::clamp(vel_des, -vel_lim, vel_lim); } // Check for overspeed fault (done in this module (controller) for cohesion with vel_lim) diff --git a/Firmware/MotorControl/low_level.cpp b/Firmware/MotorControl/low_level.cpp index 8236d39e..1140ca1e 100644 --- a/Firmware/MotorControl/low_level.cpp +++ b/Firmware/MotorControl/low_level.cpp @@ -214,6 +214,7 @@ void start_adc_pwm() { // Ensure that debug halting of the core doesn't leave the motor PWM running __HAL_DBGMCU_FREEZE_TIM1(); __HAL_DBGMCU_FREEZE_TIM8(); + __HAL_DBGMCU_FREEZE_TIM13(); start_pwm(&htim1); start_pwm(&htim8); diff --git a/Firmware/MotorControl/motor.cpp b/Firmware/MotorControl/motor.cpp index 39115713..223aba1c 100644 --- a/Firmware/MotorControl/motor.cpp +++ b/Firmware/MotorControl/motor.cpp @@ -447,9 +447,8 @@ bool Motor::update(float current_setpoint, float phase, float phase_vel) { // TODO: 2-norm vs independent clamping (current could be sqrt(2) bigger) float ilim = effective_current_lim(); - // TODO: use std::clamp (C++17) - float id = MACRO_MIN(MACRO_MAX(current_control_.Id_setpoint, -ilim), ilim); - float iq = MACRO_MIN(MACRO_MAX(current_setpoint, -ilim), ilim); + float id = std::clamp(current_control_.Id_setpoint, -ilim, ilim); + float iq = std::clamp(current_setpoint, -ilim, ilim); if (config_.motor_type == MOTOR_TYPE_ACIM) { // Note that the effect of the current commands on the real currents is actually 1.5 PWM cycles later @@ -460,7 +459,7 @@ bool Motor::update(float current_setpoint, float phase, float phase_vel) { float abs_iq = fabsf(iq); float gain = abs_iq > id ? config_.acim_autoflux_attack_gain : config_.acim_autoflux_decay_gain; id += gain * (abs_iq - id) * current_meas_period; - id = MACRO_MIN(MACRO_MAX(id, config_.acim_autoflux_min_Id), ilim); + id = std::clamp(id, config_.acim_autoflux_min_Id, ilim); current_control_.Id_setpoint = id; } @@ -485,22 +484,11 @@ bool Motor::update(float current_setpoint, float phase, float phase_vel) { float pwm_phase = phase + 1.5f * current_meas_period * phase_vel; // Execute current command - // TODO: move this into the mot - if (config_.motor_type == MOTOR_TYPE_HIGH_CURRENT) { - if(!FOC_current(id, iq, phase, pwm_phase)){ - return false; - } - } else if (config_.motor_type == MOTOR_TYPE_ACIM) { - if(!FOC_current(id, iq, phase, pwm_phase)){ - return false; - } - } else if (config_.motor_type == MOTOR_TYPE_GIMBAL) { - //In gimbal motor mode, current is reinterptreted as voltage. - if(!FOC_voltage(id, iq, pwm_phase)) - return false; - } else { - set_error(ERROR_NOT_IMPLEMENTED_MOTOR_TYPE); - return false; + switch(config_.motor_type){ + case MOTOR_TYPE_HIGH_CURRENT: return FOC_current(id, iq, phase, pwm_phase); break; + case MOTOR_TYPE_ACIM: return FOC_current(id, iq, phase, pwm_phase); break; + case MOTOR_TYPE_GIMBAL: return FOC_voltage(id, iq, pwm_phase); break; + default: set_error(ERROR_NOT_IMPLEMENTED_MOTOR_TYPE); return false; break; } return true; }