Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r1b6b84d8a24a19984ec4a2d89db017e7247ad46c -rd2a3a96829a14b5716764373b9c38166f8bb8e46 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 1b6b84d8a24a19984ec4a2d89db017e7247ad46c) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision d2a3a96829a14b5716764373b9c38166f8bb8e46) @@ -51,7 +51,6 @@ #define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.01064F ///< Max duty cycle change when ramping up. #define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.016F ///< Max duty cycle change when ramping down. -#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE_SET 0.82F ///< Max duty cycle is 82% to cap pump speed to 3,600 RPM during treatment. #define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.90F ///< Controller will error if PWM duty cycle > 90%, so set max to 90%. #define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.10F ///< Controller will error if PWM duty cycle < 10%, so set min to 10%. #define MIN_DG_DIAL_FLOW_RATE 10.0F ///< Minimum DG Dialysate Flow Rate (mL/Min) @@ -77,6 +76,7 @@ #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); @@ -277,7 +277,7 @@ // Initialize dialysate inlet flow PI controller initializePIController( PI_CONTROLLER_ID_DIALYSATE_FLOW, MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE, DIP_P_COEFFICIENT, DIP_I_COEFFICIENT, - MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE_SET ); + MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE ); // Initialize persistent alarms initPersistentAlarm( ALARM_ID_HD_DIAL_IN_FLOW_CHECK_FAILURE, 0, DIP_NO_FLOW_CHK_PERSIST ); @@ -325,7 +325,7 @@ dialInPumpControlMode = mode; // Set PWM duty cycle target to an estimated initial target to ramp to based on target flow rate - then we will control to flow when ramp completed dialInPumpPWMDutyCyclePct = ( 0 == flowRate ? DIP_PWM_ZERO_OFFSET : dialysateInPumpPWMFromTargetFlowRate( (F32)flowRate ) ); - dialInPumpPWMDutyCyclePct = RANGE( dialInPumpPWMDutyCyclePct, MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE_SET ); + dialInPumpPWMDutyCyclePct = RANGE( dialInPumpPWMDutyCyclePct, MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE ); switch ( dialInPumpState ) { @@ -1354,6 +1354,7 @@ F32 measMotorSpeedInRotorRPM = fabs( measMotorSpeed / DIP_GEAR_RATIO ); F32 deltaRotorSpeed = ( measRotorSpeed - measMotorSpeedInRotorRPM ); F32 measMotorSpeedDeltaPct = ( deltaRotorSpeed / measMotorSpeedInRotorRPM ); + F32 rotSpdPctTol = ( cmdMotorSpeed > DIP_MAX_MOTOR_SPEED_TIGHT_ROTOR_TOL ? DIP_MAX_MOTOR_SPEED_VS_TRGT_DIFF_PCT : DIP_MIN_ROTOR_SPEED_VS_MOTOR_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 ) ) @@ -1374,8 +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 ) ) || - ( measMotorSpeedDeltaPct < DIP_MIN_ROTOR_SPEED_VS_MOTOR_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 ) ) {