@@ -133,7 +133,7 @@ void CurrentSense::disable(){
133
133
// 3 - success but gains inverted
134
134
// 4 - success but pins reconfigured and gains inverted
135
135
// 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 ){
137
137
138
138
int exit_flag = 1 ;
139
139
if (skip_align) return exit_flag;
@@ -142,9 +142,9 @@ int CurrentSense::driverAlign(float voltage){
142
142
143
143
// check if stepper or BLDC
144
144
if (driver_type == DriverType::Stepper)
145
- return alignStepperDriver (voltage, (StepperDriver*)driver);
145
+ return alignStepperDriver (voltage, (StepperDriver*)driver, modulation_centered );
146
146
else
147
- return alignBLDCDriver (voltage, (BLDCDriver*)driver);
147
+ return alignBLDCDriver (voltage, (BLDCDriver*)driver, modulation_centered );
148
148
}
149
149
150
150
@@ -172,22 +172,23 @@ PhaseCurrent_s CurrentSense::readAverageCurrents(int N) {
172
172
// 2 - success but pins reconfigured
173
173
// 3 - success but gains inverted
174
174
// 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 ){
176
176
177
177
bool phases_switched = 0 ;
178
178
bool phases_inverted = 0 ;
179
179
180
- float center = driver->voltage_limit /2.0 ;
180
+ float zero = 0 ;
181
+ if (modulation_centered) zero = driver->voltage_limit /2.0 ;
181
182
182
183
// set phase A active and phases B and C down
183
184
// 300 ms of ramping
184
185
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 );
186
187
_delay (3 );
187
188
}
188
189
_delay (500 );
189
190
PhaseCurrent_s c_a = readAverageCurrents ();
190
- bldc_driver->setPwm (0 , 0 , 0 );
191
+ bldc_driver->setPwm (zero, zero, zero );
191
192
// check if currents are to low (lower than 100mA)
192
193
// TODO calculate the 100mA threshold from the ADC resolution
193
194
// if yes throw an error and return 0
@@ -293,12 +294,12 @@ int CurrentSense::alignBLDCDriver(float voltage, BLDCDriver* bldc_driver){
293
294
// set phase B active and phases A and C down
294
295
// 300 ms of ramping
295
296
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 );
297
298
_delay (3 );
298
299
}
299
300
_delay (500 );
300
301
PhaseCurrent_s c_b = readAverageCurrents ();
301
- bldc_driver->setPwm (0 , 0 , 0 );
302
+ bldc_driver->setPwm (zero, zero, zero );
302
303
303
304
// check the phase B
304
305
// find the highest magnitude in c_b
@@ -390,10 +391,13 @@ int CurrentSense::alignBLDCDriver(float voltage, BLDCDriver* bldc_driver){
390
391
// 2 - success but pins reconfigured
391
392
// 3 - success but gains inverted
392
393
// 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 ){
394
395
395
396
bool phases_switched = 0 ;
396
397
bool phases_inverted = 0 ;
398
+
399
+ float zero = 0 ;
400
+ if (modulation_centered) zero = driver->voltage_limit /2.0 ;
397
401
398
402
if (!_isset (pinA) || !_isset (pinB)){
399
403
SIMPLEFOC_DEBUG (" CS: Pins A & B not specified!" );
@@ -403,13 +407,13 @@ int CurrentSense::alignStepperDriver(float voltage, StepperDriver* stepper_drive
403
407
// set phase A active and phases B down
404
408
// ramp 300ms
405
409
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 );
407
411
_delay (3 );
408
412
}
409
413
_delay (500 );
410
414
PhaseCurrent_s c = readAverageCurrents ();
411
415
// disable the phases
412
- stepper_driver->setPwm (0 , 0 );
416
+ stepper_driver->setPwm (zero, zero );
413
417
if (fabs (c.a ) < 0 .1f && fabs (c.b ) < 0 .1f ){
414
418
SIMPLEFOC_DEBUG (" CS: Err too low current!" );
415
419
return 0 ; // measurement current too low
@@ -438,12 +442,12 @@ int CurrentSense::alignStepperDriver(float voltage, StepperDriver* stepper_drive
438
442
// set phase B active and phases A down
439
443
// ramp 300ms
440
444
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 );
442
446
_delay (3 );
443
447
}
444
448
_delay (500 );
445
449
c = readAverageCurrents ();
446
- stepper_driver->setPwm (0 , 0 );
450
+ stepper_driver->setPwm (zero, zero );
447
451
448
452
// phase B should be aligned
449
453
// 1) we just need to verify that it has been measured
0 commit comments