@@ -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:
0 commit comments