Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -re83f47ec5c3d458701a32069dba4fe81aae6fd67 -r4df3087b3b1944c60cd33c752a81c3fdba19189f --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision e83f47ec5c3d458701a32069dba4fe81aae6fd67) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 4df3087b3b1944c60cd33c752a81c3fdba19189f) @@ -28,86 +28,97 @@ #include "SystemCommMessages.h" #include "PIControllers.h" #include "TaskGeneral.h" +#include "Timers.h" /** * @addtogroup Heaters * @{ */ -#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.89 ///< Main primary heater (heater A) max duty cycle (89%) -#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.50 ///< Small Primary heater (heater B) max duty cycle (50%) -#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.50 ///< Trimmer heater max duty cycle (50%) -#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters minimum duty cycle (0.00%) +#define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.89 ///< Main primary heater (heater A) max duty cycle (89%) +#define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.50 ///< Small Primary heater (heater B) max duty cycle (50%) +#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.50 ///< Trimmer heater max duty cycle (50%) +#define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters minimum duty cycle (0.00%) -#define PRIMARY_HEATERS_P_COEFFICIENT 0.02 ///< Primary heaters proportional coefficient -#define PRIMARY_HEATERS_I_COEFFICIENT 0.001 ///< Primary heaters integral coefficient +#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.02 ///< Trimmer heater proportional coefficient -#define TRIMMER_HEATER_I_COEFFICIENT 0.001 ///< Trimmer heater integral coefficient +#define TRIMMER_HEATER_P_COEFFICIENT 0.02 ///< Trimmer heater proportional coefficient +#define TRIMMER_HEATER_I_COEFFICIENT 0.001 ///< Trimmer heater integral coefficient -#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 CONTROLLER_CHECK_INTERVAL_COUNT 10U ///< Time interval count to check the PI controller +#define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count -#define HEATERS_DATA_PUBLISH_INTERVAL (500 / TASK_GENERAL_INTERVAL ) // TODO add to AE +#define HEATERS_DATA_PUBLISH_INTERVAL (500 / TASK_GENERAL_INTERVAL ) ///< Heaters data publish interval // TODO add to AE +#define SMALL_PRIMARY_AND_TRIMMER_HEATERS_POST_TARGET_TEMPERATURE 40U ///< Small primary and trimmer heaters target temperature during POST //TODO add to AE +#define MAIN_PRIMARY_HEATER_POST_TARGET_TEMPERATURE 35U ///< Main primary heater target temperature during POST //TODO add to AE +#define HEATERS_POST_HEAT_UP_TIME_SECONDS 50U ///< The time that the heaters are heated up to reach to the target temperature during POST //TODO add to AE +#define HEATERS_POST_TEMPERATURE_TOLERANCE 1U ///< Tolerance of the sensors to the target temperature during POST //TODO add to AE + /// Heaters self test enums typedef enum 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_START = 0, ///< Heaters self test start state + HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS, ///< Heaters self test small primary and trimmer heaters state + HEATERS_SELF_TEST_MAIN_PRIMARY_HEATER, ///< 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 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_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 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_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, ///< Primary heater - TRIMMER_HEATER, ///< Trimmer heater - NUM_OF_HEATERS ///< Number 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; ///< 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 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; ///< Primary heaters target temperature -static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature +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 -static BOOL isPrimaryHeaterOn; ///< Flag to show if the primary heater is on -static BOOL isTrimmerHeaterOn; ///< Flag to show if the trimmer heater is on +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 +static BOOL isPrimaryHeaterOn; ///< Flag to show if the primary heater is on +static BOOL isTrimmerHeaterOn; ///< Flag to show if the trimmer heater is on static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, - HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; // TODO add to AE + HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval // TODO add to AE +static U32 selfTestElapsedTime; ///< Self test elapsed time variable //TODO add to AE // private functions prototypes +static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestStart ( void ); //TODO add to AE +static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestSmallPrimaryAndTrimmerHeaters ( void ); //TODO add to AE +static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestMainPrimaryHeater ( void ); //TODO add to AE + static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ); static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ); @@ -124,10 +135,6 @@ // 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) -/*static void temporaryStartROPump ( void ); -static void temporaryStopROPump ( void ); -static void temporaryStartFan ( void ); -static void temporaryStopFan ( void );*/ //TODO: Remove the above code. FOR TESTING ONLY // Public functions @@ -156,6 +163,7 @@ dataPublicationTimerCounter = 0; isPrimaryHeaterOn = FALSE; isTrimmerHeaterOn = FALSE; + selfTestElapsedTime = 0; // Initialize the PI controller for the primary heaters initializePIController( PI_CONTROLLER_ID_PRIMARY_HEATER, HEATERS_MIN_DUTY_CYCLE, @@ -310,15 +318,19 @@ switch ( heatersSelfTestState ) { case HEATERS_SELF_TEST_START: + heatersSelfTestState = handleHeatersSelfTestStart(); break; - case HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER: + case HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS: + heatersSelfTestState = handleHeatersSelfTestSmallPrimaryAndTrimmerHeaters(); break; - case HEATERS_SELF_TEST_START_MAIN_PRIMARY: + case HEATERS_SELF_TEST_MAIN_PRIMARY_HEATER: + heatersSelfTestState = handleHeatersSelfTestMainPrimaryHeater(); break; case HEATERS_SELF_TEST_COMPLETE: + // POST is done. Do nothing break; default: @@ -393,6 +405,108 @@ /*********************************************************************//** * @brief + * The handleHeatersSelfTestStart function starts the small primary and + * the trimmer heaters for self test + * @details + * Inputs : heatersSelfTestResult, selfTestElapsedTime + * Outputs : heatersSelfTestResult, selfTestElapsedTime + * @param none + * @return state (HEATERS_SELF_TEST_STATES_T) + *************************************************************************/ +static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestStart ( void ) +{ + heatersSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + setSmallPrimaryHeaterPWM ( SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE ); + setTrimmerHeaterPWM ( TRIMMER_HEATER_MAX_DUTY_CYCLE ); + selfTestElapsedTime = getMSTimerCount(); + + return HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS; +} + +/*********************************************************************//** + * @brief + * The handleHeatersSelfTestSmallPrimaryAndTrimmerHeaters function checks + * if the time on the small primary and trimmer heaters has elapsed and + * if time has elapsed, it checks the thermocouple temperature shared + * among the two heaters. If they are in range, it sets the main primary + * heater and transitions to the next state. If it fails, it set an alarm + * and fails the test + * @details + * Inputs : heatersSelfTestResult, selfTestElapsedTime + * Outputs : heatersSelfTestResult, selfTestElapsedTime + * @param none + * @return state (HEATERS_SELF_TEST_STATES_T) + *************************************************************************/ +static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestSmallPrimaryAndTrimmerHeaters ( void ) +{ + HEATERS_SELF_TEST_STATES_T state = HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS; + + if ( didTimeout( selfTestElapsedTime, HEATERS_POST_HEAT_UP_TIME_SECONDS ) ) + { + setSmallPrimaryHeaterPWM ( 0 ); + setTrimmerHeaterPWM ( 0 ); + + F32 convertedTemperature = getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP ); + + if ( fabs(convertedTemperature - SMALL_PRIMARY_AND_TRIMMER_HEATERS_POST_TARGET_TEMPERATURE) > HEATERS_POST_TEMPERATURE_TOLERANCE ) + { + //TODO alarm + // TODO POST failed + heatersSelfTestResult = SELF_TEST_STATUS_FAILED; + state = HEATERS_SELF_TEST_COMPLETE; + } + else + { + setMainPrimaryHeaterPWM ( MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ); + selfTestElapsedTime = getMSTimerCount(); + state = HEATERS_SELF_TEST_MAIN_PRIMARY_HEATER; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleHeatersSelfTestMainPrimaryHeater function checks + * if the time on the main primary heater has elapsed and it it has elapsed, + * it checks to ensure the thermocouples temperature is within the tolerance + * of the target temperature. It then transitions to the complete state + * @details + * Inputs : heatersSelfTestResult + * Outputs : heatersSelfTestResult + * @param none + * @return state (HEATERS_SELF_TEST_STATES_T) + *************************************************************************/ +static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestMainPrimaryHeater ( void ) +{ + HEATERS_SELF_TEST_STATES_T state = HEATERS_SELF_TEST_MAIN_PRIMARY_HEATER; + + if ( didTimeout( selfTestElapsedTime, HEATERS_POST_HEAT_UP_TIME_SECONDS ) ) + { + setMainPrimaryHeaterPWM ( 0 ); + + F32 convertedTemperature = getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP ); + + if ( fabs(convertedTemperature - MAIN_PRIMARY_HEATER_POST_TARGET_TEMPERATURE ) > HEATERS_POST_TEMPERATURE_TOLERANCE ) + { + //TODO alarm + // TODO POST failed + heatersSelfTestResult = SELF_TEST_STATUS_FAILED; + } + else + { + heatersSelfTestResult = SELF_TEST_STATUS_PASSED; + } + + state = HEATERS_SELF_TEST_COMPLETE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handlePrimaryHeaterStateOff function handles the primary heaters at * off state * @details @@ -699,6 +813,7 @@ broadcastHeatersData ( (U32)(mainPrimaryHeaterDutyCycle*100), (U32)(smallPrimaryHeaterDutyCycle*100), (U32)(trimmerHeaterDutyCycle*100) ); + //NOTE: This section will be removed #ifdef DEBUG_ENABLED { char debugTempStr[ 256 ]; @@ -804,28 +919,4 @@ return result; } -// TODO REMOVE THE CODE -/*static void temporaryStartROPump ( void ) -{ - F32 tempPWM = 1; - etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( tempPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} -static void temporaryStopROPump ( void ) -{ - etpwmSetCmpB( etpwmREG2, 0 ); -} - -static void temporaryStartFan ( void ) -{ - F32 tempPWM = 0.25; - etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( tempPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( tempPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} -static void temporaryStopFan ( void ) -{ - etpwmSetCmpA( etpwmREG6, 0 ); - etpwmSetCmpB( etpwmREG6, 0 ); -}*/ -// TODO REMOVE THE CODE - /**@}*/