From b52cd87fa2de122b0d4a611ff4472d9900838aea Mon Sep 17 00:00:00 2001 From: PAJohnson Date: Thu, 29 Oct 2020 00:20:39 -0400 Subject: [PATCH] Fixed the encoder offset calibration to work correctly when calib_scan_distance is not a multiple of 4pi --- CHANGELOG.md | 3 +++ Firmware/MotorControl/encoder.cpp | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25943d17..31aec573 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Unreleased Features Please add a note of your changes below this heading if you make a Pull Request. +### Changed +Fixed the encoder offset calibration to work correctly when calib_scan_distance is not a multiple of 4pi + # Releases ## [0.5.1] - 2020-09-27 ### Added diff --git a/Firmware/MotorControl/encoder.cpp b/Firmware/MotorControl/encoder.cpp index 2c465988..de9986c5 100644 --- a/Firmware/MotorControl/encoder.cpp +++ b/Firmware/MotorControl/encoder.cpp @@ -202,10 +202,13 @@ bool Encoder::run_offset_calibration() { else return false; - // go to motor zero phase for start_lock_duration to get ready to scan + // go to start position of forward scan for start_lock_duration to get ready to scan int i = 0; axis_->run_control_loop([&](){ - if (!axis_->motor_.enqueue_voltage_timings(voltage_magnitude, 0.0f)) + float phase = wrap_pm_pi(0 - config_.calib_scan_distance / 2.0f); + float v_alpha = voltage_magnitude * our_arm_cos_f32(phase); + float v_beta = voltage_magnitude * our_arm_sin_f32(phase); + if (!axis_->motor_.enqueue_voltage_timings(v_alpha, v_beta)) return false; // error set inside enqueue_voltage_timings axis_->motor_.log_timing(TIMING_LOG_ENC_CALIB); return ++i < start_lock_duration * current_meas_hz;