From 6654b3a37576aad6a96bcbfff87c25e54fb1037c Mon Sep 17 00:00:00 2001 From: Paul Guenette Date: Sat, 25 May 2019 17:29:25 +0200 Subject: [PATCH] Just fetch the cogging ratio every time we need it --- Firmware/MotorControl/controller.cpp | 7 ++++--- Firmware/MotorControl/encoder.cpp | 4 ---- Firmware/MotorControl/encoder.hpp | 9 +++++---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Firmware/MotorControl/controller.cpp b/Firmware/MotorControl/controller.cpp index 65c9a2bb..1199682a 100644 --- a/Firmware/MotorControl/controller.cpp +++ b/Firmware/MotorControl/controller.cpp @@ -5,7 +5,8 @@ Controller::Controller(Config_t& config) : config_(config) -{} +{ +} void Controller::reset() { pos_setpoint_ = 0.0f; @@ -90,7 +91,7 @@ bool Controller::anticogging_calibration(float pos_estimate, float vel_estimate) config_.anticogging.cogging_map[std::clamp(config_.anticogging.index++, 0, 3600)] = vel_integrator_current_; } if (config_.anticogging.index < 3600) { - set_pos_setpoint(config_.anticogging.index * config_.anticogging.cogging_ratio, 0.0f, 0.0f); + set_pos_setpoint(config_.anticogging.index * axis_->encoder_.getCoggingRatio(), 0.0f, 0.0f); return false; } else { config_.anticogging.index = 0; @@ -106,7 +107,7 @@ bool Controller::anticogging_calibration(float pos_estimate, float vel_estimate) bool Controller::update(float pos_estimate, float vel_estimate, float* current_setpoint_output) { // Only runs if config_.anticogging.calib_anticogging is true; non-blocking anticogging_calibration(pos_estimate, vel_estimate); - float anticogging_pos = pos_estimate / config_.anticogging.cogging_ratio; + float anticogging_pos = pos_estimate / axis_->encoder_.getCoggingRatio(); // Trajectory control if (config_.control_mode == CTRL_MODE_TRAJECTORY_CONTROL) { diff --git a/Firmware/MotorControl/encoder.cpp b/Firmware/MotorControl/encoder.cpp index 27679c33..95dc91f9 100644 --- a/Firmware/MotorControl/encoder.cpp +++ b/Firmware/MotorControl/encoder.cpp @@ -99,10 +99,6 @@ void Encoder::set_linear_count(int32_t count) { cpu_exit_critical(prim); } -void Encoder::cpr_changed_callback(){ - axis_->controller_.config_.anticogging.cogging_ratio = config_.cpr / 3600.0f; -} - // Function that sets the CPR circular tracking encoder count to a desired 32-bit value. // Note that this will get mod'ed down to [0, cpr) void Encoder::set_circular_count(int32_t count, bool update_offset) { diff --git a/Firmware/MotorControl/encoder.hpp b/Firmware/MotorControl/encoder.hpp index b6a3b3d8..9d2c272c 100644 --- a/Firmware/MotorControl/encoder.hpp +++ b/Firmware/MotorControl/encoder.hpp @@ -67,9 +67,6 @@ public: void sample_now(); bool update(); - void cpr_changed_callback(); - - const EncoderHardwareConfig_t& hw_config_; Config_t& config_; Axis* axis_ = nullptr; // set by Axis constructor @@ -94,6 +91,10 @@ public: float sincos_sample_s_ = 0.0f; float sincos_sample_c_ = 0.0f; + constexpr float getCoggingRatio(){ + return config_.cpr / 3600.0f; + } + // Communication protocol definitions auto make_protocol_definitions() { return make_protocol_member_list( @@ -120,7 +121,7 @@ public: make_protocol_property("pre_calibrated", &config_.pre_calibrated, [](void* ctx) { static_cast(ctx)->check_pre_calibrated(); }, this), make_protocol_property("zero_count_on_find_idx", &config_.zero_count_on_find_idx), - make_protocol_property("cpr", &config_.cpr, [](void* ctx) { static_cast(ctx)->cpr_changed_callback(); }, this), + make_protocol_property("cpr", &config_.cpr), make_protocol_property("offset", &config_.offset), make_protocol_property("offset_float", &config_.offset_float), make_protocol_property("enable_phase_interpolation", &config_.enable_phase_interpolation),