Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -r7a16f634cb738c81d5fd4ac7f644dea4088de465 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 7a16f634cb738c81d5fd4ac7f644dea4088de465) @@ -75,6 +75,8 @@ #define DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0F ///< Maximum difference in speed between motor and rotor (in rotor RPM). #define DIP_MAX_MOTOR_SPEED_ERROR_RPM 300.0F ///< Maximum difference in speed between measured and commanded RPM. #define DIP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT 0.15F ///< Maximum motor speed vs target difference in percent. +#define DIP_MIN_ROTOR_SPEED_VS_MOTOR_PCT -0.6F ///< Minimum rotor speed vs target difference in percent. +#define DIP_MAX_MOTOR_SPEED_TIGHT_ROTOR_TOL 3200 ///< Maximum motor speed at which tighter rotor speed tolerance is applied. /// Persist time (ms) for unexpected flow check failure condition. static const U32 DIP_NO_FLOW_CHK_PERSIST = (10 * MS_PER_SECOND); @@ -1350,8 +1352,9 @@ F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = fabs( getMeasuredDialInPumpRotorSpeed() ); F32 measMotorSpeedInRotorRPM = fabs( measMotorSpeed / DIP_GEAR_RATIO ); - F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); - F32 measMotorSpeedDeltaPct = fabs( deltaRotorSpeed / measMotorSpeedInRotorRPM ); + F32 deltaRotorSpeed = ( measRotorSpeed - measMotorSpeedInRotorRPM ); + F32 measMotorSpeedDeltaPct = ( deltaRotorSpeed / measMotorSpeedInRotorRPM ); + F32 rotSpdPctTol = ( cmdMotorSpeed > DIP_MAX_MOTOR_SPEED_TIGHT_ROTOR_TOL ? DIP_MIN_ROTOR_SPEED_VS_MOTOR_PCT : -DIP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT ); // Check measured motor speed vs. commanded motor speed while controlling to target if ( ( deltaMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) || ( deltaMCMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) ) @@ -1372,7 +1375,8 @@ } // Check measured rotor speed vs. measured motor speed while controlling to target - if ( ( deltaRotorSpeed > DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM ) && ( measMotorSpeedDeltaPct > DIP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT ) ) + if ( ( fabs( deltaRotorSpeed ) > DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM ) && + ( ( measMotorSpeedDeltaPct > DIP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT ) || ( measMotorSpeedDeltaPct < rotSpdPctTol ) ) ) { if ( ++errorDialInRotorSpeedPersistTimerCtr >= ( getPumpRotorErrorPersistTime( measMotorSpeed, DIP_GEAR_RATIO ) / TASK_PRIORITY_INTERVAL ) ) {