Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r2a368aaf6d568f021e1bba806bf46e1174250f56 -r0a0417a975dc931b8eb05c1e4dc0599aab07492c --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 2a368aaf6d568f021e1bba806bf46e1174250f56) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 0a0417a975dc931b8eb05c1e4dc0599aab07492c) @@ -57,7 +57,7 @@ #define BP_P_COEFFICIENT 0.0001F ///< P term for blood pump control #define BP_I_COEFFICIENT 0.00075F ///< I term for blood pump control -#define BP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. +#define BP_HOME_SPEED 400 ///< Target pump speed (in RPM) for homing. #define BP_HOME_TIMEOUT_MS 10000 ///< Maximum time (in ms) allowed for homing to complete. #define BP_MAX_ROTOR_HALL_INTERVAL_MS 20000 ///< Maximum time (in ms) allowed between rotor hall sensor detects (50 mL/min worst case). @@ -111,6 +111,8 @@ #define BP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR + BP_PWM_ZERO_OFFSET ) /// Conversion from PWM duty cycle % to commanded pump motor speed. #define BP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - BP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1.0F : -1.0F ) ) +/// Conversion from RPM to PWM duty cycle %. +#define BP_MOTOR_SPEED_RPM_TO_PWM(rpm) ( ( (F32)(rpm) / 4000.0F ) + BP_PWM_ZERO_OFFSET ) /// Conversion macro from mL/min to estimated PWM duty cycle %. #define BP_ML_PER_MIN_FROM_PWM(pwm) ( ( ( pwm - BP_PWM_ZERO_OFFSET ) / ( BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR ) ) ) @@ -351,6 +353,26 @@ } return result; +} + +/*********************************************************************//** + * @brief + * The setBloodPumpTargetRPM 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 blood pump speed (in RPM) + * @param dir new blood flow direction + * @return TRUE if new flow rate & direction are set, FALSE if not + *************************************************************************/ +BOOL setBloodPumpTargetRPM( U32 rpm, MOTOR_DIR_T dir ) +{ + BOOL result = FALSE; + F32 pwm = BP_MOTOR_SPEED_RPM_TO_PWM( rpm ); + + result = setBloodPumpTargetFlowRate( (U32)BP_ML_PER_MIN_FROM_PWM( pwm ), dir, PUMP_CONTROL_MODE_OPEN_LOOP ); + + return result; } /*********************************************************************//** @@ -436,7 +458,7 @@ { bpStopAtHomePosition = TRUE; bpHomeStartTime = getMSTimerCount(); - result = setBloodPumpTargetFlowRate( BP_HOME_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + result = setBloodPumpTargetRPM( BP_HOME_SPEED, MOTOR_DIR_FORWARD ); } return result; Index: firmware/App/Controllers/BloodFlow.h =================================================================== diff -u -ra4e044315bbfaaeff11cb9391485897458a48a5f -r0a0417a975dc931b8eb05c1e4dc0599aab07492c --- firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision a4e044315bbfaaeff11cb9391485897458a48a5f) +++ firmware/App/Controllers/BloodFlow.h (.../BloodFlow.h) (revision 0a0417a975dc931b8eb05c1e4dc0599aab07492c) @@ -57,7 +57,8 @@ void execBloodFlowMonitor( void ); void execBloodFlowController( void ); -BOOL setBloodPumpTargetFlowRate( U32 flowRate, MOTOR_DIR_T dir, PUMP_CONTROL_MODE_T mode ); +BOOL setBloodPumpTargetFlowRate( U32 flowRate, MOTOR_DIR_T dir, PUMP_CONTROL_MODE_T mode ); +BOOL setBloodPumpTargetRPM( U32 rpm, MOTOR_DIR_T dir ); void signalBloodPumpHardStop( void ); void signalBloodPumpRotorHallSensor( void ); BOOL homeBloodPump( void ); Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r2a368aaf6d568f021e1bba806bf46e1174250f56 -r0a0417a975dc931b8eb05c1e4dc0599aab07492c --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 2a368aaf6d568f021e1bba806bf46e1174250f56) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 0a0417a975dc931b8eb05c1e4dc0599aab07492c) @@ -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 ) @@ -111,7 +111,7 @@ /// 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 ) ) /// 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) / 4000.0F ) + 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 @@ -377,6 +377,26 @@ 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 ); + + result = setDialInPumpTargetFlowRate( (U32)DIP_ML_PER_MIN_FROM_PWM( pwm ), dir, PUMP_CONTROL_MODE_OPEN_LOOP ); + + return result; +} + /*********************************************************************//** * @brief * The signalDialInPumpHardStop function stops the dialIn pump immediately. @@ -436,7 +456,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; Index: firmware/App/Controllers/DialInFlow.h =================================================================== diff -u -r044d8892373acc5545020aab894cd1943c4d7449 -r0a0417a975dc931b8eb05c1e4dc0599aab07492c --- firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 044d8892373acc5545020aab894cd1943c4d7449) +++ firmware/App/Controllers/DialInFlow.h (.../DialInFlow.h) (revision 0a0417a975dc931b8eb05c1e4dc0599aab07492c) @@ -55,6 +55,7 @@ void execDialInFlowController( void ); BOOL setDialInPumpTargetFlowRate( U32 flowRate, MOTOR_DIR_T dir, PUMP_CONTROL_MODE_T mode ); +BOOL setDialInPumpTargetRPM( U32 rpm, MOTOR_DIR_T dir ); void signalDialInPumpHardStop( void ); void signalDialInPumpRotorHallSensor( void ); BOOL homeDialInPump( void ); Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r2a368aaf6d568f021e1bba806bf46e1174250f56 -r0a0417a975dc931b8eb05c1e4dc0599aab07492c --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 2a368aaf6d568f021e1bba806bf46e1174250f56) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 0a0417a975dc931b8eb05c1e4dc0599aab07492c) @@ -64,7 +64,7 @@ #define RPM_2_ML_MIN_CONVERSION 0.215964F ///< Conversion factor for estimating flow rate from pump motor RPM. #define SIZE_OF_ROLLING_AVG 100 ///< Number of samples in DPo flow estimation moving average. -#define DOP_HOME_RATE 100 ///< Target pump speed (in estimate mL/min) for homing. +#define DOP_HOME_SPEED 400 ///< Target pump speed (in RPM) for homing. #define DOP_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). @@ -107,6 +107,8 @@ #define DOP_PWM_FROM_ML_PER_MIN(rate) ( ( ( rate ) * 0.0009F ) + 0.0972F + DOP_PWM_ZERO_OFFSET ) /// Conversion from PWM duty cycle % to commanded pump motor speed. #define DOP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ( ( pwm ) - DOP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1.0F : -1.0F ) ) +/// Conversion from RPM to PWM duty cycle %. +#define DOP_MOTOR_SPEED_RPM_TO_PWM(rpm) ( ( (F32)(rpm) / 4000.0F ) + DOP_PWM_ZERO_OFFSET ) /// Macro converts a PWM to an estimated flow rate. #define DOP_ML_PER_MIN_FROM_PWM(pwm) ( ( ( pwm - DOP_PWM_ZERO_OFFSET ) - 0.0972F ) / 0.0009F ) @@ -347,6 +349,26 @@ /*********************************************************************//** * @brief + * The setDialOutPumpTargetRPM 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 outlet pump speed (in RPM) + * @param dir new dialysate outlet flow direction + * @return TRUE if new flow rate & direction are set, FALSE if not + *************************************************************************/ +BOOL setDialOutPumpTargetRPM( U32 rpm, MOTOR_DIR_T dir ) +{ + BOOL result = FALSE; + F32 pwm = DOP_MOTOR_SPEED_RPM_TO_PWM( rpm ); + + result = setDialOutPumpTargetRate( (U32)DOP_ML_PER_MIN_FROM_PWM( pwm ), dir, PUMP_CONTROL_MODE_OPEN_LOOP ); + + return result; +} + +/*********************************************************************//** + * @brief * The setDialOutUFVolumes function sets the ultrafiltration reference and * measured total volumes (in mL). * @details Inputs: none @@ -469,7 +491,7 @@ { dopStopAtHomePosition = TRUE; dopHomeStartTime = getMSTimerCount(); - result = setDialOutPumpTargetRate( DOP_HOME_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + result = setDialOutPumpTargetRPM( DOP_HOME_SPEED, MOTOR_DIR_FORWARD ); } return result; Index: firmware/App/Controllers/DialOutFlow.h =================================================================== diff -u -ref6283257df7c1f993d58fb934da57ea3e0a7067 -r0a0417a975dc931b8eb05c1e4dc0599aab07492c --- firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision ef6283257df7c1f993d58fb934da57ea3e0a7067) +++ firmware/App/Controllers/DialOutFlow.h (.../DialOutFlow.h) (revision 0a0417a975dc931b8eb05c1e4dc0599aab07492c) @@ -57,6 +57,7 @@ void execDialOutFlowController( void ); BOOL setDialOutPumpTargetRate( U32 flowRate, MOTOR_DIR_T dir, PUMP_CONTROL_MODE_T mode ); +BOOL setDialOutPumpTargetRPM( U32 rpm, MOTOR_DIR_T dir ); void setDialOutUFVolumes( F32 refVol, F32 totVol ); void signalDialOutPumpHardStop( void );