Index: firmware/App/Controllers/BalancingChamber.c =================================================================== diff -u -r02dbfcdab541781a4ba310eb6e7f9278c0764887 -r483ebbb75171ec93ab24d1f69f83a6248376266f --- firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 02dbfcdab541781a4ba310eb6e7f9278c0764887) +++ firmware/App/Controllers/BalancingChamber.c (.../BalancingChamber.c) (revision 483ebbb75171ec93ab24d1f69f83a6248376266f) @@ -66,6 +66,9 @@ #define BC_BICARB_SPEED_OFFSET_MLPM 240.0F ///< Bicarb speed formula offset (mL/min). #define BC_BICARB_SPEED_DISC_CONST 230400.0F ///< Bicarb speed formula discriminant constant. #define BC_BICARB_SPEED_DISC_VOL_COEF 96000.0F ///< Bicarb speed formula volume coefficient. +#define BC_ACID_SPEED_OFFSET_MLPM 160.0F +#define BC_ACID_SPEED_DISC_CONSTANT 102400.0F +#define BC_ACID_SPEED_DISC_VOL_COEF 96000.0F /// Payload record structure for balancing chamber switch only request typedef struct @@ -142,6 +145,7 @@ static void closeFreshSideValvesWhenFillComplete( void ); static void calculateBalancingChamberError( void ); static F32 getBicarbConcentratePumpSpeedMlMin( F32 bicarbVolumeMl ); +static F32 getAcidConcentratePumpSpeedMlMin( F32 acidVolumeMl ); static void startBalChamberConcPumpDosing( F32 acidVolume, F32 bicarbVolume ); /*********************************************************************//** @@ -210,6 +214,41 @@ /*********************************************************************//** * @brief + * The getAcidConcentratePumpSpeedMlMin function computes D11 pump speed + * from the instantaneous acid mix volume: + * speed = 160 - sqrt(102400 - 96000*v) / 2 + * Result is clamped to [CONCENTRATE_PUMP_MIN_SPEED, CONCENTRATE_PUMP_MAX_SPEED]. + * @details \b Inputs: acidVolumeMl + * @details \b Outputs: none + * @param acidVolumeMl Instantaneous acid mix volume (mL) + * @return Acid concentrate pump speed (mL/min) + *************************************************************************/ +static F32 getAcidConcentratePumpSpeedMlMin( F32 acidVolumeMl) +{ + + F32 discriminant = BC_ACID_SPEED_DISC_CONSTANT - ( BC_ACID_SPEED_DISC_VOL_COEF * acidVolumeMl ); + F32 result = 0.0F; + + if ( discriminant < 0.0F ) + { + discriminant = 0.0F; + } + + result = BC_ACID_SPEED_OFFSET_MLPM - ( sqrtf( discriminant ) / 2.0F ); + + if ( result > CONCENTRATE_PUMP_MAX_SPEED ) + { + result = CONCENTRATE_PUMP_MAX_SPEED; + } + else if ( result < 0.0F ) + { + result = CONCENTRATE_PUMP_MIN_SPEED; + } + + return result; +} +/*********************************************************************//** + * @brief * The getBicarbConcentratePumpSpeedMlMin function computes D10 pump speed * from the instantaneous bicarb mix volume: * speed = 240 - sqrt(230400 - 96000*v) / 2 @@ -256,7 +295,7 @@ *************************************************************************/ static void startBalChamberConcPumpDosing( F32 acidVolume, F32 bicarbVolume ) { - F32 acidSpeed = DOSING_ACID_CONCENTRATE_PUMP_SPEED; + F32 acidSpeed = getAcidConcentratePumpSpeedMlMin( acidVolume ); F32 bicarbSpeed = getBicarbConcentratePumpSpeedMlMin( bicarbVolume ); setConcentratePumpTargetSpeed( D11_PUMP, acidSpeed, acidVolume );