Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r25b2d5e091ddc83b0483f535e440ce232b7219dd -r41baa5b8828f2a2b1d19b51a4c908f1871a801b1 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 25b2d5e091ddc83b0483f535e440ce232b7219dd) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 41baa5b8828f2a2b1d19b51a4c908f1871a801b1) @@ -110,6 +110,8 @@ #define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET ) /// 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 ) +/// 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. #define DIP_ML_PER_MIN_FROM_PWM(pwm) ( (( pwm - DIP_PWM_ZERO_OFFSET) * 684.73F ) + 49.121F ) @@ -793,7 +795,7 @@ } else { //Use blended or calculated flow rate - F32 motorRPM = getMeasuredDialInPumpRotorSpeed(); + F32 motorRPM = getMeasuredDialInPumpMCSpeed(); U32 r = getDialInPumpRotorCount(); U32 rotCount = CAP( r, DIAL_IN_MAX_ROTOR_COUNT_FOR_WEAR ); F32 wearFactor = DIAL_IN_FLOW_WEAR_A_TERM * (F32)rotCount + DIAL_IN_FLOW_WEAR_B_TERM; @@ -828,16 +830,15 @@ *************************************************************************/ static F32 dialysateInPumpPWMFromTargetFlowRate( F32 QdTarget ) { - F32 uncorrectedPWM = DIP_PWM_FROM_ML_PER_MIN( QdTarget ); U32 r = getDialInPumpRotorCount(); U32 rotCount = CAP( r, DIAL_IN_MAX_ROTOR_COUNT_FOR_WEAR ); F32 wearFactor = DIAL_IN_FLOW_WEAR_A_TERM * (F32)rotCount + DIAL_IN_FLOW_WEAR_B_TERM; F32 Pest = DIAL_IN_FLOW_PEST_A_TERM * ( QdTarget * QdTarget ) + DIAL_IN_FLOW_PEST_B_TERM * QdTarget + DIAL_IN_FLOW_PEST_C_TERM; F32 alphaTerm = wearFactor * Pest + DIAL_IN_FLOW_A_ZERO; + F32 rpmTgt = QdTarget * DIAL_IN_GEAR_RATIO / ( 2 * DIAL_IN_STROKE_VOLUME * alphaTerm ); + F32 pwmDC = DIP_MOTOR_SPEED_RPM_TO_PWM( rpmTgt ); - F32 correctedPWM = QdTarget * DIAL_IN_GEAR_RATIO / ( 2 * DIAL_IN_STROKE_VOLUME * alphaTerm ); - - return correctedPWM; + return pwmDC; } /*********************************************************************//**