Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r3f8d037ec63961e553b5ec67553332db829c9dac -rb36ca0b49c410f690519c0622990825fd5dba500 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 3f8d037ec63961e553b5ec67553332db829c9dac) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision b36ca0b49c410f690519c0622990825fd5dba500) @@ -152,6 +152,7 @@ static OVERRIDE_F32_T measuredPumpSpeed[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Measured concentrate pump speed (mL/min). static OVERRIDE_U32_T parked[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Concentrate pump is currently parked (T/F). static OVERRIDE_U32_T parkFaulted[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Concentrate pump park command has faulted (T/F). +static BOOL isDosingCompleted[ NUM_OF_CONCENTRATE_PUMPS ]; ///< Flag indicating dosing completed status (T/F). //static DD_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. //static DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. @@ -223,6 +224,7 @@ concentratePumps[ pumpId ].controlSet = CONCENTRATE_PUMP_CONTROL_FORWARD; concentratePumps[ pumpId ].isConcPumpParkInProgress = FALSE; stopConcentratePump( pumpId ); + isDosingCompleted[ pumpId ] = FALSE; } initPersistentAlarm( ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); @@ -556,6 +558,8 @@ { setFPGAD76PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); } + + isDosingCompleted [ pumpId ] = FALSE; } /* @@ -614,20 +618,24 @@ * for a given concentrate pump. * @details \b Inputs: concentratePumps * @details \b Outputs: none + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump ID is seen. * @param pumpId concentrate pump id to get current dosing status * @return TRUE if dosing completed otherwise,FALSE. *************************************************************************/ BOOL isConcentratePumpDosingCompleted( CONCENTRATE_PUMPS_T pumpId ) { - BOOL state = FALSE; + BOOL status = FALSE; - //On dosing completion,state transition to off state - if ( CONCENTRATE_PUMP_OFF_STATE == concentratePumps[ pumpId ].execState ) + if ( pumpId < NUM_OF_CONCENTRATE_PUMPS ) { - state = TRUE; + status = isDosingCompleted[ pumpId ]; } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + } - return state; + return status; } /*********************************************************************//** @@ -835,6 +843,7 @@ concentratePumps[ pumpId ].currentPumpSpeed = 0.0F; // set target rate to zero pumpTargetSpeed[ pumpId ].data = 0.0F; pumpTargetRevCnt[ pumpId ].data = 0; + isDosingCompleted [ pumpId ] = TRUE; // Disable the motor when stopping, to take next revolution count // Send zero rate command to stop the pump Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r5d59b2fb541de1cc5f9b213650a72dec0d66152e -rb36ca0b49c410f690519c0622990825fd5dba500 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 5d59b2fb541de1cc5f9b213650a72dec0d66152e) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision b36ca0b49c410f690519c0622990825fd5dba500) @@ -52,7 +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 3.0F ///< Maximum adjusted delta temperature to add/remove from calculated target temperature +#define MAX_ADJ_DELTA_TEMP_C 3.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. @@ -127,7 +127,7 @@ 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 U32 adjustedPrimaryTargetTemp; ///< 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 @@ -144,7 +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 void updatePrimaryHeaterTargetTemp( void ); static F32 calculateDutyCycle( F32 flowrate, F32 deltaTemp, F32 power, F32 efficiency, F32 min, F32 max ); static void setHeaterControl( DD_HEATERS_T heater ); @@ -196,7 +196,7 @@ startupHeaterControl = TRUE; lastDialTargetTemperatureSet = 0.0F; primaryTargetTempAdjCounter = 0; - adjustedTargetTemp = 0.0F; + adjustedPrimaryTargetTemp = 0.0F; isTargetTempAdjusted = FALSE; for ( heater = DD_HEATERS_FIRST; heater < NUM_OF_DD_HEATERS; heater++ ) @@ -359,19 +359,16 @@ /*********************************************************************//** * @brief - * The signaltoResetAdjustedTargetTemp function resets the flag to - * update/adjust the target dialysate temperature + * The signaltoResetPrimaryHeaterAdjustedTargetTemp function resets the flag to + * update/adjust the primary heater 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 ) +void signaltoResetPrimaryHeaterAdjustedTargetTemp( void ) { - if ( D5_HEAT == heater ) - { - isTargetTempAdjusted = FALSE; - } + isTargetTempAdjusted = FALSE; } /*********************************************************************//** @@ -380,36 +377,32 @@ * 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 ) +static void updatePrimaryHeaterTargetTemp( void ) { - if ( D5_HEAT == heater ) + if ( ++primaryTargetTempAdjCounter >= D5_TARGET_TEMP_ADJUST_INTERVAL_MS ) { - if ( ++primaryTargetTempAdjCounter >= D5_TARGET_TEMP_ADJUST_INTERVAL_MS ) + F32 targetTempfromTD = getTDTargetDialysateTemperature(); + F32 measuredTempAtDialyzer = getConductivityTemperatureValue( D27_COND ); + F32 calcTargetTemp = getHeaterTargetTemperature( D5_HEAT ); + F32 deltaTempC = targetTempfromTD - measuredTempAtDialyzer; + F32 capDeltaTempC = MIN( fabs(deltaTempC), MAX_ADJ_DELTA_TEMP_C ); + + if ( deltaTempC > HEATERS_ZERO_DELTA_TEMP_C ) { - 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 ); + adjustedPrimaryTargetTemp = calcTargetTemp + capDeltaTempC; + } + else + { + adjustedPrimaryTargetTemp = calcTargetTemp - capDeltaTempC; + } - if ( deltaTempC > HEATERS_ZERO_DELTA_TEMP_C ) - { - adjustedTargetTemp = calcTargetTemp + capDeltaTempC; - } - else - { - adjustedTargetTemp = calcTargetTemp - capDeltaTempC; - } + adjustedPrimaryTargetTemp = MIN(adjustedPrimaryTargetTemp, ( calcTargetTemp + MAX_ADJ_DELTA_TEMP_C ) ); + adjustedPrimaryTargetTemp = MAX(adjustedPrimaryTargetTemp, ( calcTargetTemp - MAX_ADJ_DELTA_TEMP_C ) ); - adjustedTargetTemp = MIN(adjustedTargetTemp, ( calcTargetTemp + MAX_ADJ_DELTA_TEMP_C ) ); - adjustedTargetTemp = MAX(adjustedTargetTemp, ( calcTargetTemp - MAX_ADJ_DELTA_TEMP_C ) ); - - isTargetTempAdjusted = TRUE; - primaryTargetTempAdjCounter = 0; - } + isTargetTempAdjusted = TRUE; + primaryTargetTempAdjCounter = 0; } } @@ -698,7 +691,11 @@ F32 measuredTemperature = 0.0F; F32 ctrl = 0.0F; - updatePrimaryHeaterTargetTemp( heater ); + // Update primary heater target temperature at defined interval + if ( D5_HEAT == heater ) + { + updatePrimaryHeaterTargetTemp(); + } if ( ++heatersStatus[ heater ].controlIntervalCounter >= controlInterval[ heater ] ) { @@ -710,22 +707,24 @@ if ( TRUE == startupHeaterControl ) { - startupHeaterControl = FALSE; F32 deltaTempC = targetTemperature - inletTemperature; F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); F32 flowrate = getTDDialysateFlowrate() / LITER_IN_ML ; F32 feedforward = calculateDutyCycle( flowrate, capDeltaTempC, PRIMARY_HEATER_MAX_PWR_WATTS, AC_HEATER_EFFICIENCY, HEATERS_MIN_DUTY_CYCLE, AC_HEATER_TX_MAX_DUTY_CYCLE ); + startupHeaterControl = FALSE; control[ heater ].data = feedforward; resetPIController( PI_CONTROLLER_ID_D5_HEAT, HEATERS_MIN_DUTY_CYCLE, feedforward ); } else { + F32 deltaTempC = 0.0F; + if ( TRUE == isTargetTempAdjusted ) { - targetTemperature = adjustedTargetTemp; + targetTemperature = adjustedPrimaryTargetTemp; } - F32 deltaTempC = fabs( targetTemperature - measuredTemperature ); + deltaTempC = fabs( targetTemperature - measuredTemperature ); if ( deltaTempC >= D5_HEATER_DEADBAND_CONTROL ) { @@ -930,20 +929,15 @@ HEATERS_DATA_T data; data.d5_HeaterDC = getHeaterControl( D5_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; - data.d45_HeaterDC = getTDTargetDialysateTemperature(); - //data.d45_HeaterDC = getHeaterControl( D45_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; + data.d45_HeaterDC = getHeaterControl( D45_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; data.d5_HeaterTargetTemp = getHeaterTargetTemperature( D5_HEAT ); - data.d45_HeaterTargetTemp = adjustedTargetTemp; - //data.d45_HeaterTargetTemp = getHeaterTargetTemperature( D45_HEAT ); + data.d45_HeaterTargetTemp = getHeaterTargetTemperature( D45_HEAT ); data.d5_HeaterState = heatersStatus[ D5_HEAT ].state; data.d45_HeaterState = heatersStatus[ D45_HEAT ].state; -#ifndef __HEATERS_DEBUG__ - data.d5_HeaterControlCounter = heatersStatus[ D5_HEAT ].controlIntervalCounter; - data.d45_HeaterControlCounter = heatersStatus[ D45_HEAT ].controlIntervalCounter; -#else - data.d5_HeaterControlCounter = (U32)convertDC; - data.d45_HeaterControlCounter = (U32)getHeaterPWMPeriod( D5_HEAT ); -#endif + data.d5_dutyCycleCnt = convertDC; + data.d5_PWMPeriod = getHeaterPWMPeriod( D5_HEAT ); + data.d5_adjsutedTargetTemp = adjustedPrimaryTargetTemp; + data.d5_targetTempFromTD = getTDTargetDialysateTemperature(); #ifdef __HEATERS_DEBUG__ data.dbg1 = pIControlSignal[ 0 ]; data.dbg2 = pIControlSignal[ 1 ]; Index: firmware/App/DDCommon.h =================================================================== diff -u -r3ad6e01b0818a8251a83ee48d044dbe07658830a -rb36ca0b49c410f690519c0622990825fd5dba500 --- firmware/App/DDCommon.h (.../DDCommon.h) (revision 3ad6e01b0818a8251a83ee48d044dbe07658830a) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision b36ca0b49c410f690519c0622990825fd5dba500) @@ -28,6 +28,7 @@ #define DD_VERSION_BUILD 11 + // ********** development build switches ********** #ifndef _RELEASE_ @@ -37,17 +38,14 @@ //Uncomment the below line for new dosing pump testing //#define __PUMPTEST__ 1 -//Uncomment below line for future hardware version -//#define __ALPHA_AO_VER__ 1 - //Uncomment below for dialysate pump PI testing //#define __PITEST__ 1 //Uncomment below if diener concentrate pump used #define __DIENER_CONC_PUMP__ 1 //Uncomment below if beta hardware is used -#define __BETA_HW_VER__ 1 +//#define __BETA_HW_VER__ 1 //Uncomment below if barometric pressure sensor reading available //#define __BARO_PRES_SENSOR__ 1 @@ -58,6 +56,9 @@ //Uncomment below once characterization/study completed //#define ENABLE_ALARM_2 +//Uncomment below if balancing chamber pressure alarm is required +#define __BC_PRESSURE_ALARM__ 1 + //Uncomment below to disable heaters debug message #define __HEATERS_DEBUG__ 1 Index: firmware/source/sys_main.c =================================================================== diff -u -r09583a9e0a51bb47dd04c825cd706f5a3774bded -rb36ca0b49c410f690519c0622990825fd5dba500 --- firmware/source/sys_main.c (.../sys_main.c) (revision 09583a9e0a51bb47dd04c825cd706f5a3774bded) +++ firmware/source/sys_main.c (.../sys_main.c) (revision b36ca0b49c410f690519c0622990825fd5dba500) @@ -68,6 +68,7 @@ #include "DDCommon.h" #include "DialysatePumps.h" #include "FpgaDD.h" +#include "FPInterface.h" #include "Heaters.h" #include "Interrupts.h" #include "Level.h" @@ -77,7 +78,6 @@ #include "PistonPumpControl.h" #endif #include "Pressure.h" -#include "ROInterface.h" #include "SafetyShutdown.h" #include "SystemCommDD.h" #include "TaskBG.h"