From ef22c4cf8b5c23cc65376af0de200594016ccc0f Mon Sep 17 00:00:00 2001 From: Massimiliano Minarelli Date: Sat, 28 Feb 2026 19:16:39 +0100 Subject: [PATCH 1/3] Getting back open-loop motion while searching for the encoder zero --- src/common/base_classes/FOCMotor.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/common/base_classes/FOCMotor.cpp b/src/common/base_classes/FOCMotor.cpp index a193229a..24b6f5d1 100644 --- a/src/common/base_classes/FOCMotor.cpp +++ b/src/common/base_classes/FOCMotor.cpp @@ -937,11 +937,14 @@ int FOCMotor::absoluteZeroSearch() { velocity_limit = velocity_index_search; voltage_limit = voltage_sensor_align; shaft_angle = 0; - while(sensor->needsSearch() && shaft_angle < _2PI){ - angleOpenloop(1.5f*_2PI); + // TODO: Try the dedicated method for converting mec and elec angles + while(sensor->needsSearch() && shaft_angle < pole_pairs*_2PI){ + angleOpenloop(pole_pairs*1.5f*_2PI); // call important for some sensors not to loose count // not needed for the search sensor->update(); + // set the voltage to the motor + setPhaseVoltage(voltage_limit, 0, shaft_angle); } // disable motor setPhaseVoltage(0, 0, 0); @@ -954,4 +957,4 @@ int FOCMotor::absoluteZeroSearch() { else { SIMPLEFOC_MOTOR_DEBUG("Success!"); } } return !sensor->needsSearch(); -} \ No newline at end of file +} From 0622b9f2e4a0677a1f563c4d23c5e25fb72ed9ff Mon Sep 17 00:00:00 2001 From: Massimiliano Minarelli Date: Thu, 5 Mar 2026 19:34:35 +0100 Subject: [PATCH 2/3] Using dedicated function to calculate the target electrical angle for searching the zero position on the encoder --- src/common/base_classes/FOCMotor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/base_classes/FOCMotor.cpp b/src/common/base_classes/FOCMotor.cpp index 24b6f5d1..0ba4a15f 100644 --- a/src/common/base_classes/FOCMotor.cpp +++ b/src/common/base_classes/FOCMotor.cpp @@ -938,8 +938,9 @@ int FOCMotor::absoluteZeroSearch() { voltage_limit = voltage_sensor_align; shaft_angle = 0; // TODO: Try the dedicated method for converting mec and elec angles - while(sensor->needsSearch() && shaft_angle < pole_pairs*_2PI){ - angleOpenloop(pole_pairs*1.5f*_2PI); + float search_rotation_target = _electricalAngle(1.5f*_2PI, pole_pairs) + while(sensor->needsSearch() && shaft_angle < search_rotation_target){ + angleOpenloop(search_rotation_target); // call important for some sensors not to loose count // not needed for the search sensor->update(); From 339164f4b133b09d53a9170b7740f44ad5958c6c Mon Sep 17 00:00:00 2001 From: Massimiliano Minarelli Date: Thu, 5 Mar 2026 19:40:45 +0100 Subject: [PATCH 3/3] Fixed ; and better comments --- src/common/base_classes/FOCMotor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/base_classes/FOCMotor.cpp b/src/common/base_classes/FOCMotor.cpp index 0ba4a15f..0cdccccc 100644 --- a/src/common/base_classes/FOCMotor.cpp +++ b/src/common/base_classes/FOCMotor.cpp @@ -937,8 +937,8 @@ int FOCMotor::absoluteZeroSearch() { velocity_limit = velocity_index_search; voltage_limit = voltage_sensor_align; shaft_angle = 0; - // TODO: Try the dedicated method for converting mec and elec angles - float search_rotation_target = _electricalAngle(1.5f*_2PI, pole_pairs) + // calculting elctrical angle equivalent for a 1.5 mechanical rotation + float search_rotation_target = _electricalAngle(1.5f*_2PI, pole_pairs); while(sensor->needsSearch() && shaft_angle < search_rotation_target){ angleOpenloop(search_rotation_target); // call important for some sensors not to loose count