Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r2a368aaf6d568f021e1bba806bf46e1174250f56 -r90945afbe3866bf383c44c2a1f52438192c267c5 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 2a368aaf6d568f021e1bba806bf46e1174250f56) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 90945afbe3866bf383c44c2a1f52438192c267c5) @@ -57,7 +57,7 @@ #define DIP_P_COEFFICIENT 0.0001F ///< P term for dialIn pump control. #define DIP_I_COEFFICIENT 0.00075F ///< I term for dialIn pump control. -#define DIP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. +#define DIP_HOME_SPEED 400 ///< Target pump speed (in RPM) for homing. #define DIP_HOME_TIMEOUT_MS 10000 ///< Maximum time allowed for homing to complete (in ms). /// Interval (ms/task time) at which the blood pump speed is calculated (every 40 ms). #define DIP_SPEED_CALC_INTERVAL ( 40 / TASK_PRIORITY_INTERVAL ) @@ -107,11 +107,12 @@ #define DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DIP_REV_PER_LITER / ML_PER_LITER ) #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. +#define DIP_100_PCT_PWM_RPM_RANGE 4000.0F ///< 10-90% PWM range yields 0-3,200 RPM range. Full 100% PWM range would yield 4,000 RPM range. /// 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,dir) ( ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1.0F : -1.0F ) ) +#define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - DIP_PWM_ZERO_OFFSET) * DIP_100_PCT_PWM_RPM_RANGE ) * ( dir == MOTOR_DIR_FORWARD ? 1.0F : -1.0F ) ) /// Conversion from pump motor speed to PWM duty cycle. -#define DIP_MOTOR_SPEED_RPM_TO_PWM(rpm) ( ( rpm / 4000.0F ) + 0.1 ) +#define DIP_MOTOR_SPEED_RPM_TO_PWM(rpm) ( ( (F32)(rpm) / DIP_100_PCT_PWM_RPM_RANGE ) + DIP_PWM_ZERO_OFFSET ) // 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 @@ -241,7 +242,7 @@ static F32 calcDialInFlow( void ); static F32 dialysateInPumpRPMFromTargetFlowRate( F32 QdTarget ); static F32 dialysateInPumpPWMFromTargetFlowRate( F32 QdTarget ); -static BOOL testSetDialInPumpWithPWM( F32 pwm ); +static BOOL setDialInPumpToFixedPWM( F32 pwm ); /*********************************************************************//** * @brief @@ -377,6 +378,28 @@ return result; } +/*********************************************************************//** + * @brief + * The setDialInPumpTargetRPM function sets a new target pump speed and pump + * direction. Pump is set to open loop control. + * @details Inputs: none + * @details Outputs: none + * @param rpm new target dialysate inlet pump speed (in RPM) + * @param dir new dialysate inlet flow direction + * @return TRUE if new flow rate & direction are set, FALSE if not + *************************************************************************/ +BOOL setDialInPumpTargetRPM( U32 rpm, MOTOR_DIR_T dir ) +{ + BOOL result = FALSE; + F32 pwm = DIP_MOTOR_SPEED_RPM_TO_PWM( rpm ); + + pwm = ( MOTOR_DIR_REVERSE == dir ? pwm * -1.0F : pwm ); + + result = setDialInPumpToFixedPWM( pwm ); + + return result; +} + /*********************************************************************//** * @brief * The signalDialInPumpHardStop function stops the dialIn pump immediately. @@ -436,7 +459,7 @@ { dipStopAtHomePosition = TRUE; dipHomeStartTime = getMSTimerCount(); - result = setDialInPumpTargetFlowRate( DIP_HOME_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + result = setDialInPumpTargetRPM( DIP_HOME_SPEED, MOTOR_DIR_FORWARD ); } return result; @@ -1528,15 +1551,14 @@ /*********************************************************************//** * @brief - * The testSetDialInPumpWithPWM function sets a new pwm value and - * pump direction. + * The setDialInPumpToFixedPWM 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 BOOL testSetDialInPumpWithPWM( F32 pwm ) +static BOOL setDialInPumpToFixedPWM( F32 pwm ) { MOTOR_DIR_T dir = MOTOR_DIR_FORWARD; BOOL result = FALSE; @@ -1562,6 +1584,7 @@ resetDialInFlowMovingAverage(); dialInPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; dialInPumpPWMDutyCyclePct = RANGE( pwmFabs, MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE ); + targetDialInFlowRate = DIP_ML_PER_MIN_FROM_PWM( pwmFabs ); // clear test flag if we are turning off the pump. if ( pwmFabs <= MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE ) @@ -1944,7 +1967,7 @@ // check for max of pump pwm for acceptance. if ( absolutePWM < MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE ) { - result = testSetDialInPumpWithPWM( pwmPct ); + result = setDialInPumpToFixedPWM( pwmPct ); } } return result;