Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -rbb2663ead0175c2567bdc4c5ca1ddce851e36b19 -rd1667580eb3f57fd7fc45d69b8d10e0d4dca5dad --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision bb2663ead0175c2567bdc4c5ca1ddce851e36b19) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision d1667580eb3f57fd7fc45d69b8d10e0d4dca5dad) @@ -57,7 +57,7 @@ #define MAX_DIAL_OUT_PUMP_PWM_CHANGE 0.05F ///< Maximum duty cycle change allowed. #define MAX_DIAL_OUT_PUMP_PWM_STEP_UP_CHANGE 0.01064F ///< Maximum duty cycle change when ramping up. #define MAX_DIAL_OUT_PUMP_PWM_STEP_DN_CHANGE 0.016F ///< Maximum duty cycle change when ramping down. -#define MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.90F ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. +#define MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.90F ///< Controller will error if PWM duty cycle > 90%, so set max to 90%. #define MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.10F ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. #define MIN_DIAL_OUT_CL_PWM_DUTY_CYCLE 0.11F ///< Dial outlet pump Closed Loop minimum PWM duty cycle. #define MAX_DIAL_OUT_PUMP_PWM_OFFSET_CONTROL 0.4F ///< Maximum PWM offset (added to DPi PWM duty cycle). @@ -85,6 +85,8 @@ #define DOP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0F ///< Maximum difference in speed between motor and rotor (in rotor RPM). #define DOP_MAX_MOTOR_SPEED_ERROR_RPM 300.0F ///< Maximum difference in speed between measured and commanded RPM. #define DOP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT 0.15F ///< Maximum motor speed vs target difference in percent. +#define DOP_MIN_ROTOR_SPEED_VS_MOTOR_PCT -0.6F ///< Minimum rotor speed vs target difference in percent. +#define DOP_MAX_MOTOR_SPEED_TIGHT_ROTOR_TOL 3200 ///< Maximum motor speed at which tighter rotor speed tolerance is applied. /// Persist time (task intervals) for motor off error condition. static const U32 DOP_OFF_ERROR_PERSIST = ((5 * MS_PER_SECOND) / TASK_PRIORITY_INTERVAL); @@ -1171,8 +1173,9 @@ F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = fabs( getMeasuredDialOutPumpRotorSpeed() ); F32 measMotorSpeedInRotorRPM = fabs( measMotorSpeed / DOP_GEAR_RATIO ); - F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); - F32 measMotorSpeedDeltaPct = fabs( deltaRotorSpeed / measMotorSpeedInRotorRPM ); + F32 deltaRotorSpeed = ( measRotorSpeed - measMotorSpeedInRotorRPM ); + F32 measMotorSpeedDeltaPct = ( deltaRotorSpeed / measMotorSpeedInRotorRPM ); + F32 rotSpdPctTol = ( cmdMotorSpeed > DOP_MAX_MOTOR_SPEED_TIGHT_ROTOR_TOL ? DOP_MIN_ROTOR_SPEED_VS_MOTOR_PCT : -DOP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT ); // Check measured motor speed vs. commanded motor speed while controlling to target if ( ( deltaMotorSpeed > DOP_MAX_MOTOR_SPEED_ERROR_RPM ) || ( deltaMCMotorSpeed > DOP_MAX_MOTOR_SPEED_ERROR_RPM ) ) @@ -1193,7 +1196,8 @@ } // Check measured rotor speed vs. measured motor speed while controlling to target - if ( ( deltaRotorSpeed > DOP_MAX_ROTOR_VS_MOTOR_DIFF_RPM ) && ( measMotorSpeedDeltaPct > DOP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT ) ) + if ( ( fabs( deltaRotorSpeed ) > DOP_MAX_ROTOR_VS_MOTOR_DIFF_RPM ) && + ( ( measMotorSpeedDeltaPct > DOP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT ) || ( measMotorSpeedDeltaPct < rotSpdPctTol ) ) ) { if ( ++errorDialOutRotorSpeedPersistTimerCtr >= ( getPumpRotorErrorPersistTime( measMotorSpeed, DOP_GEAR_RATIO ) / TASK_PRIORITY_INTERVAL ) ) {