Skip to content

Commit 06d9eab

Browse files
committed
add feed forward terms for current and voltage
1 parent 1c25100 commit 06d9eab

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
@@ -355,23 +355,23 @@ void BLDCMotor::loopFOC() {
355355
// read overall current magnitude
356356
current.q = current_sense->getDCCurrent(electrical_angle);
357357
// filter the value values
358-
current.q = LPF_current_q(current.q);
358+
current.q = LPF_current_q(current.q) + feed_forward_current.q;
359359
// calculate the phase voltage
360-
voltage.q = PID_current_q(current_sp - current.q);
360+
voltage.q = PID_current_q(current_sp - current.q)+feed_forward_voltage.q;
361361
// d voltage - lag compensation
362-
if(_isset(phase_inductance)) voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
363-
else voltage.d = 0;
362+
if(_isset(phase_inductance)) voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance+feed_forward_voltage.d, -voltage_limit, voltage_limit);
363+
else voltage.d = feed_forward_voltage.d;
364364
break;
365365
case TorqueControlType::foc_current:
366366
if(!current_sense) return;
367367
// read dq currents
368368
current = current_sense->getFOCCurrents(electrical_angle);
369369
// filter values
370-
current.q = LPF_current_q(current.q);
371-
current.d = LPF_current_d(current.d);
370+
current.q = LPF_current_q(current.q) + feed_forward_current.q;
371+
current.d = LPF_current_d(current.d) + feed_forward_current.d;
372372
// calculate the phase voltages
373-
voltage.q = PID_current_q(current_sp - current.q);
374-
voltage.d = PID_current_d(-current.d);
373+
voltage.q = PID_current_q(current_sp - current.q)+feed_forward_voltage.q;
374+
voltage.d = PID_current_d(-current.d)+feed_forward_voltage.d;
375375
// d voltage - lag compensation - TODO verify
376376
// if(_isset(phase_inductance)) voltage.d = _constrain( voltage.d - current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
377377
break;
@@ -380,7 +380,6 @@ void BLDCMotor::loopFOC() {
380380
SIMPLEFOC_DEBUG("MOT: no torque control selected!");
381381
break;
382382
}
383-
384383
// set the phase voltage - FOC heart function :)
385384
setPhaseVoltage(voltage.q, voltage.d, electrical_angle);
386385
}
@@ -447,10 +446,10 @@ void BLDCMotor::move(float new_target) {
447446
if(torque_controller == TorqueControlType::voltage){
448447
// use voltage if phase-resistance not provided
449448
if(!_isset(phase_resistance)) voltage.q = current_sp;
450-
else voltage.q = _constrain( current_sp*phase_resistance + voltage_bemf , -voltage_limit, voltage_limit);
449+
else voltage.q = _constrain( (current_sp+feed_forward_current.q)*phase_resistance + voltage_bemf, -voltage_limit, voltage_limit);
451450
// set d-component (lag compensation if known inductance)
452451
if(!_isset(phase_inductance)) voltage.d = 0;
453-
else voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
452+
else voltage.d = _constrain( -(current_sp+feed_forward_current.d)*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
454453
}
455454
break;
456455
case MotionControlType::velocity:
@@ -462,10 +461,10 @@ void BLDCMotor::move(float new_target) {
462461
if(torque_controller == TorqueControlType::voltage){
463462
// use voltage if phase-resistance not provided
464463
if(!_isset(phase_resistance)) voltage.q = current_sp;
465-
else voltage.q = _constrain( current_sp*phase_resistance + voltage_bemf , -voltage_limit, voltage_limit);
464+
else voltage.q = _constrain( (current_sp+feed_forward_current.q)*phase_resistance + voltage_bemf, -voltage_limit, voltage_limit);
466465
// set d-component (lag compensation if known inductance)
467466
if(!_isset(phase_inductance)) voltage.d = 0;
468-
else voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
467+
else voltage.d = _constrain( -(current_sp+feed_forward_current.d)*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
469468
}
470469
break;
471470
case MotionControlType::velocity_openloop:

src/StepperMotor.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -315,23 +315,23 @@ void StepperMotor::loopFOC() {
315315
// read overall current magnitude
316316
current.q = current_sense->getDCCurrent(electrical_angle);
317317
// filter the value values
318-
current.q = LPF_current_q(current.q);
318+
current.q = LPF_current_q(current.q) + feed_forward_current.q;
319319
// calculate the phase voltage
320320
voltage.q = PID_current_q(current_sp - current.q);
321321
// d voltage - lag compensation
322-
if(_isset(phase_inductance)) voltage.d = _constrain( -current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
323-
else voltage.d = 0;
322+
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);
323+
else voltage.d = feed_forward_voltage.d;
324324
break;
325325
case TorqueControlType::foc_current:
326326
if(!current_sense) return;
327327
// read dq currents
328328
current = current_sense->getFOCCurrents(electrical_angle);
329329
// filter values
330-
current.q = LPF_current_q(current.q);
331-
current.d = LPF_current_d(current.d);
330+
current.q = LPF_current_q(current.q)+feed_forward_current.q;
331+
current.d = LPF_current_d(current.d)+feed_forward_current.d;
332332
// calculate the phase voltages
333-
voltage.q = PID_current_q(current_sp - current.q);
334-
voltage.d = PID_current_d(-current.d);
333+
voltage.q = PID_current_q(current_sp - current.q)+feed_forward_voltage.q;
334+
voltage.d = PID_current_d(-current.d)+feed_forward_voltage.d;
335335
// d voltage - lag compensation - TODO verify
336336
// if(_isset(phase_inductance)) voltage.d = _constrain( voltage.d - current_sp*shaft_velocity*pole_pairs*phase_inductance, -voltage_limit, voltage_limit);
337337
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)