diff --git a/src/common/base_classes/StepperDriver.h b/src/common/base_classes/StepperDriver.h index 9864b235..49910179 100644 --- a/src/common/base_classes/StepperDriver.h +++ b/src/common/base_classes/StepperDriver.h @@ -6,6 +6,8 @@ class StepperDriver: public FOCDriver{ public: + float Ua; //!< currently set phase A voltage + float Ub; //!< currently set phase B voltage /** * Set phase voltages to the hardware diff --git a/src/current_sense/LowsideCurrentSense.cpp b/src/current_sense/LowsideCurrentSense.cpp index a0026ae3..dc5896ec 100644 --- a/src/current_sense/LowsideCurrentSense.cpp +++ b/src/current_sense/LowsideCurrentSense.cpp @@ -91,5 +91,12 @@ PhaseCurrent_s LowsideCurrentSense::getPhaseCurrents(){ current.a = (!_isset(pinA)) ? 0 : (_readADCVoltageLowSide(pinA, params) - offset_ia)*gain_a;// amps current.b = (!_isset(pinB)) ? 0 : (_readADCVoltageLowSide(pinB, params) - offset_ib)*gain_b;// amps current.c = (!_isset(pinC)) ? 0 : (_readADCVoltageLowSide(pinC, params) - offset_ic)*gain_c; // amps + + if (driver_type == DriverType::Stepper){ + static StepperDriver* stepper_driver = static_cast(driver); + current.a *= _sign(stepper_driver->Ua); + current.b *= _sign(stepper_driver->Ub); + } + return current; } diff --git a/src/drivers/StepperDriver2PWM.cpp b/src/drivers/StepperDriver2PWM.cpp index e8ccc6c6..ebbfed4f 100644 --- a/src/drivers/StepperDriver2PWM.cpp +++ b/src/drivers/StepperDriver2PWM.cpp @@ -94,7 +94,9 @@ void StepperDriver2PWM::setPhaseState(PhaseState sa, PhaseState sb) { } // Set voltage to the pwm pin -void StepperDriver2PWM::setPwm(float Ua, float Ub) { +void StepperDriver2PWM::setPwm(float Ua_, float Ub_) { + Ua = Ua_; + Ub = Ub_; float duty_cycle1(0.0f),duty_cycle2(0.0f); // limit the voltage in driver Ua = _constrain(Ua, -voltage_limit, voltage_limit); diff --git a/src/drivers/StepperDriver4PWM.cpp b/src/drivers/StepperDriver4PWM.cpp index 52f1c1d1..34bae8fb 100644 --- a/src/drivers/StepperDriver4PWM.cpp +++ b/src/drivers/StepperDriver4PWM.cpp @@ -70,21 +70,23 @@ void StepperDriver4PWM::setPhaseState(PhaseState sa, PhaseState sb) { // Set voltage to the pwm pin -void StepperDriver4PWM::setPwm(float Ualpha, float Ubeta) { +void StepperDriver4PWM::setPwm(float Ua_, float Ub_) { + Ua = Ua_; + Ub = Ub_; float duty_cycle1A(0.0f),duty_cycle1B(0.0f),duty_cycle2A(0.0f),duty_cycle2B(0.0f); // limit the voltage in driver - Ualpha = _constrain(Ualpha, -voltage_limit, voltage_limit); - Ubeta = _constrain(Ubeta, -voltage_limit, voltage_limit); + Ua = _constrain(Ua, -voltage_limit, voltage_limit); + Ub = _constrain(Ub, -voltage_limit, voltage_limit); // hardware specific writing - if( Ualpha > 0 ) - duty_cycle1B = _constrain(abs(Ualpha)/voltage_power_supply,0.0f,1.0f); + if( Ua > 0 ) + duty_cycle1B = _constrain(abs(Ua)/voltage_power_supply,0.0f,1.0f); else - duty_cycle1A = _constrain(abs(Ualpha)/voltage_power_supply,0.0f,1.0f); + duty_cycle1A = _constrain(abs(Ua)/voltage_power_supply,0.0f,1.0f); - if( Ubeta > 0 ) - duty_cycle2B = _constrain(abs(Ubeta)/voltage_power_supply,0.0f,1.0f); + if( Ub > 0 ) + duty_cycle2B = _constrain(abs(Ub)/voltage_power_supply,0.0f,1.0f); else - duty_cycle2A = _constrain(abs(Ubeta)/voltage_power_supply,0.0f,1.0f); + duty_cycle2A = _constrain(abs(Ub)/voltage_power_supply,0.0f,1.0f); // write to hardware _writeDutyCycle4PWM(duty_cycle1A, duty_cycle1B, duty_cycle2A, duty_cycle2B, params); } \ No newline at end of file