Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r44d7427d77dee3f17d6626c86daef7ce84b91596 -re5d24f913e4f29d61c813cd1446ac22a368815f2 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 44d7427d77dee3f17d6626c86daef7ce84b91596) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision e5d24f913e4f29d61c813cd1446ac22a368815f2) @@ -7,8 +7,8 @@ * * @file DialInFlow.c * -* @author (last) Dara Navaei -* @date (last) 14-Dec-2022 +* @author (last) Sean Nash +* @date (last) 21-Dec-2022 * * @author (original) Sean * @date (original) 16-Dec-2019 @@ -69,7 +69,7 @@ #define DIP_MIN_FLOW_RATE -1320.0F ///< Minimum measured BP flow rate allowed. #define DIP_MAX_FLOW_VS_SPEED_DIFF_RPM 350.0F ///< Maximum difference between measured motor speed and speed implied by measured flow. #define DIP_MAX_MOTOR_SPEED_WHILE_OFF_RPM 100.0F ///< Maximum motor speed (RPM) while motor is commanded off. -#define DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 5.0F ///< Maximum difference in speed between motor and rotor (in rotor RPM). +#define DIP_MAX_ROTOR_VS_MOTOR_DIFF_RPM 2.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. @@ -240,6 +240,7 @@ static void checkDialInPumpMCCurrent( void ); static void checkDialInPumpFlowRate( void ); static F32 calcDialInFlow( void ); +static F32 dialysateInPumpRPMFromTargetFlowRate( F32 QdTarget ); static F32 dialysateInPumpPWMFromTargetFlowRate( F32 QdTarget ); static BOOL testSetDialInPumpWithPWM( F32 pwm ); @@ -828,23 +829,39 @@ /*********************************************************************//** * @brief - * The dialysateInPumpPWMFromTargetFlowRate function calculates a motor PWM setting + * The dialysateInPumpRPMFromTargetFlowRate function calculates a motor RPM * from the estimator based on target flow rate and tubing wear. * @details Inputs: dialInPumpRotorCounter * @details Outputs: none * @param QdTarget target dialysate flow rate - * @return Motor PWM value for given target flow rate + * @return Motor RPM value for given target flow rate *************************************************************************/ -static F32 dialysateInPumpPWMFromTargetFlowRate( F32 QdTarget ) +static F32 dialysateInPumpRPMFromTargetFlowRate( F32 QdTarget ) { U32 r = getDialInPumpRotorCount(); U32 rotCount = CAP( r, DIAL_IN_MAX_ROTOR_COUNT_FOR_WEAR ); F32 wearFactor = DIAL_IN_FLOW_WEAR_A_TERM * (F32)rotCount + DIAL_IN_FLOW_WEAR_B_TERM; F32 Pest = DIAL_IN_FLOW_PEST_A_TERM * ( QdTarget * QdTarget ) + DIAL_IN_FLOW_PEST_B_TERM * QdTarget + DIAL_IN_FLOW_PEST_C_TERM; F32 alphaTerm = wearFactor * Pest + DIAL_IN_FLOW_A_ZERO; F32 rpmTgt = QdTarget * DIAL_IN_GEAR_RATIO / ( 2 * DIAL_IN_STROKE_VOLUME * alphaTerm ); - F32 pwmDC = DIP_MOTOR_SPEED_RPM_TO_PWM( rpmTgt ); + return rpmTgt; +} + +/*********************************************************************//** + * @brief + * The dialysateInPumpPWMFromTargetFlowRate function calculates a motor PWM + * setting from a given target flow rate. + * @details Inputs: none + * @details Outputs: none + * @param QdTarget target dialysate flow rate + * @return Motor PWM value for given RPM + *************************************************************************/ +static F32 dialysateInPumpPWMFromTargetFlowRate( F32 QdTarget ) +{ + F32 rpmTgt = dialysateInPumpRPMFromTargetFlowRate( QdTarget ); + F32 pwmDC = DIP_MOTOR_SPEED_RPM_TO_PWM( rpmTgt ); + return pwmDC; } @@ -1374,7 +1391,7 @@ { F32 flow = (F32)targetDialInFlowRate; F32 speed = getMeasuredDialInPumpSpeed(); - F32 impliedSpeed = ( flow * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO ); + F32 impliedSpeed = dialysateInPumpRPMFromTargetFlowRate( flow ); F32 delta = fabs( speed - impliedSpeed ); if ( delta > DIP_MAX_FLOW_VS_SPEED_DIFF_RPM )