Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -re74b708f9537d28d676cdf4764992a9d572a5250 -ra3b108c205e9bcd4d1a45033d73c5714c7247123 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision e74b708f9537d28d676cdf4764992a9d572a5250) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision a3b108c205e9bcd4d1a45033d73c5714c7247123) @@ -24,85 +24,105 @@ #include "Common.h" #include "Heaters.h" #include "TemperatureSensors.h" +#include "SystemCommMessages.h" #include "PIControllers.h" -#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.795 ///< Main primary heater (heater A) max duty cycle (79.5%) -#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.25 ///< 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.005 -#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 -// TODO make these macros functions -#define INITIAL_DUTY_CYCLE_MAIN_PRIMARY_HEATER 0.50 -#define INITIAL_DUTY_CYCLE_SMALL_PRIMARY_HEATER 0.10 -#define INITIAL_DUTY_CYCLE_TRIMMER_HEATER 0.10 +#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 DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION 0.03 +#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 smallPrimaryHeaterPWMDutyCycle; -static F32 mainPrimaryHeaterPWMDutyCycle; -static F32 trimmerHeaterPWMDutyCycle; +static F32 primaryHeaterTargetTemperature; ///< Primary heaters target temperature +static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature +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 ); static void resetHeaterState ( NAME_OF_HEATER_T heater ); +static void publishTemperatureData ( void ); -// TODo GPIO for enabling the primary heater +// TODO: Remove the below code. FOR TESTING ONLY #define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) -#define TOGGLEPRIMAYHEATER() ( ( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0 ) +#define TOGGLEPRIMAYHEATER() (( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0) +//TODO: Remove the above code. FOR TESTING ONLY // Public functions +/*********************************************************************//** + * @brief initHeaters + * The initHeaters function initializes the variables. + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ void initHeaters ( void ) { heatersSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; @@ -112,62 +132,146 @@ primaryHeaterTargetTemperature = 0.0; trimmerHeaterTargetTemperature = 0.0; - smallPrimaryHeaterPWMDutyCycle = 0.0; - mainPrimaryHeaterPWMDutyCycle = 0.0; - trimmerHeaterPWMDutyCycle = 0.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 ); } +/*********************************************************************//** + * @brief setPrimaryHeaterTargetTemperature + * The setPrimaryHeaterTargetTemperature function sets the primary heater + * target temperature + * @details + * Inputs : F32 (targetTemp) + * Outputs : none + * @return none + *************************************************************************/ void setPrimaryHeaterTargetTemperature ( F32 targetTemp ) { primaryHeaterTargetTemperature = targetTemp; } +/*********************************************************************//** + * @brief setTrimmerHeaterTargetTemperature + * The setTrimmerHeaterTargetTemperature function sets the trimmer heater + * target temperature + * @details + * Inputs : F32 (targetTemp) + * Outputs : none + * @return none + *************************************************************************/ void setTrimmerHeaterTargetTemperature ( F32 targetTemp ) { trimmerHeaterTargetTemperature = targetTemp; } +/*********************************************************************//** + * @brief startPrimaryHeater + * The startPrimaryHeater function starts the primary heaters + * @details + * Inputs : none + * Outputs : BOOL (status) + * @return BOOL (status) + *************************************************************************/ BOOL startPrimaryHeater ( void ) { BOOL status = FALSE; - // TODO: remove this code. For testing only - setMainPrimaryHeaterPWM ( 0.8 ); - setSmallPrimaryHeaterPWM ( 0.25 ); - // TODO: remove this code. for testing only if ( primaryHeaterTargetTemperature != 0.0 ) { resetHeaterState ( PRIMARY_HEATER ); + setMainPrimaryHeaterPWM ( mainPrimaryHeaterDutyCycle ); primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; status = TRUE; } return status; } +/*********************************************************************//** + * @brief startTrimmerHeater + * The startTrimmerHeater function starts the trimmer heater + * @details + * Inputs : none + * Outputs : BOOL (status) + * @return BOOL (status) + *************************************************************************/ BOOL startTrimmerHeater ( void ) { - setTrimmerHeaterPWM ( INITIAL_DUTY_CYCLE_MAIN_PRIMARY_HEATER ); - return TRUE; + BOOL status = FALSE; + + if ( trimmerHeaterTargetTemperature != 0.0 ) + { + resetHeaterState ( TRIMMER_HEATER ); + setTrimmerHeaterPWM ( trimmerHeaterDutyCycle ); + trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + status = TRUE; + } + + return status; } +/*********************************************************************//** + * @brief stopPrimaryHeater + * The stopPrimaryHeater function stops the primary heaters + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ void stopPrimaryHeater ( void ) { setMainPrimaryHeaterPWM ( HEATERS_MIN_DUTY_CYCLE ); setSmallPrimaryHeaterPWM ( HEATERS_MIN_DUTY_CYCLE ); + primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; } +/*********************************************************************//** + * @brief stopTrimmerHeater + * The stopTrimmerHeater function stops the trimmer heater + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ void stopTrimmerHeater ( void ) { setTrimmerHeaterPWM ( HEATERS_MIN_DUTY_CYCLE ); } +/*********************************************************************//** + * @brief execHeatersMonitor + * The execHeatersMonitor function + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ +void execHeatersMonitor ( void ) +{ + // TODO Decide the parts of this function + +} + +/*********************************************************************//** + * @brief execHeatersSelfTest + * The execHeatersSelfTest function executes the heaters self test + * @details + * Inputs : none + * Outputs : SELF_TEST_STATUS_T + * @return SELF_TEST_STATUS_T + *************************************************************************/ SELF_TEST_STATUS_T execHeatersSelfTest ( void ) { switch ( heatersSelfTestState ) @@ -196,6 +300,14 @@ return heatersSelfTestResult; } +/*********************************************************************//** + * @brief execPrimaryHeaters + * The execPrimaryHeaters function executes the primary heaters + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ void execPrimaryHeaters ( void ) { switch ( primaryHeatersExecState ) @@ -219,16 +331,26 @@ } } +/*********************************************************************//** + * @brief execTrimmerHeater + * The execTrimmerHeater function executes the trimmer heater + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ void execTrimmerHeater ( void ) { switch ( trimmerHeaterExecState ) { case TRIMMER_HEATER_EXEC_STATE_OFF: + trimmerHeaterExecState = handleTrimmerHeaterStateOff(); break; case TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET: + trimmerHeaterExecState = handleTrimmerHeaterControlToTarget(); break; default: @@ -242,75 +364,243 @@ // Private functions +/*********************************************************************//** + * @brief handlePrimaryHeaterStateOff + * The handlePrimaryHeaterStateOff function handles the primary heaters at + * off state + * @details + * Inputs : none + * Outputs : PRIMARY_HEATERS_EXEC_STATES_T (state) + * @return PRIMARY_HEATERS_EXEC_STATES_T (state) + *************************************************************************/ static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ) { PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + // TODO for testing only. remove + state = PRIMARY_HEATERS_EXEC_STATE_OFF; + if ( TOGGLEPRIMAYHEATER() ) + { + setPrimaryHeaterTargetTemperature ( 37 ); + if ( getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ) > 0 ) + { + startPrimaryHeater(); + state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + } + //state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + } + // TODO remove this code for testing + return state; } +/*********************************************************************//** + * @brief handlePrimaryHeaterStateControlToTarget + * The handlePrimaryHeaterStateControlToTarget function handles the primary + * heaters at control state when the heaters are active + * @details + * Inputs : none + * Outputs : PRIMARY_HEATERS_EXEC_STATES_T (state) + * @return PRIMARY_HEATERS_EXEC_STATES_T (state) + *************************************************************************/ static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ) { PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; - // TODO do we need to have a counter for the controller? - F32 outletTemp = getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ); - F32 newPWM = runPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); - - if ( newPWM >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) + if ( ++primaryHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { - setMainPrimaryHeaterPWM ( MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ); - newPWM = newPWM - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; - setSmallPrimaryHeaterPWM ( newPWM ); + F32 outletTemp = getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ); + mainPrimaryHeaterDutyCycle = runPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); + + if ( mainPrimaryHeaterDutyCycle >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) + { + smallPrimaryHeaterDutyCycle = mainPrimaryHeaterDutyCycle - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + mainPrimaryHeaterDutyCycle = MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + setMainPrimaryHeaterPWM ( mainPrimaryHeaterDutyCycle ); + setSmallPrimaryHeaterPWM ( smallPrimaryHeaterDutyCycle ); + } + else + { + setMainPrimaryHeaterPWM ( mainPrimaryHeaterDutyCycle ); + smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; + setSmallPrimaryHeaterPWM ( smallPrimaryHeaterDutyCycle ); + } + primaryHeaterTimerCounter = 0; } - else - { + publishTemperatureData(); + // TODO remove this code + if ( !TOGGLEPRIMAYHEATER() ) + { + stopPrimaryHeater(); + state = PRIMARY_HEATERS_EXEC_STATE_OFF; } + // TODO Remove this code + return state; +} - // TODO remove this code for testing +/*********************************************************************//** + * @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() ) { - startPrimaryHeater(); + setTrimmerHeaterTargetTemperature ( 37 ); + if ( getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ) > 0 ) + { + startTrimmerHeater(); + state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; + } + 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() ) { - stopPrimaryHeater(); + stopTrimmerHeater(); + state = TRIMMER_HEATER_EXEC_STATE_OFF; } - // TODO remove this code for testing + // TODO Remove this code return state; } -static void setMainPrimaryHeaterPWM( F32 pwm ) +/*********************************************************************//** + * @brief setMainPrimaryHeaterPWM + * The setMainPrimaryHeaterPWM function sets the PWM of the main primary + * heater + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ +static void setMainPrimaryHeaterPWM ( F32 pwm ) { etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } +/*********************************************************************//** + * @brief setSmallPrimaryHeaterPWM + * The setSmallPrimaryHeaterPWM function sets the PWM of the small primary + * heater + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ static void setSmallPrimaryHeaterPWM ( F32 pwm ) { etpwmSetCmpB( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } -static void setTrimmerHeaterPWM( F32 pwm ) +/*********************************************************************//** + * @brief setTrimmerHeaterPWM + * The setTrimmerHeaterPWM function sets the PWM of the trimmer heater + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ +static void setTrimmerHeaterPWM ( F32 pwm ) { etpwmSetCmpA( etpwmREG3, (U32)( (S32)( ( pwm * (F32)(etpwmREG3->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } +/*********************************************************************//** + * @brief resetHeaterState + * The resetHeaterState function resets the PI controller of the selected + * heater + * @details + * Inputs : none + * Outputs : none + * @return none + *************************************************************************/ static void resetHeaterState ( NAME_OF_HEATER_T heater ) { if ( heater == PRIMARY_HEATER ) { F32 inletTemperatrue = getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ); - F32 initialPWMDutyCycle = fabs(primaryHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; - resetPIController( PI_CONTROLLER_ID_PRIMARY_HEATER, initialPWMDutyCycle ); + mainPrimaryHeaterDutyCycle = fabs(primaryHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; + resetPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, mainPrimaryHeaterDutyCycle ); } else if ( heater == TRIMMER_HEATER ) { - // TODO setup the trimmer heater + F32 inletTemperatrue = getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ); + trimmerHeaterDutyCycle = fabs(trimmerHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; + resetPIController ( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterDutyCycle ); } } - - +/************************************************************************* + * @brief publishTemperatureData + * The publishTemperatureData function publishes the temperature sensors + * data into the USB debug port at the defined time interval + * @details + * Inputs : none + * Outputs : none + * @param none + * @return none + *************************************************************************/ +static void publishTemperatureData ( void ) +{ + if ( ++dataPublicationTimerCounter >= TEMP_SENSORS_INTERVAL_COUNT ) + { +//#ifdef DEBUG_ENABLED +// { +// char debugTempStr[ 256 ]; +// 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, TTarg: %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, trimmerHeaterTargetTemperature); +// sendDebugData ( (U08*)debugTempStr, strlen(debugTempStr) ); +// } +//#endif + dataPublicationTimerCounter = 0; + } +} Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf -ra3b108c205e9bcd4d1a45033d73c5714c7247123 --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision a3b108c205e9bcd4d1a45033d73c5714c7247123) @@ -17,6 +17,8 @@ #ifndef _HEATERS_H_ #define _HEATERS_H_ +#include "Common.h" + void initHeaters ( void ); void setPrimaryHeaterTargetTemperature ( F32 targetTemp ); @@ -28,15 +30,12 @@ void stopPrimaryHeater ( void ); void stopTrimmerHeater ( void ); -void execHeatersMonitor ( void ); // Todo decide the functionality +void execHeatersMonitor ( void ); SELF_TEST_STATUS_T execHeatersSelfTest ( void ); void execPrimaryHeaters ( void ); void execTrimmerHeater ( void ); - - - #endif Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -ra3b108c205e9bcd4d1a45033d73c5714c7247123 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision a3b108c205e9bcd4d1a45033d73c5714c7247123) @@ -17,11 +17,14 @@ #include "TemperatureSensors.h" #include "FPGA.h" +#include "SystemCommMessages.h" // TODO: For testing only REMOVE #include "Timers.h" // TODO: For testing only REMOVE +//TODO change the incoming water for ranges + // Private variables #define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 16U ///< Primary heater external temperature sensors gain @@ -55,11 +58,11 @@ #define ADC_READ_REF_RESISTANCE_INDEX 1U ///< ADC array reference resistances index #define ADC_READ_0_DEG_RESISTANCE_INDEX 2U ///< ADC array zero degree resistance index -#define READ_AND_ERROR_PREV_FPGA_COUNT_INDEX 0U -#define READ_AND_ERROR_INTERNAL_READ_COUNT_INDEX 1U -#define READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX 2U -#define READ_AND_ERROR_PREV_FPGA_ERROR_INDEX 3U -#define NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS 4U +#define READ_AND_ERROR_PREV_FPGA_COUNT_INDEX 0U ///< Read and error previous FPGA count index +#define READ_AND_ERROR_INTERNAL_READ_COUNT_INDEX 1U ///< Read and error internal read count index +#define READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX 2U ///< Read and error internal error count index +#define READ_AND_ERROR_PREV_FPGA_ERROR_INDEX 3U ///< Read and error previous FPGA error index +#define NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS 4U ///< Number of read and error array columns #define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U ///< Maximum allowed temperature delta between sensors @@ -68,9 +71,8 @@ #define MAX_ALLOWED_UNCHANGED_ADC_READS 4U ///< Maximum number of times that the read of a sensor cannot change -#define EXTERNAL_TEMP_SENSORS_ERROR_VALUE 0x80 -#define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 -#define MASK_OFF_U32_MSB 0x00FFFFFF +#define EXTERNAL_TEMP_SENSORS_ERROR_VALUE 0x80 ///< External temperature sensors error value +#define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 ///< Heaters internal temperature sensor fault /// Temperature sensor self test states typedef enum tempSensors_Self_Test_States @@ -91,19 +93,6 @@ } TEMPSENSORS_EXEC_STATES_T; /// FPGA error and read counts -typedef struct -{ - U08 RTDErrorCount; ///< RTD error count (include all 4 conductivity and temperature sensors) - U08 RTDReadCount; ///< RTD read count (include all 4 conductivity and temperature sensors) - U08 TRoErrorCount; ///< THDo (outlet redundant temperature sensor) error count - U08 TRoReadCount; ///< THDo (outlet redundant temperature sensor) read count - U08 TDiErrorCount; ///< TDi (inlet dialysate) temperature sensor error count - U08 TDiReadCount; ///< TDi (inlet dialysate) temperature sensor read count - U08 primaryHeaterFlags; ///< Primary heater internal temperature sensor error flags - U08 primaryHeaterReadCount; ///< Primary heater internal temperature sensor read count - U08 trimmerHeaterFlags; ///< Trimmer heater internal temperature sensor error flags - U08 trimmerHeaterReadCount; ///< Trimmer heater internal temperature sensor read count -} FPGA_READ_AND_ERROR_COUNTS_T; // TODO REmove static SELF_TEST_STATUS_T tempSensorsSelfTestResult; ///< Self test result of the TemperatureSensors module static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState; ///< TemperatureSensor self test state @@ -117,7 +106,8 @@ [ NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS ]; static F32 avgADCReads [ NUM_OF_TEMPERATURE_SENSORS ]; //TODO remove ///< Temperature sensors averaged ADC values static F32 temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; -static U32 readAndErrorCounts [ NUM_OF_TEMPERATURE_SENSORS ] [ NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS ]; +static U32 readAndErrorCounts [ NUM_OF_TEMPERATURE_SENSORS ] + [ NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS ]; // Private functions prototypes @@ -360,17 +350,9 @@ { U32 error; U32 heatersTemperature; - BOOL isADCValid = FALSE; + BOOL isADCValid = TRUE; F32 temperature; - - // TODO For testing only. REMOVE - /*temperature = getADC2TempConversion ( adc, - tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], - tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], - tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] );*/ - // TODO for testing only. REMOVE - /* * check if the index is not the heaters * Mask the values accordingly @@ -383,7 +365,8 @@ */ if ( sensorIndex != TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR || sensorIndex != TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ) { - error = adc & MASK_OFF_U32_MSB; + error = 0; + adc = adc & MASK_OFF_U32_MSB; /* * what if the fpga channel error is not zero? * what if the fpga channel error is zero but the individual is not? @@ -395,14 +378,15 @@ { // TODO: alarm? } - isADCValid = FALSE; + //isADCValid = FALSE; } if ( error == EXTERNAL_TEMP_SENSORS_ERROR_VALUE ) { //tODO: FILL UP - isADCValid = FALSE; + //isADCValid = FALSE; } } + // It is a heaters temperature sensor else { // Fault state is the 17th bit @@ -414,9 +398,9 @@ // Fault alarm? or have a threshold? // If the fault is 1, should we check the individuals? } - + // TODO fix these heatersTemperature = adc & 0xFF05; - heatersTemperature = (heatersTemperature & 0x7FFF) >> 2; + heatersTemperature = (heatersTemperature & 0x7FFF) >> 2; //TODO use #define for 2 } U32 previousReadCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ]; @@ -432,7 +416,7 @@ readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = internalErrorCount++; } - isADCValid = FALSE; + //isADCValid = FALSE; } else if ( fpgaCount > previousReadCount ) { @@ -481,7 +465,6 @@ { temperature = avgADCReads * HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF; } - temperatureValues [ sensorIndex ] = temperature; } } @@ -597,35 +580,14 @@ // Look at the error counter and the specific error flag to make sure the error is a temp sensor // Add a byte array to have bits for each sensor to find out exactly what sensor failed - //processADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp() ); - //processADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp() ); - //processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp() ); - //processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp() ); - //processADCRead( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp() ); - //processADCRead( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp() ); + processADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp(), 0, 0 ); + processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp(), 0, 0 ); + processADCRead( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp(), 0, 0 ); + processADCRead( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp(), 0, 0 ); //processADCRead( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, getFPGAPrimaryHeaterTemp() ); //processADCRead( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, getFPGATrimmerHeaterTemp() ); - // TODO REMOVE THIS CODE. FOR TESTING ONLY - - - /*U08 dara; - U32 test [20] = {16327313, 16330313, 16333313, 16336313, 16339313, 16342313, 16345313, 16348313, 16351313, 16354313, - 16357313, 16360313, 16363313, 16366313, 16369313, 16372313, 16375313, 16378313, 16381313, 16384313}; - - U32 test2 [20] = {16348313, 16358313, 16368313, 16378313, 16388313, 16398313, 16408313, 16418313, 16428313, 16438313, - 16448313, 16458313, 16468313, 16478313, 16488313, 16498313, 16508313, 16518313, 16528313, 16538313}; - - for ( dara = 0; dara<20; dara++) - { - processADCRead(0, test[dara]); - } - dara = 0; - for ( dara = 0; dara<20; dara++) - { - processADCRead(0, test2[dara]); - }*/ - // TODO REMOVE THE ABOVE CODE - return state; } Index: firmware/App/Controllers/TemperatureSensors.h =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -ra3b108c205e9bcd4d1a45033d73c5714c7247123 --- firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision a3b108c205e9bcd4d1a45033d73c5714c7247123) @@ -21,15 +21,15 @@ typedef enum SENSORS_NAME { - TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR = 0, - TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, - TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, - TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, - TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, - TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, - TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, - TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, - NUM_OF_TEMPERATURE_SENSORS + TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR = 0, ///< Inlet primary heaters temperature sensor + TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, ///< Outlet primary heaters temperature sensor + TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, ///< Conductivity sensor 1 temperature sensor + TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, ///< Conductivity sensor 2 temperature sensor + TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, ///< Outlet redundancy temperature sensor + TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, ///< Inlet dialysate temperature sensor + TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, ///< Primary heaters internal temperature sensor + TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, ///< Trimmer heater internal temperature sensor + NUM_OF_TEMPERATURE_SENSORS ///< Number of temperature sensors } TEMPERATURE_SENSORS_T; void initTemperatureSensors ( void ); Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -rf5d0c90297a0716e1fb5a5c946436cccd35050e5 -ra3b108c205e9bcd4d1a45033d73c5714c7247123 --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision f5d0c90297a0716e1fb5a5c946436cccd35050e5) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision a3b108c205e9bcd4d1a45033d73c5714c7247123) @@ -25,7 +25,7 @@ #include "Valves.h" /** - * @addtogroup DGValves + * @addtogroup Valves * @{ */