@@ -133,7 +133,7 @@ void CurrentSense::disable(){
133133// 3 - success but gains inverted
134134// 4 - success but pins reconfigured and gains inverted
135135// IMPORTANT, this function can be overriden in the child class
136- int CurrentSense::driverAlign (float voltage){
136+ int CurrentSense::driverAlign (float voltage, bool modulation_centered ){
137137
138138 int exit_flag = 1 ;
139139 if (skip_align) return exit_flag;
@@ -142,9 +142,9 @@ int CurrentSense::driverAlign(float voltage){
142142
143143 // check if stepper or BLDC
144144 if (driver_type == DriverType::Stepper)
145- return alignStepperDriver (voltage, (StepperDriver*)driver);
145+ return alignStepperDriver (voltage, (StepperDriver*)driver, modulation_centered );
146146 else
147- return alignBLDCDriver (voltage, (BLDCDriver*)driver);
147+ return alignBLDCDriver (voltage, (BLDCDriver*)driver, modulation_centered );
148148}
149149
150150
@@ -172,22 +172,23 @@ PhaseCurrent_s CurrentSense::readAverageCurrents(int N) {
172172// 2 - success but pins reconfigured
173173// 3 - success but gains inverted
174174// 4 - success but pins reconfigured and gains inverted
175- int CurrentSense::alignBLDCDriver (float voltage, BLDCDriver* bldc_driver){
175+ int CurrentSense::alignBLDCDriver (float voltage, BLDCDriver* bldc_driver, bool modulation_centered ){
176176
177177 bool phases_switched = 0 ;
178178 bool phases_inverted = 0 ;
179179
180- float center = driver->voltage_limit /2.0 ;
180+ float zero = 0 ;
181+ if (modulation_centered) zero = driver->voltage_limit /2.0 ;
181182
182183 // set phase A active and phases B and C down
183184 // 300 ms of ramping
184185 for (int i=0 ; i < 100 ; i++){
185- bldc_driver->setPwm (voltage/100.0 *((float )i) , 0 , 0 );
186+ bldc_driver->setPwm (voltage/100.0 *((float )i)+zero , zero, zero );
186187 _delay (3 );
187188 }
188189 _delay (500 );
189190 PhaseCurrent_s c_a = readAverageCurrents ();
190- bldc_driver->setPwm (0 , 0 , 0 );
191+ bldc_driver->setPwm (zero, zero, zero );
191192 // check if currents are to low (lower than 100mA)
192193 // TODO calculate the 100mA threshold from the ADC resolution
193194 // if yes throw an error and return 0
@@ -293,12 +294,12 @@ int CurrentSense::alignBLDCDriver(float voltage, BLDCDriver* bldc_driver){
293294 // set phase B active and phases A and C down
294295 // 300 ms of ramping
295296 for (int i=0 ; i < 100 ; i++){
296- bldc_driver->setPwm (0 , voltage/100.0 *((float )i), 0 );
297+ bldc_driver->setPwm (zero , voltage/100.0 *((float )i)+zero, zero );
297298 _delay (3 );
298299 }
299300 _delay (500 );
300301 PhaseCurrent_s c_b = readAverageCurrents ();
301- bldc_driver->setPwm (0 , 0 , 0 );
302+ bldc_driver->setPwm (zero, zero, zero );
302303
303304 // check the phase B
304305 // find the highest magnitude in c_b
@@ -390,10 +391,13 @@ int CurrentSense::alignBLDCDriver(float voltage, BLDCDriver* bldc_driver){
390391// 2 - success but pins reconfigured
391392// 3 - success but gains inverted
392393// 4 - success but pins reconfigured and gains inverted
393- int CurrentSense::alignStepperDriver (float voltage, StepperDriver* stepper_driver){
394+ int CurrentSense::alignStepperDriver (float voltage, StepperDriver* stepper_driver, bool modulation_centered ){
394395
395396 bool phases_switched = 0 ;
396397 bool phases_inverted = 0 ;
398+
399+ float zero = 0 ;
400+ if (modulation_centered) zero = driver->voltage_limit /2.0 ;
397401
398402 if (!_isset (pinA) || !_isset (pinB)){
399403 SIMPLEFOC_DEBUG (" CS: Pins A & B not specified!" );
@@ -403,13 +407,13 @@ int CurrentSense::alignStepperDriver(float voltage, StepperDriver* stepper_drive
403407 // set phase A active and phases B down
404408 // ramp 300ms
405409 for (int i=0 ; i < 100 ; i++){
406- stepper_driver->setPwm (voltage/100.0 *((float )i), 0 );
410+ stepper_driver->setPwm (voltage/100.0 *((float )i), zero );
407411 _delay (3 );
408412 }
409413 _delay (500 );
410414 PhaseCurrent_s c = readAverageCurrents ();
411415 // disable the phases
412- stepper_driver->setPwm (0 , 0 );
416+ stepper_driver->setPwm (zero, zero );
413417 if (fabs (c.a ) < 0 .1f && fabs (c.b ) < 0 .1f ){
414418 SIMPLEFOC_DEBUG (" CS: Err too low current!" );
415419 return 0 ; // measurement current too low
@@ -438,12 +442,12 @@ int CurrentSense::alignStepperDriver(float voltage, StepperDriver* stepper_drive
438442 // set phase B active and phases A down
439443 // ramp 300ms
440444 for (int i=0 ; i < 100 ; i++){
441- stepper_driver->setPwm (0 , voltage/100.0 *((float )i));
445+ stepper_driver->setPwm (zero , voltage/100.0 *((float )i)+zero );
442446 _delay (3 );
443447 }
444448 _delay (500 );
445449 c = readAverageCurrents ();
446- stepper_driver->setPwm (0 , 0 );
450+ stepper_driver->setPwm (zero, zero );
447451
448452 // phase B should be aligned
449453 // 1) we just need to verify that it has been measured
0 commit comments