Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r29b65975bb4d6a5720ef39119a9af49fafc902fa -r59a959e90acca96b44158dcd65706e83069dc859 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 29b65975bb4d6a5720ef39119a9af49fafc902fa) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 59a959e90acca96b44158dcd65706e83069dc859) @@ -109,7 +109,7 @@ /// Conversion macro from mL/min to estimated PWM duty cycle %. #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) ( ((pwm) - BP_PWM_ZERO_OFFSET) * 4000.0F ) +#define BP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - BP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1 : -1 ) ) /// 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 ) ) ) @@ -1142,8 +1142,8 @@ *************************************************************************/ static void checkBloodPumpSpeeds( void ) { - F32 measMotorSpeed = fabs( getMeasuredBloodPumpSpeed() ); - F32 measMCMotorSpeed = fabs( getMeasuredBloodPumpMCSpeed() ); + F32 measMotorSpeed = getMeasuredBloodPumpSpeed(); + F32 measMCMotorSpeed = getMeasuredBloodPumpMCSpeed(); // Check for pump running while commanded off if ( ( TRUE == isPersistentAlarmTriggered( ALARM_ID_BLOOD_PUMP_OFF_CHECK, @@ -1161,11 +1161,11 @@ // Checks that only occur when pump is running (and beyond ramp). if ( BLOOD_PUMP_CONTROL_TO_TARGET_STATE == bloodPumpState ) { - F32 cmdMotorSpeed = BP_PWM_TO_MOTOR_SPEED_RPM( bloodPumpPWMDutyCyclePctSet ); + F32 cmdMotorSpeed = BP_PWM_TO_MOTOR_SPEED_RPM( bloodPumpPWMDutyCyclePctSet, bloodPumpDirectionSet ); F32 deltaMotorSpeed = fabs( measMotorSpeed - cmdMotorSpeed ); F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = fabs( getMeasuredBloodPumpRotorSpeed() ); - F32 measMotorSpeedInRotorRPM = measMotorSpeed / BP_GEAR_RATIO; + F32 measMotorSpeedInRotorRPM = fabs( measMotorSpeed / BP_GEAR_RATIO ); F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); // Check measured motor speed vs. commanded motor speed while controlling to target Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rac6fc5b74e15c8925e4579c847ddfca8e1e361ad -r59a959e90acca96b44158dcd65706e83069dc859 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision ac6fc5b74e15c8925e4579c847ddfca8e1e361ad) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 59a959e90acca96b44158dcd65706e83069dc859) @@ -108,7 +108,7 @@ #define DIP_PWM_ZERO_OFFSET 0.1F ///< 10% PWM duty cycle = zero speed. /// 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 ) +#define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1 : -1 ) ) /// 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. TODO - this macro does not reverse the function that estimates PWM from target flow rate - and it should @@ -1255,7 +1255,7 @@ static void checkDialInPumpSpeeds( void ) { F32 measMotorSpeed = getMeasuredDialInPumpSpeed(); - F32 measMCMotorSpeed = fabs( getMeasuredDialInPumpMCSpeed() ); + F32 measMCMotorSpeed = getMeasuredDialInPumpMCSpeed(); // Check for pump running while commanded off if ( 0 == targetDialInFlowRate ) @@ -1286,12 +1286,13 @@ // Checks that only occur when pump is running (and beyond ramp). if ( DIAL_IN_PUMP_CONTROL_TO_TARGET_STATE == dialInPumpState ) { - F32 cmdMotorSpeed = DIP_PWM_TO_MOTOR_SPEED_RPM( dialInPumpPWMDutyCyclePctSet ); + F32 cmdMotorSpeed = DIP_PWM_TO_MOTOR_SPEED_RPM( dialInPumpPWMDutyCyclePctSet, dialInPumpDirectionSet ); F32 deltaMotorSpeed = fabs( measMotorSpeed - cmdMotorSpeed ); F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = fabs( getMeasuredDialInPumpRotorSpeed() ); - F32 measMotorSpeedInRotorRPM = measMotorSpeed / DIP_GEAR_RATIO; - F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); + F32 measMotorSpeedInRotorRPM = fabs( measMotorSpeed / DIP_GEAR_RATIO ); + F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); + F32 measMotorSpeedDeltaPct = fabs( deltaRotorSpeed / measMotorSpeedInRotorRPM ); // Check measured motor speed vs. commanded motor speed while controlling to target if ( ( deltaMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) || ( deltaMCMotorSpeed > DIP_MAX_MOTOR_SPEED_ERROR_RPM ) ) Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -rac6fc5b74e15c8925e4579c847ddfca8e1e361ad -r59a959e90acca96b44158dcd65706e83069dc859 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision ac6fc5b74e15c8925e4579c847ddfca8e1e361ad) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 59a959e90acca96b44158dcd65706e83069dc859) @@ -105,7 +105,7 @@ /// 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) ( ( ( pwm ) - DOP_PWM_ZERO_OFFSET) * 4000.0F ) +#define DOP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ( ( pwm ) - DOP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1 : -1 ) ) /// 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 ) @@ -1016,7 +1016,7 @@ static void checkDialOutPumpSpeeds( void ) { F32 measMotorSpeed = getMeasuredDialOutPumpSpeed(); - F32 measMCMotorSpeed = fabs( getMeasuredDialOutPumpMCSpeed() ); + F32 measMCMotorSpeed = getMeasuredDialOutPumpMCSpeed(); // Check for pump running while commanded off if ( dialOutPumpPWMDutyCyclePctSet <= DOP_PWM_ZERO_OFFSET ) @@ -1046,11 +1046,11 @@ if ( DIAL_OUT_PUMP_CONTROL_TO_TARGET_STATE == dialOutPumpState ) { - F32 cmdMotorSpeed = DOP_PWM_TO_MOTOR_SPEED_RPM( dialOutPumpPWMDutyCyclePctSet ); + F32 cmdMotorSpeed = DOP_PWM_TO_MOTOR_SPEED_RPM( dialOutPumpPWMDutyCyclePctSet, dialOutPumpDirectionSet ); F32 deltaMotorSpeed = fabs( measMotorSpeed - cmdMotorSpeed ); F32 deltaMCMotorSpeed = fabs( measMCMotorSpeed - cmdMotorSpeed ); F32 measRotorSpeed = fabs( getMeasuredDialOutPumpRotorSpeed() ); - F32 measMotorSpeedInRotorRPM = measMotorSpeed / DOP_GEAR_RATIO; + F32 measMotorSpeedInRotorRPM = fabs( measMotorSpeed / DOP_GEAR_RATIO ); F32 deltaRotorSpeed = fabs( measRotorSpeed - measMotorSpeedInRotorRPM ); // Check measured motor speed vs. commanded motor speed while controlling to target