Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r986abcfcf047822cad1a10c1ee0924a80dd5f512 -r609d5c77e1f5bd85e9dd1a90b786e56004a79f06 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 986abcfcf047822cad1a10c1ee0924a80dd5f512) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 609d5c77e1f5bd85e9dd1a90b786e56004a79f06) @@ -546,7 +546,9 @@ F32 pulseWidthInSecond = (F32)( pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION ) / US_PER_SECOND; BOOL isPulseWidthOut = ( pulseWidthInSecond <= CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ? TRUE : FALSE ); + // TODO will implement in DEN-12224 //checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInSecond, CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); + // TODO will implement in DEN-12224 if ( FALSE == isPulseWidthOut ) { Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r71df42258b9d8266557005103ebfce0b711886a5 -r609d5c77e1f5bd85e9dd1a90b786e56004a79f06 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 71df42258b9d8266557005103ebfce0b711886a5) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 609d5c77e1f5bd85e9dd1a90b786e56004a79f06) @@ -109,7 +109,6 @@ static U32 dataPublicationTimerCounter; ///< Data publication timer counter. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. static U32 voltageMonitorTimeCounter = 0; ///< Heaters voltage monitor counter. -static U32 operationMode = 0; ///< Operation mode. // ********** private function prototypes ********** @@ -129,8 +128,6 @@ static void setSmallPrimaryHeaterPWM( F32 pwm ); static void setTrimmerHeaterPWM( F32 pwm ); static void publishHeatersData( void ); -static void checkPrimaryHeaterTempSensors( void ); -static void checkTrimmerHeaterTempSensors( void ); static void monitorHeatersVoltage( void ); /*********************************************************************//** @@ -146,7 +143,6 @@ DG_HEATERS_T heater; voltageMonitorTimeCounter = 0; - operationMode = 0; dataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; for ( heater = DG_PRIMARY_HEATER; heater < NUM_OF_DG_HEATERS; heater++ ) @@ -361,14 +357,9 @@ *************************************************************************/ void execHeatersMonitor( void ) { -#if 0 // This code is disabled to prevent any heaters monitoring while the driver in in development. +#ifndef IGNORE_HEATERS_MONITOR DG_HEATERS_T heater; -#ifndef IGNORE_HEATERS_MONITOR - checkPrimaryHeaterTempSensors(); - checkTrimmerHeaterTempSensors(); -#endif - for ( heater = DG_PRIMARY_HEATER; heater < NUM_OF_DG_HEATERS; heater++ ) { // Check if a heater is on and whether is duty cycle is not zero @@ -406,9 +397,9 @@ } } } +#endif monitorHeatersVoltage(); -#endif // Check for data publication publishHeatersData(); @@ -494,7 +485,7 @@ state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; } - // TODO remove + // TODO remove once dialysate heating is done heatersStatus[ DG_PRIMARY_HEATER ].temporaryInterimTemperature = targetTemperature; // TODO remove @@ -668,9 +659,10 @@ // Get the primary heater's efficiency and the last fill temperature from the ModeFill F32 heaterEfficiency = heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency; - if ( TRUE == checkEfficiency ) // TODO ignore the efficiency for now until it is fixed +#ifndef DISABLE_HEATERS_EFFICIENCY + if ( TRUE == checkEfficiency ) { - /*F32 lastFillTemperature = getLastFillTemperature(); + F32 lastFillTemperature = getLastFillTemperature(); F32 primaryTargetTemperature = heatersStatus[ DG_PRIMARY_HEATER ].targetTemp; // If the last fill temperature > target temperature, it means the primary heater overshot the duty cycle @@ -686,11 +678,11 @@ } heaterEfficiency = heaterEfficiency <= 0.0 ? 0.0 : heaterEfficiency; - //heaterEfficiency = heaterEfficiency >= 1.0 ? 1.0 : heaterEfficiency; // Update the heaters efficiency - heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency = heaterEfficiency; */ + heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency = heaterEfficiency; } +#endif // Duty cycle = ( 69.73 * flow rate * deltaT / primary heater maximum power ) ^ 1/2 // Multiply the duty cycle to the heater efficiency @@ -723,11 +715,12 @@ F32 heaterEfficiency = heatersStatus[ DG_TRIMMER_HEATER ].heaterEfficiency; F32 dutyCycle = 0.0; - +#ifndef DISABLE_HEATERS_EFFICIENCY if ( TRUE == checkEfficiency ) { // TODO Do we need to recalculate the efficiency? } +#endif dutyCycle = flow * WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * ( targetTemperature - currentTemperature ) * heaterEfficiency; @@ -843,94 +836,6 @@ /*********************************************************************//** * @brief - * The checkPrimaryHeaterTempSensors function checks the primary heater's - * thermocouple and cold junction temperature sensors. - * @details Inputs: isPrimaryHeaterTempOutOfRange - * @details Outputs: isPrimaryHeaterTempOutOfRange - * @return none - *************************************************************************/ -static void checkPrimaryHeaterTempSensors( void ) -{ - F32 primaryHeaterInternalTemp = getTemperatureValue( TEMPSENSORS_PRIMARY_HEATER_INTERNAL ); - F32 primaryHeaterColdJunctionTemp = getTemperatureValue( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION ); - BOOL isTempOut = FALSE; - - // Check if the primary heater's internal temperature or the cold junction temperature is above the allowed limit - if ( primaryHeaterInternalTemp > HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C ) - { - isTempOut = TRUE; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_PRIMARY_HEATER_INTERNAL_TEMP_OUT_OF_RANGE, primaryHeaterInternalTemp ); - } - else if ( primaryHeaterColdJunctionTemp > HEATERS_MAX_ALLOWED_COLD_JUNCTION_TEMPERATURE_C ) - { - isTempOut = TRUE; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_PRIMARY_HEATER_CJ_TEMP_OUT_OF_RANGE, primaryHeaterInternalTemp ); - } - -#ifndef IGNORE_HEATERS_MONITOR - // If any of the temperatures are above the range - if ( ( FALSE == isPrimaryHeaterTempOutOfRange ) && ( TRUE == isTempOut ) ) - { - stopPrimaryHeater(); - isPrimaryHeaterTempOutOfRange = TRUE; - primaryHeaterTempOutTimer = getMSTimerCount(); - } - // If the primary heaters internal temperature was out for more than the define period, activate the safety shutdown - else if ( ( TRUE == isPrimaryHeaterTempOutOfRange ) && - ( TRUE == didTimeout( primaryHeaterTempOutTimer, HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ) ) ) - { - isPrimaryHeaterTempOutOfRange = FALSE; - activateSafetyShutdown(); - } -#endif -} - -/*********************************************************************//** - * @brief - * The checkTrimmerHeaterTempSensors function checks the trimmer heater's - * thermocouple and cold junction temperature sensors. - * @details Inputs: isTrimmerHeaterTempOutOfRange - * @details Outputs: isTrimmerHeaterTempOutOfRange - * @return none - *************************************************************************/ -static void checkTrimmerHeaterTempSensors( void ) -{ - F32 trimmerHeaterInternalTemp = getTemperatureValue( TEMPSENSORS_TRIMMER_HEATER_INTERNAL ); - F32 trimmerHeaterColdJunctionTemp = getTemperatureValue( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ); - BOOL isTempOut = FALSE; - - // Check if the primary heater's internal temperature or the cold junction temperature is above the allowed limit - if ( trimmerHeaterInternalTemp > HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C ) - { - isTempOut = TRUE; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_TRIMMER_HEATER_INTERNAL_TEMP_OUT_OF_RANGE, trimmerHeaterInternalTemp ); - } - else if ( trimmerHeaterColdJunctionTemp > HEATERS_MAX_ALLOWED_COLD_JUNCTION_TEMPERATURE_C ) - { - isTempOut = TRUE; - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_TRIMMER_HEATER_CJ_TEMP_OUT_OF_RANGE, trimmerHeaterColdJunctionTemp ); - } - -#ifndef IGNORE_HEATERS_MONITOR - // If it is above the range for the first time, stop the trimmer heater - // and set the variables - if ( ( FALSE == isTrimmerHeaterTempOutOfRange ) && ( TRUE == isTempOut ) ) - { - stopTrimmerHeater(); - isTrimmerHeaterTempOutOfRange = TRUE; - trimmerHeaterTempOutTimer = getMSTimerCount(); - } - // If the trimmer heater internal temperature was out for more than the define period, activate the safety shutdown - else if ( ( TRUE == isTrimmerHeaterTempOutOfRange ) && - ( TRUE == didTimeout( trimmerHeaterTempOutTimer, HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ) ) ) - { - activateSafetyShutdown(); - } -#endif -} - -/*********************************************************************//** - * @brief * The monitorHeatersVoltage function monitors the heaters' voltages * @details Inputs: voltageMonitorTimeCounter * @details Outputs: voltageMonitorTimeCounter Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r986abcfcf047822cad1a10c1ee0924a80dd5f512 -r609d5c77e1f5bd85e9dd1a90b786e56004a79f06 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 986abcfcf047822cad1a10c1ee0924a80dd5f512) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 609d5c77e1f5bd85e9dd1a90b786e56004a79f06) @@ -86,8 +86,7 @@ #define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< Conversion factor from target PSI to PWM duty cycle estimate. #define SAFETY_SHUTDOWN_TIMEOUT ( 3 * MS_PER_SECOND ) ///< RO pump safety shutdown activation timeout in ms. -#define ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE 0.0 ///< RO pump 0% duty cycle feedback voltage. -#define ROP_FEEDBACK_100_PCT_DUTY_CYCLE_VOLTAGE 2.5 ///< RO pump 100% duty cycle feedback voltage. +#define ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE 2.51 ///< RO pump 0% duty cycle feedback voltage. #define ROP_DUTY_CYCLE_OUT_OF_RANGE_TOLERANCE 0.05 ///< RO pump duty cycle out of range tolerance. #define DATA_PUBLISH_COUNTER_START_COUNT 50 ///< Data publish counter start count. @@ -335,7 +334,7 @@ void execROPumpMonitor( void ) { U16 roFlowReading = getFPGAROPumpFlowRate(); - U16 roFeedbackVoltage = getIntADCVoltageConverted( INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE ); + F32 roFeedbackVoltage = getIntADCVoltageConverted( INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE ); // Update sum for flow average calculation measuredFlowReadingsSum += (S32)roFlowReading; @@ -379,7 +378,7 @@ } #ifndef IGNORE_RO_PUMP_MONITOR - F32 roFeedbackDutyCycle = ROP_FEEDBACK_100_PCT_DUTY_CYCLE_VOLTAGE / roFeedbackVoltage; + roPumpFeedbackDutyCyclePct = 1.0 - ( roFeedbackVoltage / ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE ); // To monitor the flow, the control mode must be in closed loop mode and the pump should be control to flow state // If the pump is controlled to the maximum pressure, the flow might be different from the target flow for more than 10% @@ -398,10 +397,12 @@ checkPersistentAlarm( ALARM_ID_FLOW_RATE_OUT_OF_LOWER_RANGE, isFlowOutOfLowerRange, currentFlow, targetFlow ); } - if ( ( FALSE == isROPumpOn ) && ( roFeedbackVoltage != ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE ) ) + if ( FALSE == isROPumpOn ) { - checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, TRUE, roFeedbackVoltage, ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE ); + BOOL isPumpRunning = fabs( roFeedbackVoltage - ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE ) > 0.05 ? TRUE : FALSE; + checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, isPumpRunning, roFeedbackVoltage, ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE ); + // Check if it has timed out if ( TRUE == isAlarmActive( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE ) ) { @@ -411,15 +412,10 @@ if ( TRUE == isROPumpOn ) { - BOOL isDCOutOfRange = ( fabs( roFeedbackDutyCycle - roPumpDutyCyclePctSet ) > ROP_DUTY_CYCLE_OUT_OF_RANGE_TOLERANCE ? TRUE : FALSE ); - roPumpFeedbackDutyCyclePct = roFeedbackDutyCycle; + BOOL isDCOutOfRange = ( fabs( roPumpFeedbackDutyCyclePct - roPumpDutyCyclePctSet ) > ROP_DUTY_CYCLE_OUT_OF_RANGE_TOLERANCE ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, TRUE, roFeedbackDutyCycle, roPumpDutyCyclePctSet ); + checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, isDCOutOfRange, roPumpFeedbackDutyCyclePct, roPumpDutyCyclePctSet ); } - else - { - checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, FALSE, roFeedbackDutyCycle, roPumpDutyCyclePctSet ); - } #endif // Publish RO pump data on interval Index: firmware/App/DGCommon.h =================================================================== diff -u -r71df42258b9d8266557005103ebfce0b711886a5 -r609d5c77e1f5bd85e9dd1a90b786e56004a79f06 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 71df42258b9d8266557005103ebfce0b711886a5) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 609d5c77e1f5bd85e9dd1a90b786e56004a79f06) @@ -54,6 +54,7 @@ #define DISABLE_FLOW_CHECK_IN_FILL 1 // Implement #define IGNORE_CONC_PUMP_IN_HEAT_DISINFECT 1 // Not needed // #define NEW_FMD_FLOW_SENSOR 1 // Not needed + #define DISABLE_HEATERS_EFFICIENCY 1 // Turn these flags on to disable dialysate mixing #define DISABLE_DIALYSATE_CHECK 1 // Disabled for Tom // Implement Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -r609d5c77e1f5bd85e9dd1a90b786e56004a79f06 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 609d5c77e1f5bd85e9dd1a90b786e56004a79f06) @@ -66,7 +66,7 @@ 0.06438104, // PSIA- INT_ADC_RO_PUMP_OUTLET_PRESSURE 0.06438104, // PSIA- INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE 0.06438104, // PSIA- INT_ADC_DRAIN_PUMP_INLET_PRESSURE - 0.001365, // V - INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE + 0.00073242, // V - INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE 1.0, // ? - INT_ADC_AVAILABLE_CHANNEL 0.00700441, // V - INT_ADC_PRIMARY_HEATER_24_VOLTS (varies inversely with PWM for secondary element) 0.00763285, // V - INT_ADC_TRIMMER_HEATER_24_VOLTS (varies inversely with PWM)