Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r044d8892373acc5545020aab894cd1943c4d7449 -r726c340ed2bdedd8532a2ee26422e1b70643397f --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 044d8892373acc5545020aab894cd1943c4d7449) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 726c340ed2bdedd8532a2ee26422e1b70643397f) @@ -47,7 +47,7 @@ #define MAX_DIAL_IN_PUMP_PWM_STEP_UP_CHANGE 0.0133F ///< Max duty cycle change when ramping up ~ 200 mL/min/s. #define MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE 0.02F ///< Max duty cycle change when ramping down ~ 300 mL/min/s. -#define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.89F ///< Controller will error if PWM duty cycle > 90%, so set max to 89%. +#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) - DN-9NOV2022 @@ -107,16 +107,13 @@ #define DIP_GEAR_RATIO 32.0F ///< DialIn pump motor to dialIn pump gear ratio. #define DIP_PWM_ZERO_OFFSET 0.1F ///< 10% PWM duty cycle = zero speed. -/// Macro converts flow rate to estimate PWM needed to achieve it. -#define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET /// Conversion from PWM duty cycle % to commanded pump motor speed. PWM range is 10% to 90%. RPM range is 0 to 3200. 3200 / 0.8 = 4000. #define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm) ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0F ) /// Conversion from pump motor speed to PWM duty cycle. #define DIP_MOTOR_SPEED_RPM_TO_PWM(rpm) ( ( rpm / 4000.0F ) + 0.1 ) -// Macro converts PWM to estimate flow rate needed to achieve it. +// Macro converts PWM to estimate flow rate needed to achieve it. TODO - this macro does not reverse the function that estimates PWM from target flow rate - and it should #define DIP_ML_PER_MIN_FROM_PWM(pwm) ( (pwm) - DIP_PWM_ZERO_OFFSET ) / DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR / DIP_GEAR_RATIO / DIP_MOTOR_RPM_TO_PWM_DC_FACTOR - /// Measured dialIn flow is filtered w/ moving average. #define SIZE_OF_ROLLING_AVG 4 @@ -321,7 +318,8 @@ dialInPumpDirection = dir; 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 = ( 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 ); switch ( dialInPumpState ) { @@ -1350,7 +1348,6 @@ static void checkDialInPumpFlowRate( void ) { F32 flow = getMeasuredDialInFlowRate(); - F32 measuredDialInFlow; // Range check on measure DPi flow rate. if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_DIAL_IN_FLOW_OUT_OF_RANGE, ( flow > DIP_MAX_FLOW_RATE ) || ( flow < DIP_MIN_FLOW_RATE ) ) ) ) @@ -1395,9 +1392,10 @@ // Check DG Dialysate flow rate /* TODO: Temporarily comment this out. Will restore it when know better how to handle this alarm. - measuredDialInFlow = getDGDialysateFlowRateLMin() * ML_PER_LITER; if ( ( TRUE == isDialInPumpRunning() ) && ( dialInPumpControlMode != PUMP_CONTROL_MODE_OPEN_LOOP ) ) { + F32 measuredDialInFlow = getDGDialysateFlowRateLMin() * ML_PER_LITER; + if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_DIAL_IN_FLOW_CHECK_FAILURE, measuredDialInFlow < MIN_DG_DIAL_FLOW_RATE ) ) ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_DIAL_IN_FLOW_CHECK_FAILURE, measuredDialInFlow, (F32)targetDialInFlowRate ); @@ -1406,8 +1404,7 @@ else { isPersistentAlarmTriggered( ALARM_ID_HD_DIAL_IN_FLOW_CHECK_FAILURE, FALSE ); - } - */ + } */ } /*********************************************************************//** Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -ref6283257df7c1f993d58fb934da57ea3e0a7067 -r726c340ed2bdedd8532a2ee26422e1b70643397f --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision ef6283257df7c1f993d58fb934da57ea3e0a7067) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 726c340ed2bdedd8532a2ee26422e1b70643397f) @@ -902,17 +902,9 @@ // Switch to saline bag setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); // Start blood pump at saline bolus rate -#ifndef RUN_PUMPS_OPEN_LOOP setBloodPumpTargetFlowRate( SALINE_BOLUS_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); -#else - setBloodPumpTargetFlowRate( SALINE_BOLUS_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -#endif // Start dialysate inlet pump at re-circ rate -#ifndef RUN_PUMPS_OPEN_LOOP setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); -#else - setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_RECIRC, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -#endif // Begin saline bolus result = SALINE_BOLUS_STATE_IN_PROGRESS; }