Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rac6fc5b74e15c8925e4579c847ddfca8e1e361ad -r2e6c7c4355ade64dafa49ad1241cbddd1db317de --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision ac6fc5b74e15c8925e4579c847ddfca8e1e361ad) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 2e6c7c4355ade64dafa49ad1241cbddd1db317de) @@ -168,15 +168,16 @@ // ********** private data ********** -static DIAL_IN_PUMP_STATE_T dialInPumpState = DIAL_IN_PUMP_OFF_STATE; ///< Current state of dialIn flow controller state machine -static U32 dialInFlowDataPublicationTimerCounter; ///< Used to schedule dialIn flow data publication to CAN bus -static BOOL isDialInPumpOn = FALSE; ///< DialIn pump is currently running -static F32 dialInPumpPWMDutyCyclePct = 0.0; ///< Initial dialIn pump PWM duty cycle -static F32 dialInPumpPWMDutyCyclePctSet = 0.0; ///< Currently set dialIn pump PWM duty cycle -static MOTOR_DIR_T dialInPumpDirection = MOTOR_DIR_FORWARD; ///< Requested dialysate flow direction -static MOTOR_DIR_T dialInPumpDirectionSet = MOTOR_DIR_FORWARD; ///< Currently set dialysate flow direction -static PUMP_CONTROL_MODE_T dialInPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Requested dialIn pump control mode. -static PUMP_CONTROL_MODE_T dialInPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP;///< Currently set dialIn pump control mode. +static DIAL_IN_PUMP_STATE_T dialInPumpState = DIAL_IN_PUMP_OFF_STATE; ///< Current state of dialIn flow controller state machine +static U32 dialInFlowDataPublicationTimerCounter; ///< Used to schedule dialIn flow data publication to CAN bus +static BOOL isDialInPumpOn = FALSE; ///< DialIn pump is currently running +static F32 dialInPumpPWMDutyCyclePct = 0.0; ///< Initial dialIn pump PWM duty cycle +static F32 dialInPumpPWMDutyCyclePctSet = 0.0; ///< Currently set dialIn pump PWM duty cycle +static MOTOR_DIR_T dialInPumpDirection = MOTOR_DIR_FORWARD; ///< Requested dialysate flow direction +static MOTOR_DIR_T dialInPumpDirectionSet = MOTOR_DIR_FORWARD; ///< Currently set dialysate flow direction +static PUMP_CONTROL_MODE_T dialInPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Requested dialIn pump control mode. +static PUMP_CONTROL_MODE_T dialInPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set dialIn pump control mode. +static BOOL isTestPWMSet = FALSE; ///< Using PWM to set the rate instead of target flow. /// Interval (in ms) at which to publish dialIn flow data to CAN bus static OVERRIDE_U32_T dialInFlowDataPublishInterval = { DIAL_IN_FLOW_DATA_PUB_INTERVAL, DIAL_IN_FLOW_DATA_PUB_INTERVAL, DIAL_IN_FLOW_DATA_PUB_INTERVAL, 0 }; @@ -238,6 +239,7 @@ static void checkDialInPumpFlowRate( void ); static F32 calcDialInFlow( void ); static F32 dialysateInPumpPWMFromTargetFlowRate( F32 QdTarget ); +static void setDialInPumpWithPWM( F32 pwm ); /*********************************************************************//** * @brief @@ -251,7 +253,7 @@ U32 i; dialInFlowDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - + isTestPWMSet = FALSE; signalDialInPumpHardStop(); setDialInPumpDirection( MOTOR_DIR_FORWARD ); @@ -605,7 +607,8 @@ DIAL_IN_PUMP_STATE_T result = DIAL_IN_PUMP_RAMPING_UP_STATE; // Have we been asked to stop the dialIn pump? - if ( 0 == targetDialInFlowRate ) + if ( ( 0 == targetDialInFlowRate ) && + ( FALSE == isTestPWMSet ) ) { // Start ramp down to stop dialInPumpPWMDutyCyclePctSet -= MAX_DIAL_IN_PUMP_PWM_STEP_DN_CHANGE; @@ -1494,8 +1497,75 @@ return result; } + +/*********************************************************************//** + * @brief + * The setDialInPumpWithPWM function sets a new pwm value and + * pump direction. + * @details Inputs: isDialInPumpOn, dialInPumpPWMDutyCyclePct, dialInPumpDirectionSet, + * dialInPumpState + * @details Outputs: dialInPumpControlMode, dialInPumpdirection, dialInPumpPWMDutyCyclePct + * @param pwm, the new pwm value + * @return TRUE if new flow rate & dir are set, FALSE if not + **************************************************************************/ +static void setDialInPumpWithPWM( F32 pwm ) +{ + MOTOR_DIR_T dir = MOTOR_DIR_FORWARD; + BOOL result = FALSE; + + if ( NEARLY_ZERO < pwm ) + { + dir = MOTOR_DIR_REVERSE; + } + // Direction change while pump is running is not allowed + if ( ( FALSE == isDialInPumpOn ) || ( 0 == dialInPumpPWMDutyCyclePct ) || ( dir == dialInPumpDirectionSet ) ) + { + // Don't interrupt pump control unless rate is changing + if ( ( pwm != dialInPumpPWMDutyCyclePct ) ) + { + resetDialInFlowMovingAverage(); + dialInPumpDirection = dir; + dialInPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; + dialInPumpPWMDutyCyclePct = RANGE( dialInPumpPWMDutyCyclePct, MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE ); + + switch ( dialInPumpState ) + { + case DIAL_IN_PUMP_RAMPING_UP_STATE: // See if we need to reverse direction of ramp + if ( dialInPumpPWMDutyCyclePct < dialInPumpPWMDutyCyclePctSet ) + { + dialInPumpState = DIAL_IN_PUMP_RAMPING_DOWN_STATE; + } + break; + + case DIAL_IN_PUMP_RAMPING_DOWN_STATE: // See if we need to reverse direction of ramp + if ( dialInPumpPWMDutyCyclePct > dialInPumpPWMDutyCyclePctSet ) + { + dialInPumpState = DIAL_IN_PUMP_RAMPING_UP_STATE; + } + break; + + case DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE: // Start ramp to new target in appropriate direction + if ( dialInPumpPWMDutyCyclePctSet > dialInPumpPWMDutyCyclePct ) + { + dialInPumpState = DIAL_IN_PUMP_RAMPING_DOWN_STATE; + } + else + { + dialInPumpState = DIAL_IN_PUMP_RAMPING_UP_STATE; + } + break; + + default: + // Ok - not all states need to be handled here + break; + } + result = TRUE; + + } + } + return result; +} - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -1824,14 +1894,32 @@ * @param value duty cycle of the dialysate inlet pump (as a percentage). * @return TRUE if reset successful, FALSE if not *************************************************************************/ -BOOL testSetDialInPumpTargetDutyCycle( F32 value ) +BOOL testSetDialInPumpTargetDutyCycle( F32 pwmPct ) { BOOL result = FALSE; + F32 absolutePWM = fabs( pwmPct ); if ( TRUE == isTestingActivated() ) { - setDialInPumpTargetFlowRate( (U32)DIP_ML_PER_MIN_FROM_PWM(value), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - result = TRUE; + // check for min/max of pump pwm + if ( absolutePWM < MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE && + absolutePWM > MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE ) + { + // if exactly zero, clear test flag + if ( value == 0 ) + { + isTestPWMSet = FALSE; + } + else + { + isTestPWMSet = TRUE; + + } + + setDialInPumpWithPWM( pwmPct ); + result = TRUE; + } + } return result;