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