Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r1644c24b0b51661ceaba579e5ebee0d1d5bad85f -r09583a9e0a51bb47dd04c825cd706f5a3774bded --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 1644c24b0b51661ceaba579e5ebee0d1d5bad85f) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 09583a9e0a51bb47dd04c825cd706f5a3774bded) @@ -69,7 +69,9 @@ /// Volume output per pulse. #define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) -#define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. +//Testing +#define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 50 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. +//#define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. #define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 100 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. #define CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Concentrate pumps speed out of range timeout in milliseconds. @@ -155,7 +157,7 @@ //static DD_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. //static DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. -//static DD_UF_PUMP_RECORD_T ultrafilterationPumpCalRecord; ///< Ultrafilteration pump calibration record. +//static DD_UF_PUMP_RECORD_T ultrafiltrationPumpCalRecord; ///< Ultrafiltration pump calibration record. //static DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsCalRecord; ///< Concentrate pumps calibration record. // ********** private function prototypes ********** @@ -533,7 +535,14 @@ if ( targetVolume_ml > 0.0 ) { #ifndef __PUMPTEST__ - pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ); + if ( DOSING_CONT_VOLUME == targetVolume_ml ) + { + pumpTargetRevCnt[ pumpId ].data = DOSING_CONT_VOLUME; + } + else + { + pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * CONCENTRATE_PUMP_VOLUME_TO_REVOLUTION ); + } #else pumpTargetRevCnt[ pumpId ].data = (U32)( targetVolume_ml * PISTON_PUMP_VOLUME_TO_REVOLUTION ); #endif Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r2c61c4a7037fd5a22ecbcd5732d91d3166ef8c5b -r09583a9e0a51bb47dd04c825cd706f5a3774bded --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 2c61c4a7037fd5a22ecbcd5732d91d3166ef8c5b) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 09583a9e0a51bb47dd04c825cd706f5a3774bded) @@ -17,6 +17,7 @@ #include // Used for mathematical operations +#include "Conductivity.h" #include "FpgaDD.h" #include "Heaters.h" #include "Level.h" @@ -51,6 +52,7 @@ #define HEATERS_DUTY_CYCLE_CONVERSION_FACTOR 100.0F ///< Heaters duty cycle 0: OFF, 100: 100% duty cycle. #define HEATERS_ZERO_EFFICIENCY 0.0F ///< Zero heater efficiency #define HEATER_CNTL_TRANSFER_DELTA_TEMP_C 0.50F ///< AC heater delta temperature to transfer control from open to close loop +#define MAX_ADJ_DELTA_TEMP_C 2.0F ///< Maximum adjusted delta temperature to add/remove from calculated target temperature #define D5_HEAT_TX_INIT_FEED_FORWARD 0.0F ///< Initial Feed forward term for heater control //#define D5_HEAT_TX_P_COEFFICIENT 0.050F ///< P Term for AC primary heater control during treatment mode. @@ -80,6 +82,7 @@ #define D5_HEAT_CONTROL_INTERVAL_COUNT ( D5_HEAT_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) ///< Primary heater control interval count. #define D45_HEAT_CONTROL_INTERVAL_MS ( 1 * MS_PER_SECOND ) ///< Trimmer heater control interval in milli seconds #define D45_HEAT_CONTROL_INTERVAL_COUNT ( D45_HEAT_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) ///< Trimmer heater control interval count. +#define D5_TARGET_TEMP_ADJUST_INTERVAL_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Adjust primary target temperature #define PRIMARY_HEATER_MAX_PWR_WATTS 1400.0F ///< AC Primary Heater Max Power consumeption in Watts #define TX_PRIMARY_HEATER_MAX_PWR_WATTS 700.0F ///< Estimated power to be supplied to the primary heater during treatement mode #define HEAT_PRIMARY_HEATER_MAX_PWR_WATTS 980.0F ///< Estimated power to be supplied to the primary heater during heat disinfect mode @@ -122,6 +125,9 @@ static OVERRIDE_F32_T pwmPeriod[ NUM_OF_DD_HEATERS ]; ///< Total PWM period ( ON state + Off State of PWM) static U32 controlInterval[ NUM_OF_DD_HEATERS ]; ///< Heater control interval time. static U32 dataPublicationTimerCounter; ///< Data publication timer counter. +static U32 primaryTargetTempAdjCounter; ///< Primary target temperature adjustment counter. +static BOOL isTargetTempAdjusted; ///< Flag indicating that target temperature is adjusted +static U32 adjustedTargetTemp; ///< Adjusted primary target temperature static const F32 WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES = 4184.0F / (F32)SEC_PER_MIN; ///< Water specific heat in J/KgC / 60. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. static F32 convertDC; ///< AC Heater converted duty cycle @@ -138,6 +144,7 @@ static HEATERS_STATE_T handleHeaterStateRampToTarget( DD_HEATERS_T heater ); static HEATERS_STATE_T handleHeaterStateControlToTarget( DD_HEATERS_T heater ); static HEATERS_STATE_T handleHeaterStateControlToDisinfectTarget( DD_HEATERS_T heater ); +static void updatePrimaryHeaterTargetTemp( DD_HEATERS_T heater ); static F32 calculateDutyCycle( F32 flowrate, F32 deltaTemp, F32 power, F32 efficiency, F32 min, F32 max ); static void setHeaterControl( DD_HEATERS_T heater ); @@ -188,6 +195,9 @@ heatersStatus[ D45_HEAT ].controlIntervalCounter = 0; startupHeaterControl = TRUE; lastDialTargetTemperatureSet = 0.0F; + primaryTargetTempAdjCounter = 0; + adjustedTargetTemp = 0.0F; + isTargetTempAdjusted = FALSE; for ( heater = DD_HEATERS_FIRST; heater < NUM_OF_DD_HEATERS; heater++ ) { @@ -342,12 +352,69 @@ { // Set flag to recalculate the feedforward signals startupHeaterControl = TRUE; + isTargetTempAdjusted = FALSE; } } } /*********************************************************************//** * @brief + * The signaltoResetAdjustedTargetTemp function resets the flag to + * update/adjust the target dialysate temperature + * @details \b Inputs: none + * @details \b Outputs: isTargetTempAdjusted + * @param heater: heater ID to update the heater control. + * @return none + *************************************************************************/ +void signaltoResetAdjustedTargetTemp( DD_HEATERS_T heater ) +{ + if ( D5_HEAT == heater ) + { + isTargetTempAdjusted = FALSE; + } +} + +/*********************************************************************//** + * @brief + * The updatePrimaryHeaterTargetTemp function adjusts the previosuly calcualted + * target dialysate temperature + * @details \b Inputs: Set Target Temperature, D28 Temp + * @details \b Outputs: Adjusted target temperature + * @param heater: heater ID to update the heater control. + * @return none + *************************************************************************/ +static void updatePrimaryHeaterTargetTemp( DD_HEATERS_T heater ) +{ + if ( D5_HEAT == heater ) + { + if ( ++primaryTargetTempAdjCounter >= D5_TARGET_TEMP_ADJUST_INTERVAL_MS ) + { + F32 targetTempfromTD = getTDTargetDialysateTemperature(); + F32 measuredTempAtDialyzer = getConductivityTemperatureValue( D27_COND ); + F32 calcTargetTemp = getHeaterTargetTemperature( heater ); + F32 deltaTempC = targetTempfromTD - measuredTempAtDialyzer; + F32 capDeltaTempC = MIN( fabs(deltaTempC), MAX_ADJ_DELTA_TEMP_C ); + + if ( deltaTempC > HEATERS_ZERO_DELTA_TEMP_C ) + { + adjustedTargetTemp = calcTargetTemp + capDeltaTempC; + } + else + { + adjustedTargetTemp = calcTargetTemp - capDeltaTempC; + } + + adjustedTargetTemp = MIN(adjustedTargetTemp, ( calcTargetTemp + MAX_ADJ_DELTA_TEMP_C ) ); + adjustedTargetTemp = MAX(adjustedTargetTemp, ( calcTargetTemp - MAX_ADJ_DELTA_TEMP_C ) ); + + isTargetTempAdjusted = TRUE; + primaryTargetTempAdjCounter = 0; + } + } +} + +/*********************************************************************//** + * @brief * The startHeater function starts the given heater by setting the flag. * @details \b Inputs: heatersStatus * @details \b Outputs: startHeaterSignal @@ -631,6 +698,8 @@ F32 measuredTemperature = 0.0F; F32 ctrl = 0.0F; + updatePrimaryHeaterTargetTemp( heater ); + if ( ++heatersStatus[ heater ].controlIntervalCounter >= controlInterval[ heater ] ) { if ( D5_HEAT == heater ) @@ -652,6 +721,10 @@ } else { + if ( TRUE == isTargetTempAdjusted ) + { + targetTemperature = adjustedTargetTemp; + } F32 deltaTempC = fabs( targetTemperature - measuredTemperature ); if ( deltaTempC >= D5_HEATER_DEADBAND_CONTROL ) @@ -857,9 +930,11 @@ HEATERS_DATA_T data; data.d5_HeaterDC = getHeaterControl( D5_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; - data.d45_HeaterDC = getHeaterControl( D45_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; + data.d45_HeaterDC = getTDTargetDialysateTemperature(); + //data.d45_HeaterDC = getHeaterControl( D45_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; data.d5_HeaterTargetTemp = getHeaterTargetTemperature( D5_HEAT ); - data.d45_HeaterTargetTemp = getHeaterTargetTemperature( D45_HEAT ); + data.d45_HeaterTargetTemp = adjustedTargetTemp; + //data.d45_HeaterTargetTemp = getHeaterTargetTemperature( D45_HEAT ); data.d5_HeaterState = heatersStatus[ D5_HEAT ].state; data.d45_HeaterState = heatersStatus[ D45_HEAT ].state; #ifndef __HEATERS_DEBUG__ Index: firmware/App/DDCommon.h =================================================================== diff -u -r734bf9d37fee349983baba56e3590600b4606241 -r09583a9e0a51bb47dd04c825cd706f5a3774bded --- firmware/App/DDCommon.h (.../DDCommon.h) (revision 734bf9d37fee349983baba56e3590600b4606241) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision 09583a9e0a51bb47dd04c825cd706f5a3774bded) @@ -25,8 +25,9 @@ #define DD_VERSION_MAJOR 0 #define DD_VERSION_MINOR 0 #define DD_VERSION_MICRO 0 -#define DD_VERSION_BUILD 9 +#define DD_VERSION_BUILD 30 + // ********** development build switches ********** #ifndef _RELEASE_ Index: firmware/App/Drivers/TemperatureSensors.c =================================================================== diff -u -r2c61c4a7037fd5a22ecbcd5732d91d3166ef8c5b -r09583a9e0a51bb47dd04c825cd706f5a3774bded --- firmware/App/Drivers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 2c61c4a7037fd5a22ecbcd5732d91d3166ef8c5b) +++ firmware/App/Drivers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 09583a9e0a51bb47dd04c825cd706f5a3774bded) @@ -264,9 +264,10 @@ //Read Baro temperature sensor if ( getCurrentOperationMode() != DD_MODE_INIT ) { +#ifdef ENABLE_ALARM_1 // Make sure the baro sensor coefficients are not corrupted checkBaroSensorCRC(); - +#endif baroConvConsts.refTemperature = getFPGABaroReferenceTemperature(); baroConvConsts.temperatureCoeff = getFPGABaroTempCoeffOfTemperature(); lastBaroTempReadCounter.data = (U32)getFPGABaroReadCount(); @@ -330,7 +331,9 @@ static void checkTemperatureSensors( void ) { checkFPGAPersistentAlarms( FPGA_PERS_ERROR_RTD_ADC_TEMP_SENSORS, getTemperatureSensorsReadCount() ); +#ifdef ENABLE_ALARM_1 checkFPGAPersistentAlarms( FPGA_PERS_ERROR_BARO_SENSOR, getBaroTempSensorsReadCount() ); +#endif } /*********************************************************************//** Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r2c61c4a7037fd5a22ecbcd5732d91d3166ef8c5b -r09583a9e0a51bb47dd04c825cd706f5a3774bded --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 2c61c4a7037fd5a22ecbcd5732d91d3166ef8c5b) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 09583a9e0a51bb47dd04c825cd706f5a3774bded) @@ -116,11 +116,6 @@ *************************************************************************/ U32 execStandbyMode( void ) { - if ( TRUE == areInletWaterConditionsAlarmsActive() ) - { - standbyState = DD_STANDBY_MODE_STATE_PAUSE; - } - // execute current Standby state switch ( standbyState ) { @@ -143,31 +138,6 @@ /*********************************************************************//** * @brief - * The areInletWaterConditionsAlarmsActive function checks whether the inlet - * water pressure conditions are out of range and any of their alarms are active. - * @details \b Inputs: Input and Output pressure of water inlet pressur regulator. - * @details \b Outputs: None - * @return TRUE if any of the alarms are active, otherwise, FALSE - *************************************************************************/ -BOOL areInletWaterConditionsAlarmsActive( void ) -{ - BOOL status = FALSE; - - //TODO: testing - Comment water pressure check - // Check Inlet Water Pressure - both Water inlet pressure Input, pressure Output after pressure regulator. - // checkInletWaterPressure(); - - // Check any active alarms - status |= isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_LOW_RANGE ); - status |= isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_OUT_HIGH_RANGE ); - status |= isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_HIGH_RANGE ); - status |= isAlarmActive( ALARM_ID_DD_INLET_WATER_PRESSURE_IN_LOW_RANGE ); - - return status; -} - -/*********************************************************************//** - * @brief * The handleStandbyIdleState function executes the idle state of the * standby mode state machine. * @details \b Inputs: pendingSampleWaterRequest, pendingStartDDPreGenRequest, @@ -240,11 +210,6 @@ { DD_STANDBY_MODE_STATE_T state = DD_STANDBY_MODE_STATE_PAUSE; - if ( FALSE == areInletWaterConditionsAlarmsActive() ) - { - state = DD_STANDBY_MODE_STATE_IDLE; - } - return state; } Index: firmware/source/sys_main.c =================================================================== diff -u -re12eefac42a3806a34f3ddac6df30bbb5ca51f6f -r09583a9e0a51bb47dd04c825cd706f5a3774bded --- firmware/source/sys_main.c (.../sys_main.c) (revision e12eefac42a3806a34f3ddac6df30bbb5ca51f6f) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 09583a9e0a51bb47dd04c825cd706f5a3774bded) @@ -85,6 +85,7 @@ #include "Timers.h" #include "Temperature.h" #include "Utilities.h" +#include "Ultrafiltration.h" #include "Valves.h" #include "WatchdogMgmt.h" @@ -182,7 +183,8 @@ initOperationModes(); initTestConfigs(); initTDInterface(); - initROInterface(); + initFPInterface(); + initUltrafiltration(); #ifdef __PUMPTEST__ initPistonPump(); #endif