Index: firmware/App/Controllers/DryBiCart.c =================================================================== diff -u -rde7ed4edf09692eb9b461b5fb9f73eb5f0a47bb6 -r7a2819655e470bb6a6c922a9b24ac1c6ee4b3c0a --- firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision de7ed4edf09692eb9b461b5fb9f73eb5f0a47bb6) +++ firmware/App/Controllers/DryBiCart.c (.../DryBiCart.c) (revision 7a2819655e470bb6a6c922a9b24ac1c6ee4b3c0a) @@ -46,13 +46,13 @@ // Dry Bicart Fill #define DRY_BICART_FILL_PERSISTANCE_DURATION_MS 200 ///< Fill persistence duration to overcome the pressure over shoot for beta 1.9 and beta 2.0. -#define DRY_BICART_FILL_DURATION_MIN_MS ( 2 * MS_PER_SECOND + \ +#define DRY_BICART_FILL_DURATION_MIN_MS ( ( 2 * MS_PER_SECOND ) + \ DRY_BICART_FILL_PERSISTANCE_DURATION_MS ) ///< Minimum fill duration to be met to end the fill cycle. #define DRY_BICART_FILL_COMPLETE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Wait time to reset the request flag after fill complete #define DRY_BICART_FILL_DURATION_DIFF_MS 750 ///< Fill duration difference between last and current fill cycle. -#define PRESSURE_OFFSET 2 ///< Dry bicart pressure offset. -#define DRY_BICART_FILL_COMPLETE_PRESSURE ( 10.0F + PRESSURE_OFFSET ) ///< Maximum pressure reached to indicate the dry bicart fill being completed. +#define PRESSURE_OFFSET_PSI 2 ///< Dry bicart pressure offset. +#define DRY_BICART_FILL_COMPLETE_PRESSURE ( 10.0F + PRESSURE_OFFSET_PSI ) ///< Maximum pressure reached to indicate the dry bicart fill being completed. #define DRY_BICART_FILL_INITIATE_PRESSURE 1.5F ///< Minimum pressure required to initiate the dry bicart fill process. #define DRY_BICART_FILL_COMPLETE_SUPPLY_PRESSURE 6.0F ///< Maximum pressure allowed at bicart fill during supply process/state #define DRY_BICART_FILL_INITIATE_SUPPLY_PRESSURE 3.0F ///< Minimum pressure required to initiate the dry bicart fill during supply process/state @@ -80,8 +80,8 @@ #define DRY_BICART_DRAIN_COND_STABLE_SAMPLES 10U ///< Debounce samples (10*50ms=500ms) // drybicarb mixing -#define BICARB_VOL_CONTROL_P_COEFFICIENT 0.00008484 ///< Bicarb proportional gain (kp) -#define BICARB_VOL_CONTROL_I_COEFFICIENT 0.00033936 ///< Bicarb integral gain. (ki) +#define BICARB_VOL_CONTROL_P_COEFFICIENT ( 0.00008484 / 5) ///< Bicarb proportional gain (kp) +#define BICARB_VOL_CONTROL_I_COEFFICIENT ( 0.00033936 / 5) ///< Bicarb integral gain. (ki) #define MIN_BICARB_VOLUME_ML 0.868686869 ///< Minimum bicarb volume in mL #define MAX_BICARB_VOLUME_ML 1.8 ///< Maximum bicarb volume in mL @@ -105,9 +105,13 @@ #define MIX_NO_FEED_FORWARD 0.0F ///< Feedforward term for dialysate closed loop control -#define MIXING_CONTROL_INTERVAL_MS ( 15 * MS_PER_SECOND ) ///< Dialysate mixing control interval in ms -#define MIXING_CONTROL_INTERVAL ( MIXING_CONTROL_INTERVAL_MS /\ - TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate mixing is controlled. +#define MIX_CONTROL_INTERVAL_MS ( 15 * MS_PER_SECOND ) ///< Dialysate dosing control interval in ms +#define BICARB_MIX_CONTROL_INTERVAL ( 3 * MS_PER_SECOND /\ + TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate dose is controlled. +#define ACID_MIX_CONTROL_INTERVAL ( MIX_CONTROL_INTERVAL_MS /\ + TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate dose is controlled. +#define BICARB_DEADBAND_CONTROL 50 ///< Dry Bicarb dead band control +#define ACID_DEADBAND_CONTROL 100 ///< Acid dead band control /// Payload record structure for dry bicart fill request typedef struct @@ -203,7 +207,7 @@ static OVERRIDE_F32_T dryBiCartDialysateTargetConductivity; ///< Acid bicarb mix conductivity static OVERRIDE_F32_T dryBiCartDialysateDeltaConductivity; ///< Acid bicarb delta conductivity -static OVERRIDE_F32_T dryBiCartMixControlInterval; ///< Mix control interval +static OVERRIDE_U32_T dryBiCartMixControlInterval; ///< Mix control interval static PI_CONTROLLER_SIGNALS_DATA bicarbControlSignals; ///< Bicarb closed loop control signal data static PI_CONTROLLER_SIGNALS_DATA acidControlSignals; ///< Acid closed loop control signal data @@ -251,7 +255,7 @@ static F32 getAcidKiGainCoefficient( void ); static F32 getDryBicartLowerCartPressure( void ); static F32 getDryBicartUpperCartPressure( void ); -static F32 getDryBicartMixControlInterval( void ); +static U32 getDryBicartMixControlInterval( void ); // publish the status static void publishDryBicartData( void ); @@ -370,9 +374,9 @@ dryBiCartLowerCartPressure.ovInitData = 0.0F; dryBiCartLowerCartPressure.override = OVERRIDE_RESET; - dryBiCartMixControlInterval.data = MIXING_CONTROL_INTERVAL; - dryBiCartMixControlInterval.ovData = MIXING_CONTROL_INTERVAL; - dryBiCartMixControlInterval.ovInitData = 0.0F; + dryBiCartMixControlInterval.data = BICARB_MIX_CONTROL_INTERVAL; + dryBiCartMixControlInterval.ovData = BICARB_MIX_CONTROL_INTERVAL; + dryBiCartMixControlInterval.ovInitData = 0; dryBiCartMixControlInterval.override = OVERRIDE_RESET; dryBiCartFillStartTime = 0; @@ -1002,9 +1006,9 @@ * @details \b Outputs: none * @return TRUE if successful, FALSE if not. *************************************************************************/ -static F32 getDryBicartMixControlInterval( void ) +static U32 getDryBicartMixControlInterval( void ) { - F32 result = getF32OverrideValue( &dryBiCartMixControlInterval ); + U32 result = getU32OverrideValue( &dryBiCartMixControlInterval ); return result; } @@ -1088,38 +1092,51 @@ { DIALYSATE_MIXING_STATE_T state = DIALYSATE_MIXING_CONTROL_TO_TARGET_STATE; - // control at set minimum interval or interval is expired and balance chamber fill is complete - if ( ( ++dialysateMix[ mixId ].controlTimerCounter >= getDryBicartMixControlInterval() ) ) + if ( BICARB_MIX_ID == mixId ) { - dialysateMix[ mixId ].controlTimerCounter = 0; - - // Control based on the measured and target conductivity - if ( BICARB_MIX_ID == mixId ) + // control at set minimum interval + if ( ( ++dialysateMix[ mixId ].controlTimerCounter >= getDryBicartMixControlInterval() ) ) { + dialysateMix[ mixId ].controlTimerCounter = 0; + + // Control based on the measured and target conductivity PI_CONTROLLER_SIGNALS_DATA debugBicarbControl; F32 measuredBicarbConductivity; measuredBicarbConductivity = getFilteredConductivity( D17_COND ); + F32 bicarbMixVol = runPIController( PI_CONTROLLER_ID_BICARB_VOL, getBicarbTargetConductivity(), measuredBicarbConductivity ); - //Set bicarb dosing vol - setBicarbMixVol( bicarbMixVol ); + if ( fabs ( getBicarbTargetConductivity() - measuredBicarbConductivity ) > BICARB_DEADBAND_CONTROL ) + { + //Set bicarb mix vol only if its above dead band threshold, else use the previous calculated vlaue + setBicarbMixVol( bicarbMixVol ); + } + debugBicarbControl = getDebugPIControllerSignals( PI_CONTROLLER_ID_BICARB_VOL ); memcpy( (void*)&bicarbControlSignals, (void*)&debugBicarbControl, sizeof(PI_CONTROLLER_SIGNALS_DATA) ); } - // ACID Mix - else if ( ACID_MIX_ID == mixId ) + } + + if ( ACID_MIX_ID == mixId ) + { + // control at set minimum interval + if ( ( ++dialysateMix[ mixId ].controlTimerCounter >= ACID_MIX_CONTROL_INTERVAL ) ) { - F32 measuredAcidBicarbMixConductivity; + dialysateMix[ mixId ].controlTimerCounter = 0; + + F32 measuredAcidBicarbMixConductivity = getFilteredConductivity( D27_COND ); PI_CONTROLLER_SIGNALS_DATA debugAcidControl; - measuredAcidBicarbMixConductivity = getFilteredConductivity( D27_COND ); - F32 acidMixVol = runPIController( PI_CONTROLLER_ID_ACID_VOL, getAcidBicarbTargetConductivity(), measuredAcidBicarbMixConductivity ); - //Set acid dosing vol - setAcidMixVol( acidMixVol ); + if ( fabs ( getAcidBicarbTargetConductivity() - measuredAcidBicarbMixConductivity ) > ACID_DEADBAND_CONTROL ) + { + // set acid mix volume if its above dead band threshold , else use previously calculated value + setAcidMixVol( acidMixVol ); + } + debugAcidControl = getDebugPIControllerSignals( PI_CONTROLLER_ID_ACID_VOL ); memcpy( (void*)&acidControlSignals, (void*)&debugAcidControl, sizeof(PI_CONTROLLER_SIGNALS_DATA) ); @@ -1238,16 +1255,24 @@ if ( d66Pressure >= MAX_DRY_BICART_FILL_COMPLETE_PRESSURE ) { setValveState( D65_VALV, VALVE_STATE_CLOSED ); + + lastFillDurationInMS = currentFillDurationInMS; + currentFillDurationInMS = calcTimeSince( dryBiCartFillStartTime ); + //Increment number of fill cycle + biCartFillCycleCounter++; + + state = DRY_BICART_DEGAS_START_STATE; } - // 200 ms persistence on D66 pressure + // 200 ms persistence on D66 pressure since pressure overshoot just after D65 opening if ( TRUE == didTimeout( dryBiCartFillStartTime, DRY_BICART_FILL_PERSISTANCE_DURATION_MS ) ) { - setValveState( D65_VALV, VALVE_STATE_CLOSED ); + lastFillDurationInMS = currentFillDurationInMS; currentFillDurationInMS = calcTimeSince( dryBiCartFillStartTime ); //Increment number of fill cycle biCartFillCycleCounter++; + state = DRY_BICART_DEGAS_START_STATE; } } @@ -2232,4 +2257,21 @@ return result; } +/*********************************************************************//** + * @brief + * The testDryBiCartMixControlIntervalOverride function sets the override value + * of mix control interval + * @details Inputs: dryBiCartMixControlInterval + * @details Outputs: dryBiCartMixControlInterval + * @param message Override message from Dialin which includes the override + * value to override the bicart lower pressure. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testDryBiCartMixControlIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32Override( message, &dryBiCartMixControlInterval, 0, BICARB_MIX_CONTROL_INTERVAL ); + + return result; +} + /**@}*/ Index: firmware/App/Controllers/DryBiCart.h =================================================================== diff -u -rfd897db8177752330ad08d877e0a13620513dbdc -r7a2819655e470bb6a6c922a9b24ac1c6ee4b3c0a --- firmware/App/Controllers/DryBiCart.h (.../DryBiCart.h) (revision fd897db8177752330ad08d877e0a13620513dbdc) +++ firmware/App/Controllers/DryBiCart.h (.../DryBiCart.h) (revision 7a2819655e470bb6a6c922a9b24ac1c6ee4b3c0a) @@ -115,6 +115,7 @@ BOOL testDryBiCartUpperCartPressureOverride( MESSAGE_T *message ); BOOL testDryBiCartLowerCartPressureOverride( MESSAGE_T *message ); +BOOL testDryBiCartMixControlIntervalOverride( MESSAGE_T *message ); /**@}*/ #endif