Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rde2ef5ff6293f23a43414c5e2e40630468a68ddf -r8beb79bf3633a3b2f98ddc30099825fb9618f2b6 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision de2ef5ff6293f23a43414c5e2e40630468a68ddf) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 8beb79bf3633a3b2f98ddc30099825fb9618f2b6) @@ -117,6 +117,7 @@ HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. static BOOL hasStartPrimaryHeaterRequested; ///< Start primary heater request flag. static BOOL hasStartTrimmerHeaterRequested; ///< Start trimmer heater request flag. +static BOOL hasStopTrimmerHeaterRequested; ///< Stop trimmer heater request flag. static U32 heatersOnWithNoFlowTimer; ///< Heaters are on but there is no sufficient flow. static TEMPERATURE_SENSORS_T primaryHeatersFeedbackTempSensor = TEMPSENSORS_OUTLET_PRIMARY_HEATER; ///< Primary heaters feedback temperature sensors. static TEMPERATURE_SENSORS_T trimmerHeaterFeedbackTempSensor = TEMPSENSORS_INLET_DIALYSATE; ///< Trimmer heater feedback temperature sensors. @@ -172,6 +173,10 @@ isFlowBelowMin = FALSE; heatersVoltageMonitorTimeCounter = 0; + hasStartPrimaryHeaterRequested = FALSE; + hasStartTrimmerHeaterRequested = FALSE; + hasStopTrimmerHeaterRequested = FALSE; + // Initialize the PI controller for the primary heaters initializePIController( PI_CONTROLLER_ID_PRIMARY_HEATER, HEATERS_MIN_DUTY_CYCLE, PRIMARY_HEATERS_P_COEFFICIENT, PRIMARY_HEATERS_I_COEFFICIENT, HEATERS_MIN_DUTY_CYCLE, PRIMARY_HEATERS_CUMULATIVE_DUTY_CYCLE ); @@ -286,6 +291,8 @@ void stopTrimmerHeater( void ) { isTrimmerHeaterOn = FALSE; + hasStartTrimmerHeaterRequested = FALSE; + hasStopTrimmerHeaterRequested = TRUE; } /*********************************************************************//** @@ -310,10 +317,11 @@ if ( ( MINIMUM_TARGET_TEMPERATURE <= heaterCmdPtr->targetTemp ) && ( heaterCmdPtr->targetTemp <= MAXIMUM_TARGET_TEMPERATURE ) ) { cmdResponse.rejected = FALSE; - #ifndef DISABLE_HEATERS_AND_TEMPS +#ifndef DISABLE_HEATERS_AND_TEMPS trimmerHeaterTargetTemperature = heaterCmdPtr->targetTemp; hasStartTrimmerHeaterRequested = TRUE; - #endif + hasStopTrimmerHeaterRequested = FALSE; +#endif } else { @@ -322,6 +330,8 @@ } else { + hasStartTrimmerHeaterRequested = FALSE; + hasStopTrimmerHeaterRequested = TRUE; cmdResponse.rejected = FALSE; stopTrimmerHeater(); } @@ -381,8 +391,6 @@ else if ( TRUE == didTimeout( heatersOnWithNoFlowTimer, HEATERS_ON_NO_FLOW_TIMEOUT_MS ) ) { stopPrimaryHeater(); - stopTrimmerHeater(); - activateAlarmNoData( ALARM_ID_DG_HEATERS_ON_WITH_NO_FLOW_TIMEOUT ); } } @@ -572,6 +580,11 @@ setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; } + // Already stopped + if ( TRUE == hasStopTrimmerHeaterRequested ) + { + hasStopTrimmerHeaterRequested = FALSE; + } return state; } @@ -589,30 +602,38 @@ { TRIMMER_HEATER_EXEC_STATES_T state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; - if ( ++trimmerHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) + if ( TRUE == hasStopTrimmerHeaterRequested ) { - // Check if the flow is not below minimum required first - // If the flow is below minimum, send 0.00 to the PWM until the flow comes back to range - // If the flow is within range, run the PI controller to control the heaters normally - if ( FALSE == isFlowBelowMin ) + isTrimmerHeaterOn = FALSE; + hasStopTrimmerHeaterRequested = FALSE; + } + else + { + if ( ++trimmerHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { - F32 outletTemp = getTemperatureValue( trimmerHeaterFeedbackTempSensor ); - trimmerHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); - setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); +// // Check if the flow is not below minimum required first +// // If the flow is below minimum, send 0.00 to the PWM until the flow comes back to range +// // If the flow is within range, run the PI controller to control the heaters normally +// if ( FALSE == isFlowBelowMin ) // TODO - when we have flow sensor for dialysate, we can have a separate "below min" flag and do this + { + F32 outletTemp = getTemperatureValue( trimmerHeaterFeedbackTempSensor ); + trimmerHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); + setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); + } +// else +// { +// setTrimmerHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); +// } +// + trimmerHeaterTimerCounter = 0; } - else + // Already started + if ( TRUE == hasStartTrimmerHeaterRequested ) { - setTrimmerHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); + hasStartTrimmerHeaterRequested = FALSE; } - - trimmerHeaterTimerCounter = 0; } - if ( TRUE == hasStartTrimmerHeaterRequested ) - { - hasStartTrimmerHeaterRequested = FALSE; - } - if ( FALSE == isTrimmerHeaterOn ) { // Set the duty cycle to 0 and switch to off state