Skip to content

Commit a9ef741

Browse files
Merge pull request #454 from Copper280z/ff_dev
Add current and voltage feed forward terms to motor classes
2 parents a1d5b86 + 06d9eab commit a9ef741

File tree

3 files changed

+21
-20
lines changed

3 files changed

+21
-20
lines changed

src/BLDCMotor.cpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -358,23 +358,23 @@ void BLDCMotor::loopFOC() {
358358
// read overall current magnitude
359359
current.q = current_sense->getDCCurrent(electrical_angle);
360360
// filter the value values
361-
current.q = LPF_current_q(current.q);
361+
current.q = LPF_current_q(current.q) + feed_forward_current.q;
362362
// calculate the phase voltage
363-
voltage.q = PID_current_q(current_sp - current.q);
363+
voltage.q = PID_current_q(current_sp - current.q)+feed_forward_voltage.q;
364364
// d voltage - lag compensation
365-
if(_isset(phase_inductance)) voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
366-
else voltage.d = 0;
365+
if(_isset(phase_inductance)) voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance+feed_forward_voltage.d, -voltage_limit, voltage_limit);
366+
else voltage.d = feed_forward_voltage.d;
367367
break;
368368
case TorqueControlType::foc_current:
369369
if(!current_sense) return;
370370
// read dq currents
371371
current = current_sense->getFOCCurrents(electrical_angle);
372372
// filter values
373-
current.q = LPF_current_q(current.q);
374-
current.d = LPF_current_d(current.d);
373+
current.q = LPF_current_q(current.q) + feed_forward_current.q;
374+
current.d = LPF_current_d(current.d) + feed_forward_current.d;
375375
// calculate the phase voltages
376-
voltage.q = PID_current_q(current_sp - current.q);
377-
voltage.d = PID_current_d(-current.d);
376+
voltage.q = PID_current_q(current_sp - current.q)+feed_forward_voltage.q;
377+
voltage.d = PID_current_d(-current.d)+feed_forward_voltage.d;
378378
// d voltage - lag compensation - TODO verify
379379
// if(_isset(phase_inductance)) voltage.d = _constrain( voltage.d - current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
380380
break;
@@ -383,7 +383,6 @@ void BLDCMotor::loopFOC() {
383383
SIMPLEFOC_DEBUG("MOT: no torque control selected!");
384384
break;
385385
}
386-
387386
// set the phase voltage - FOC heart function :)
388387
setPhaseVoltage(voltage.q, voltage.d, electrical_angle);
389388
}
@@ -450,10 +449,10 @@ void BLDCMotor::move(float new_target) {
450449
if(torque_controller == TorqueControlType::voltage){
451450
// use voltage if phase-resistance not provided
452451
if(!_isset(phase_resistance)) voltage.q = current_sp;
453-
else voltage.q = _constrain( current_sp*phase_resistance + voltage_bemf , -voltage_limit, voltage_limit);
452+
else voltage.q = _constrain( (current_sp+feed_forward_current.q)*phase_resistance + voltage_bemf, -voltage_limit, voltage_limit);
454453
// set d-component (lag compensation if known inductance)
455454
if(!_isset(phase_inductance)) voltage.d = 0;
456-
else voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
455+
else voltage.d = _constrain( -(current_sp+feed_forward_current.d)*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
457456
}
458457
break;
459458
case MotionControlType::velocity:
@@ -465,10 +464,10 @@ void BLDCMotor::move(float new_target) {
465464
if(torque_controller == TorqueControlType::voltage){
466465
// use voltage if phase-resistance not provided
467466
if(!_isset(phase_resistance)) voltage.q = current_sp;
468-
else voltage.q = _constrain( current_sp*phase_resistance + voltage_bemf , -voltage_limit, voltage_limit);
467+
else voltage.q = _constrain( (current_sp+feed_forward_current.q)*phase_resistance + voltage_bemf, -voltage_limit, voltage_limit);
469468
// set d-component (lag compensation if known inductance)
470469
if(!_isset(phase_inductance)) voltage.d = 0;
471-
else voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
470+
else voltage.d = _constrain( -(current_sp+feed_forward_current.d)*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
472471
}
473472
break;
474473
case MotionControlType::velocity_openloop:

src/StepperMotor.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,23 +318,23 @@ void StepperMotor::loopFOC() {
318318
// read overall current magnitude
319319
current.q = current_sense->getDCCurrent(electrical_angle);
320320
// filter the value values
321-
current.q = LPF_current_q(current.q);
321+
current.q = LPF_current_q(current.q) + feed_forward_current.q;
322322
// calculate the phase voltage
323323
voltage.q = PID_current_q(current_sp - current.q);
324324
// d voltage - lag compensation
325-
if(_isset(phase_inductance)) voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
326-
else voltage.d = 0;
325+
if(_isset(phase_inductance)) voltage.d = _constrain( -(current_sp+feed_forward_current.q)*shaft_velocity*pole_pairs*phase_inductance+feed_forward_voltage.d, -voltage_limit, voltage_limit);
326+
else voltage.d = feed_forward_voltage.d;
327327
break;
328328
case TorqueControlType::foc_current:
329329
if(!current_sense) return;
330330
// read dq currents
331331
current = current_sense->getFOCCurrents(electrical_angle);
332332
// filter values
333-
current.q = LPF_current_q(current.q);
334-
current.d = LPF_current_d(current.d);
333+
current.q = LPF_current_q(current.q)+feed_forward_current.q;
334+
current.d = LPF_current_d(current.d)+feed_forward_current.d;
335335
// calculate the phase voltages
336-
voltage.q = PID_current_q(current_sp - current.q);
337-
voltage.d = PID_current_d(-current.d);
336+
voltage.q = PID_current_q(current_sp - current.q)+feed_forward_voltage.q;
337+
voltage.d = PID_current_d(-current.d)+feed_forward_voltage.d;
338338
// d voltage - lag compensation - TODO verify
339339
// if(_isset(phase_inductance)) voltage.d = _constrain( voltage.d - current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
340340
break;

src/common/base_classes/FOCMotor.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ class FOCMotor
172172
float voltage_bemf; //!< estimated backemf voltage (if provided KV constant)
173173
float Ualpha, Ubeta; //!< Phase voltages U alpha and U beta used for inverse Park and Clarke transform
174174

175+
DQCurrent_s feed_forward_current;//!< current d and q current measured
176+
DQVoltage_s feed_forward_voltage;//!< current d and q voltage set to the motor
175177

176178
// motor configuration parameters
177179
float voltage_sensor_align;//!< sensor and motor align voltage parameter

0 commit comments

Comments
 (0)