Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rdc7d8d337cb5f3647e3cbd1bcd054d83fbe7bd2a -r58c80a59c771c57ba9047ef4d6da2aa74430a0e3 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision dc7d8d337cb5f3647e3cbd1bcd054d83fbe7bd2a) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 58c80a59c771c57ba9047ef4d6da2aa74430a0e3) @@ -126,14 +126,16 @@ //Hybrid flow rate algorithm parameters #define DIAL_IN_FLOW_A_ZERO 1.267F ///< Y intercept used for alpha flow coefficient calculation. -#define DIAL_IN_FLOW_WEAR_A_TERM 0.000000003551F ///< A term used for wear portion of alpha flow coefficient. -#define DIAL_IN_FLOW_WEAR_B_TERM 0.002244F ///< B term used for wear portion of alpha flow coefficient. +#define DIAL_IN_FLOW_WEAR_A_TERM 0.000000003551F ///< A term used for wear portion of alpha flow coefficient (m'). +#define DIAL_IN_FLOW_WEAR_B_TERM 0.002244F ///< B term used for wear portion of alpha flow coefficient (m0). #define DIAL_IN_FLOW_QHIGHTRANSITION 400.0F ///< High flow rate transition for blended algorithm #define DIAL_IN_FLOW_QLOWTRANSITION 300.0F ///< Low flow rate transition for blended algorithm #define DIAL_IN_FLOW_PEST_A_TERM -0.000491F ///< a (2nd order) term in polynomial fit for pressure estimation #define DIAL_IN_FLOW_PEST_B_TERM -0.04672F ///< b (first order) term in polynomial fit for pressure estimation #define DIAL_IN_FLOW_PEST_C_TERM 18.648F ///< c (zero order) term in polynomial fit for pressure estimation #define DIAL_IN_MAX_ROTOR_COUNT_FOR_WEAR 25000 ///< Maximum rotor count for determining wear of the cartridge (negligible affect beyond this threshold). +#define DIAL_IN_STROKE_VOLUME 3.405 ///< Stroke volume (SV) used for Flow Estimation ALgorithm +#define DIAL_IN_GEAR_RATIO 32 ///< Gear ratio used for Flow Estimation ALgorithm /// Enumeration of dialysate inlet pump states. typedef enum DialInPump_States @@ -781,7 +783,6 @@ *************************************************************************/ static F32 calcDialInFlow( void ) { - F32 estimatedFlow; F32 QdTarget = getTargetDialInFlowRate(); @@ -792,14 +793,15 @@ } else { //Use blended or calculated flow rate - F32 pumpRPM = getMeasuredDialInPumpRotorSpeed(); + F32 motorRPM = getMeasuredDialInPumpRotorSpeed(); U32 r = getDialInPumpRotorCount(); - U32 rotCnt = CAP( r, DIAL_IN_MAX_ROTOR_COUNT_FOR_WEAR ); - F32 wear = DIAL_IN_FLOW_WEAR_A_TERM * (F32)rotCnt + DIAL_IN_FLOW_WEAR_B_TERM; + 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 alpha = wear * Pest + DIAL_IN_FLOW_A_ZERO; - F32 calculatedFlow = ( alpha * pumpRPM * ML_PER_LITER ) / DIP_REV_PER_LITER; + F32 alphaTerm = wearFactor * Pest + DIAL_IN_FLOW_A_ZERO; + F32 calculatedFlow = ( motorRPM * 2 * DIAL_IN_STROKE_VOLUME/DIAL_IN_GEAR_RATIO ) * alphaTerm; + if ( ( QdTarget < DIAL_IN_FLOW_QHIGHTRANSITION ) && ( QdTarget >= DIAL_IN_FLOW_QLOWTRANSITION ) ) { // use blended flow rate calculation estimatedFlow = ( ( QdTarget - DIAL_IN_FLOW_QLOWTRANSITION ) / ( DIAL_IN_FLOW_QHIGHTRANSITION - DIAL_IN_FLOW_QLOWTRANSITION ) ) * calculatedFlow + @@ -828,12 +830,13 @@ { F32 uncorrectedPWM = DIP_PWM_FROM_ML_PER_MIN( QdTarget ); U32 r = getDialInPumpRotorCount(); - U32 rotCnt = CAP( r, DIAL_IN_MAX_ROTOR_COUNT_FOR_WEAR ); - F32 wear = DIAL_IN_FLOW_WEAR_A_TERM * (F32)rotCnt + 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 alpha = wear * Pest + DIAL_IN_FLOW_A_ZERO; - F32 correctedPWM = ( uncorrectedPWM / alpha ); + 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 correctedPWM = ( QdTarget * DIAL_IN_GEAR_RATIO/ ( 2 * DIAL_IN_STROKE_VOLUME * alphaTerm ); + return correctedPWM; }