diff --git a/Firmware/MotorControl/motor.cpp b/Firmware/MotorControl/motor.cpp index 75e81202..5979257c 100644 --- a/Firmware/MotorControl/motor.cpp +++ b/Firmware/MotorControl/motor.cpp @@ -58,6 +58,17 @@ void Motor::disarm() { axis_->missed_control_deadline_ = true; } +// @brief Tune the current controller based on phase resistance and inductance +// This should be invoked whenever one of these values changes. +// TODO: allow update on user-request or update automatically via hooks +void Motor::update_current_controller_gains() { + // Calculate current control gains + float current_control_bandwidth = 1000.0f; // [rad/s] + current_control_.p_gain = current_control_bandwidth * config_.phase_inductance; + float plant_pole = config_.phase_resistance / config_.phase_inductance; + current_control_.i_gain = plant_pole * current_control_.p_gain; +} + // @brief Set up the gate drivers void Motor::DRV8301_setup() { DRV_SPI_8301_Vars_t* local_regs = &gate_driver_regs_; @@ -234,11 +245,7 @@ bool Motor::run_calibration() { return false; } - // Calculate current control gains - float current_control_bandwidth = 1000.0f; // [rad/s] - current_control_.p_gain = current_control_bandwidth * config_.phase_inductance; - float plant_pole = config_.phase_resistance / config_.phase_inductance; - current_control_.i_gain = plant_pole * current_control_.p_gain; + update_current_controller_gains(); is_calibrated_ = true; return true; diff --git a/Firmware/MotorControl/motor.hpp b/Firmware/MotorControl/motor.hpp index 2e771b27..37647db0 100644 --- a/Firmware/MotorControl/motor.hpp +++ b/Firmware/MotorControl/motor.hpp @@ -82,8 +82,10 @@ public: bool arm(); void disarm(); void setup() { + update_current_controller_gains(); DRV8301_setup(); } + void update_current_controller_gains(); void DRV8301_setup(); bool check_DRV_fault(); bool do_checks();