Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) @@ -42,7 +42,9 @@ #define INITIAL_DUTY_CYCLE_SMALL_PRIMARY_HEATER 0.10 #define INITIAL_DUTY_CYCLE_TRIMMER_HEATER 0.10 -typedef enum heaters_self_tesst_states +#define DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION 0.03 + +typedef enum heaters_self_test_states { HEATERS_SELF_TEST_START = 0, HEATERS_SELF_TEST_START_SMALL_PRIMARY_AND_TRIMMER, @@ -65,12 +67,22 @@ NUM_OF_TRIMMER_HEATER_EXEC_STATES } TRIMMER_HEATER_EXEC_STATES_T; +typedef enum name_of_heaters +{ + PRIMARY_HEATER = 0, + TRIMMER_HEATER, + NUM_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 F32 primaryHeaterTargetTemperature; +static F32 trimmerHeaterTargetTemperature; static F32 smallPrimaryHeaterPWMDutyCycle; static F32 mainPrimaryHeaterPWMDutyCycle; static F32 trimmerHeaterPWMDutyCycle; @@ -80,9 +92,10 @@ static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ); static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateControlToTarget ( void ); -static void setMainPrimaryHeaterPWM( F32 pwm ); +static void setMainPrimaryHeaterPWM ( F32 pwm ); static void setSmallPrimaryHeaterPWM ( F32 pwm ); -static void setTrimmerHeaterPWM( F32 pwm ); +static void setTrimmerHeaterPWM ( F32 pwm ); +static void resetHeaterState ( NAME_OF_HEATER_T heater ); // TODo GPIO for enabling the primary heater #define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) @@ -96,18 +109,49 @@ heatersSelfTestState = HEATERS_SELF_TEST_START; primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_OFF; + + primaryHeaterTargetTemperature = 0.0; + trimmerHeaterTargetTemperature = 0.0; smallPrimaryHeaterPWMDutyCycle = 0.0; mainPrimaryHeaterPWMDutyCycle = 0.0; trimmerHeaterPWMDutyCycle = 0.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 ); } -void startPrimaryHeater ( void ) +void setPrimaryHeaterTargetTemperature ( F32 targetTemp ) { - setMainPrimaryHeaterPWM ( 0.5 ); + primaryHeaterTargetTemperature = targetTemp; +} + +void setTrimmerHeaterTargetTemperature ( F32 targetTemp ) +{ + trimmerHeaterTargetTemperature = targetTemp; +} + +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 ); + primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + status = TRUE; + } + + return status; } -void startTrimmerHeater ( void ) +BOOL startTrimmerHeater ( void ) { setTrimmerHeaterPWM ( INITIAL_DUTY_CYCLE_MAIN_PRIMARY_HEATER ); } @@ -151,7 +195,6 @@ return heatersSelfTestResult; } - void execPrimaryHeaters ( void ) { switch ( primaryHeatersExecState ) @@ -196,42 +239,77 @@ } } -static void setMainPrimaryHeaterPWM( F32 pwm ) -{ - etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} +// Private functions -static void setSmallPrimaryHeaterPWM ( F32 pwm ) -{ - etpwmSetCmpB( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} -static void setTrimmerHeaterPWM( F32 pwm ) -{ - etpwmSetCmpA( etpwmREG3, (U32)( (S32)( ( pwm * (F32)(etpwmREG3->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); -} - static PRIMARY_HEATERS_EXEC_STATES_T handlePrimaryHeaterStateOff ( void ) { PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; return 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 ) + { + setMainPrimaryHeaterPWM ( MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ); + newPWM = newPWM - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + setSmallPrimaryHeaterPWM ( newPWM ); + } + else + { + + } + + // TODO remove this code for testing if ( TOGGLEPRIMAYHEATER() ) { startPrimaryHeater(); } - if ( !TOGGLEPRIMAYHEATER() ) { stopPrimaryHeater(); } // TODO remove this code for testing - return state; } + +static void setMainPrimaryHeaterPWM( F32 pwm ) +{ + etpwmSetCmpA( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} + +static void setSmallPrimaryHeaterPWM ( F32 pwm ) +{ + etpwmSetCmpB( etpwmREG1, (U32)( (S32)( ( pwm * (F32)(etpwmREG1->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} + +static void setTrimmerHeaterPWM( F32 pwm ) +{ + etpwmSetCmpA( etpwmREG3, (U32)( (S32)( ( pwm * (F32)(etpwmREG3->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} + +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 ); + } + else if ( heater == TRIMMER_HEATER ) + { + // TODO setup the trimmer heater + } +} + + + Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) @@ -22,8 +22,8 @@ void setPrimaryHeaterTargetTemperature ( F32 targetTemp ); void setTrimmerHeaterTargetTemperature ( F32 targetTemp ); -void startPrimaryHeater ( void ); -void startTrimmerHeater ( void ); +BOOL startPrimaryHeater ( void ); +BOOL startTrimmerHeater ( void ); void stopPrimaryHeater ( void ); void stopTrimmerHeater ( void ); Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) @@ -114,8 +114,8 @@ break; default: - pressuresState = PRESSURE_INIT_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, pressuresState ) // TODO - replace 1st param with s/w fault enum + pressuresState = PRESSURE_INIT_STATE; break; } Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -rc48a99d2d1c852adcc986253b6c420a90dab7bfe -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision c48a99d2d1c852adcc986253b6c420a90dab7bfe) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) @@ -97,8 +97,8 @@ break; default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, drainState ) // TODO - add s/w fault enum to 1st data param drainState = DRAIN_STATE_START; - // TODO - s/w fault break; } } Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -rc48a99d2d1c852adcc986253b6c420a90dab7bfe -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision c48a99d2d1c852adcc986253b6c420a90dab7bfe) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) @@ -33,7 +33,7 @@ // ********** private definitions ********** #define TARGET_RO_PRESSURE_PSI 120 ///< Target pressure for RO pump. -#define FLUSH_LINES_VOLUME_ML 100.0 ///< Water volume to flush when starting re-circulate mode. +#define FLUSH_LINES_VOLUME_L 0.1 ///< Water volume (in Liters) to flush when starting re-circulate mode. // ********** private data ********** @@ -136,7 +136,7 @@ flushLinesVolume += waterVolume; // when enough water volume has flowed to flush the lines, transition to re-circ state - if ( flushLinesVolume >= FLUSH_LINES_VOLUME_ML ) + if ( flushLinesVolume >= FLUSH_LINES_VOLUME_L ) { // TODO - change VDr from drain to re-circulate result = RECIRCULATE_MODE_STATE_RECIRC_WATER; Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rc48a99d2d1c852adcc986253b6c420a90dab7bfe -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision c48a99d2d1c852adcc986253b6c420a90dab7bfe) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) @@ -76,8 +76,8 @@ *************************************************************************/ void transitionToStandbyMode( void ) { - // reset to start state each time we transition to standby mode - standbyState = STANDBY_MODE_STATE_START; + // re-initialize standby mode each time we transition to standby mode + initStandbyMode(); // TODO - set initial actuator states } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -re5c9e31c2644c7f0ca17ba81767a8ed19b99cebf --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision e5c9e31c2644c7f0ca17ba81767a8ed19b99cebf) @@ -596,8 +596,8 @@ result = TRUE; memcpy( &payload, message->payload, sizeof(TARGET_TEMPS_PAYLOAD_T) ); - //setPrimaryHeaterTargetTemperature( (F32)payload.targetPrimaryHeaterTemp ); - //setTrimmerHeaterTargetTemperature( (F32)payload.targetTrimmerHeaterTemp ); + setPrimaryHeaterTargetTemperature( (F32)payload.targetPrimaryHeaterTemp ); + setTrimmerHeaterTargetTemperature( (F32)payload.targetTrimmerHeaterTemp ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); }