Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r5206a101e662f660baaf6dc919441916c4a4c966 -r83352606f453107c3ac4636c8da0e8a65b17c723 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 5206a101e662f660baaf6dc919441916c4a4c966) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 83352606f453107c3ac4636c8da0e8a65b17c723) @@ -27,73 +27,81 @@ #include "SystemCommMessages.h" #include "PIControllers.h" -#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.89 ///< Main primary heater (heater A) max duty cycle (79.5%) -#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.50 ///< Small Primary heater (heater B) max duty cycle (25%) -#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.25 ///< Trimmer heater max duty cycle (25%) -#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters min duty cycle (0.00%) +#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.89 ///< Main primary heater (heater A) max duty cycle (79.5%) +#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.50 ///< Small Primary heater (heater B) max duty cycle (25%) +#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.50 ///< Trimmer heater max duty cycle (25%) +#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters minimum duty cycle (0.00%) -#define PRIMARY_HEATERS_P_COEFFICIENT 0.02 -#define PRIMARY_HEATERS_I_COEFFICIENT 0.001 +#define PRIMARY_HEATERS_P_COEFFICIENT 0.02 ///< Primary heaters proportional coefficient +#define PRIMARY_HEATERS_I_COEFFICIENT 0.001 ///< Primary heaters integral coefficient -#define TRIMMER_HEATER_P_COEFFICIENT 0.003 -#define TRIMMER_HEATER_I_COEFFICIENT 0.001 +#define TRIMMER_HEATER_P_COEFFICIENT 0.02 ///< Trimmer heater proportional coefficient +#define TRIMMER_HEATER_I_COEFFICIENT 0.001 ///< Trimmer heater integral coefficient -#define DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION 0.05 -#define CONTROLLER_CHECK_INTERVAL_COUNT 10U +#define DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION 0.05 ///< Delta temperature to PWM duty cycle conversion (initial guess) +#define CONTROLLER_CHECK_INTERVAL_COUNT 10U ///< Time interval count to check the PI controller -#define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count +#define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count - +/// Heaters self test enums typedef enum heaters_self_test_states { - HEATERS_SELF_TEST_START = 0, - HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER, - HEATERS_SELF_TEST_START_MAIN_PRIMARY, - HEATERS_SELF_TEST_COMPLETE, - NUM_OF_HEATERS_SELF_TEST_STATES + HEATERS_SELF_TEST_START = 0, ///< Heaters self test start state + HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER, ///< Heaters self test small primary and trimmer heaters state + HEATERS_SELF_TEST_START_MAIN_PRIMARY, ///< Heaters self test start main primary state + HEATERS_SELF_TEST_COMPLETE, ///< Heaters self test complete state + NUM_OF_HEATERS_SELF_TEST_STATES ///< Number of heaters self test states } HEATERS_SELF_TEST_STATES_T ; +/// Primary heaters exec states typedef enum primary_heaters_exec_states { - PRIMARY_HEATERS_EXEC_STATE_OFF = 0, - PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET, - NUM_OF_PRIMARY_HEATERS_EXEC_STATES + PRIMARY_HEATERS_EXEC_STATE_OFF = 0, ///< Primary heaters exec state off + PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET, ///< Primary heaters exec state control to target (PI controller state) + NUM_OF_PRIMARY_HEATERS_EXEC_STATES ///< Number of primary heaters exec states } PRIMARY_HEATERS_EXEC_STATES_T; +/// Trimmer heater exec states typedef enum trimmer_heater_exec_states { - TRIMMER_HEATER_EXEC_STATE_OFF = 0, - TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET, - NUM_OF_TRIMMER_HEATER_EXEC_STATES + TRIMMER_HEATER_EXEC_STATE_OFF = 0, ///< Trimmer heater exec state off + TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET, ///< Trimmer heater exec state control to target (PI controller state) + NUM_OF_TRIMMER_HEATER_EXEC_STATES ///< Number of trimmer heater exec states } TRIMMER_HEATER_EXEC_STATES_T; +/// Name of the heaters states typedef enum name_of_heaters { - PRIMARY_HEATER = 0, - TRIMMER_HEATER, - NUM_OF_HEATERS + PRIMARY_HEATER = 0, ///< Primary heater + TRIMMER_HEATER, ///< Trimmer heater + NUM_OF_HEATERS ///< Number of heaters } NAME_OF_HEATER_T; // Private variables -static SELF_TEST_STATUS_T heatersSelfTestResult; -static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; -static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; -static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; +static SELF_TEST_STATUS_T heatersSelfTestResult; ///< Heaters self test results +static HEATERS_SELF_TEST_STATES_T heatersSelfTestState; ///< Heaters self test state +static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; ///< Primary heaters exec state +static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; ///< Trimmer heater exec state -static F32 primaryHeaterTargetTemperature; -static F32 trimmerHeaterTargetTemperature; +static F32 primaryHeaterTargetTemperature; ///< Primary heaters target temperature +static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature -static F32 mainPrimaryHeaterDutyCycle; -static F32 smallPrimaryHeaterDutyCycle; -static U32 controllerCheckTimerCounter; -static U32 tempSensorsPublicationTimerCounter; +static F32 mainPrimaryHeaterDutyCycle; ///< Main primary heater duty cycle +static F32 smallPrimaryHeaterDutyCycle; ///< Small primary heater duty cycle +static F32 trimmerHeaterDutyCycle; ///< Trimmer heater duty cycle +static U32 primaryHeaterTimerCounter; ///< Primary heater timer counter +static U32 trimmerHeaterTimerCounter; ///< Trimmer heater timer counter +static U32 dataPublicationTimerCounter; ///< Data publication timer counter // private functions prototypes static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ); static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ); +static TRIMMER_HEATER_EXEC_STATES_T handleTrimmerHeaterStateOff ( void ); +static TRIMMER_HEATER_EXEC_STATES_T handleTrimmerHeaterControlToTarget ( void ); + static void setMainPrimaryHeaterPWM ( F32 pwm ); static void setSmallPrimaryHeaterPWM ( F32 pwm ); static void setTrimmerHeaterPWM ( F32 pwm ); @@ -128,14 +136,20 @@ primaryHeaterTargetTemperature = 0.0; trimmerHeaterTargetTemperature = 0.0; - controllerCheckTimerCounter = 0; - tempSensorsPublicationTimerCounter = 0; + primaryHeaterTimerCounter = 0; + trimmerHeaterTimerCounter = 5; + dataPublicationTimerCounter = 0; // 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, MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE + SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE ); + + // initialize the PI controller for the trimmer heater + initializePIController( PI_CONTROLLER_ID_TRIMMER_HEATER, HEATERS_MIN_DUTY_CYCLE, + TRIMMER_HEATER_P_COEFFICIENT, TRIMMER_HEATER_I_COEFFICIENT, + HEATERS_MIN_DUTY_CYCLE, TRIMMER_HEATER_MAX_DUTY_CYCLE ); } /*********************************************************************//** @@ -197,11 +211,19 @@ * Outputs : BOOL (status) * @return BOOL (status) *************************************************************************/ -void startTrimmerHeater ( void ) +BOOL startTrimmerHeater ( void ) { - // ToDO: set the initial duty cycle for the - // trimmer heater - setTrimmerHeaterPWM ( 0.5 ); + BOOL status = FALSE; + + if ( trimmerHeaterTargetTemperature != 0.0 ) + { + resetHeaterState ( TRIMMER_HEATER ); + setTrimmerHeaterPWM ( trimmerHeaterDutyCycle ); + trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + status = TRUE; + } + + return status; } /*********************************************************************//** @@ -326,10 +348,12 @@ { case TRIMMER_HEATER_EXEC_STATE_OFF: + trimmerHeaterExecState = handleTrimmerHeaterStateOff(); break; case TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET: + trimmerHeaterExecState = handleTrimmerHeaterControlToTarget(); break; default: @@ -388,7 +412,7 @@ { PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; - if ( ++controllerCheckTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) + if ( ++primaryHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { F32 outletTemp = getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ); mainPrimaryHeaterDutyCycle = runPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); @@ -406,7 +430,7 @@ smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; setSmallPrimaryHeaterPWM ( smallPrimaryHeaterDutyCycle ); } - controllerCheckTimerCounter = 0; + primaryHeaterTimerCounter = 0; } publishTemperatureData(); @@ -424,6 +448,73 @@ } /*********************************************************************//** + * @brief handleTrimmerHeaterStateOff + * The handleTrimmerHeaterStateOff function handles the trimmer heater at + * off state + * @details + * Inputs : none + * Outputs : TRIMMER_HEATER_EXEC_STATES_T (state) + * @return TRIMMER_HEATER_EXEC_STATES_T (state) + *************************************************************************/ +static TRIMMER_HEATER_EXEC_STATES_T handleTrimmerHeaterStateOff ( void ) +{ + TRIMMER_HEATER_EXEC_STATES_T state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + + // TODO for testing only. remove + state = TRIMMER_HEATER_EXEC_STATE_OFF; + if ( TOGGLEPRIMAYHEATER() ) + { + setTrimmerHeaterTargetTemperature ( 37 ); + if ( getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ) > 0 ) + { + startTrimmerHeater(); + state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + temporaryStartROPump(); + temporaryStartFan(); + } + //state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + } + // TODO remove this code for testing + + return state; +} + +/*********************************************************************//** + * @brief handleTrimmerHeaterControlToTarget + * The handleTrimmerHeaterControlToTarget function handles the trimmer + * heater at control state when the heater is active + * @details + * Inputs : none + * Outputs : TRIMMER_HEATER_EXEC_STATES_T (state) + * @return TRIMMER_HEATER_EXEC_STATES_T (state) + *************************************************************************/ +static TRIMMER_HEATER_EXEC_STATES_T handleTrimmerHeaterControlToTarget ( void ) +{ + TRIMMER_HEATER_EXEC_STATES_T state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + + if ( ++trimmerHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) + { + F32 outletTemp = getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ); + trimmerHeaterDutyCycle = runPIController ( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); + setTrimmerHeaterPWM ( trimmerHeaterDutyCycle ); + trimmerHeaterTimerCounter = 0; + } + publishTemperatureData(); + + // TODO remove this code + if ( !TOGGLEPRIMAYHEATER() ) + { + stopTrimmerHeater(); + temporaryStopROPump(); + temporaryStopFan(); + state = TRIMMER_HEATER_EXEC_STATE_OFF; + } + // TODO Remove this code + + return state; +} + +/*********************************************************************//** * @brief setMainPrimaryHeaterPWM * The setMainPrimaryHeaterPWM function sets the PWM of the main primary * heater @@ -499,27 +590,27 @@ *************************************************************************/ static void publishTemperatureData ( void ) { - if ( ++tempSensorsPublicationTimerCounter >= TEMP_SENSORS_INTERVAL_COUNT ) + if ( ++dataPublicationTimerCounter >= TEMP_SENSORS_INTERVAL_COUNT ) { #ifdef DEBUG_ENABLED { char debugTempStr[ 256 ]; - sprintf( debugTempStr, "MPDuty: %6.2f, SPDuty: %6.2f, TPi: %6.2f, TPo: %6.2f, TD1: %6.2f, " - "TD2: %6.2f, TRo: %6.2f, TDi: %6.2f, TPh: %6.2f, TTh: %6.2f, PTarg: %6.2f\r\n", - mainPrimaryHeaterDutyCycle, smallPrimaryHeaterDutyCycle, - getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ), - primaryHeaterTargetTemperature ); + sprintf( debugTempStr, "MPDuty: %6.2f, SPDuty: %6.2f, THDuty: %6.2f, TPi: %6.2f, TPo: %6.2f, TD1: %6.2f, " + "TD2: %6.2f, TRo: %6.2f, TDi: %6.2f, TPh: %6.2f, TTh: %6.2f, PTarg: %6.2f\r\n", + mainPrimaryHeaterDutyCycle, smallPrimaryHeaterDutyCycle, trimmerHeaterDutyCycle, + getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ), + primaryHeaterTargetTemperature ); sendDebugData ( (U08*)debugTempStr, strlen(debugTempStr) ); } #endif - tempSensorsPublicationTimerCounter = 0; + dataPublicationTimerCounter = 0; } }