Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r2a368aaf6d568f021e1bba806bf46e1174250f56 -r90945afbe3866bf383c44c2a1f52438192c267c5 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 2a368aaf6d568f021e1bba806bf46e1174250f56) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 90945afbe3866bf383c44c2a1f52438192c267c5) @@ -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). @@ -102,11 +102,14 @@ #define DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DOP_REV_PER_LITER / ML_PER_LITER ) ///< Conversion factor from mL/min to pump motor RPM. #define DOP_GEAR_RATIO 32.0F ///< Pump motor to pump gear ratio. #define DOP_PWM_ZERO_OFFSET 0.1F ///< 10% PWM duty cycle = zero speed. +#define DOP_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. /// Macro converts a flow rate to an estimated PWM duty cycle %. #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 ) ) +#define DOP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ( ( pwm ) - DOP_PWM_ZERO_OFFSET) * DOP_100_PCT_PWM_RPM_RANGE ) * ( 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) / DOP_100_PCT_PWM_RPM_RANGE ) + 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 +350,27 @@ /*********************************************************************//** * @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 ); + F32 targetRate = DOP_ML_PER_MIN_FROM_PWM( pwm ); + + result = setDialOutPumpTargetRate( (U32)targetRate, 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 +493,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; @@ -1661,16 +1685,16 @@ BOOL testSetDialOutPumpTargetDutyCycle( F32 value ) { BOOL result = FALSE; - F32 targetPWM = DOP_ML_PER_MIN_FROM_PWM(value) ; + F32 targetRate = DOP_ML_PER_MIN_FROM_PWM( value ); if ( TRUE == isTestingActivated() ) { // currently conversion can create negative values with values <= 10%. - if ( targetPWM < 0 ) + if ( targetRate < 0 ) { - targetPWM = 0; + targetRate = 0; } - setDialOutPumpTargetRate( (U32)targetPWM, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( (U32)targetRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); result = TRUE; }