Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r8ff2c0f050380b2bab2f00eea71dcae546400bbc -rbbf1e3736be03a4f041ace57e0f95e23caf472dd --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 8ff2c0f050380b2bab2f00eea71dcae546400bbc) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision bbf1e3736be03a4f041ace57e0f95e23caf472dd) @@ -18,6 +18,7 @@ // TODO for testing only remove #include "mibspi.h" +#include "FPGA.h" // TODO for testing only remove #include "AlarmMgmt.h" @@ -27,9 +28,14 @@ #include "SystemCommMessages.h" #include "PIControllers.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 (25%) -#define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.50 ///< Trimmer heater max duty cycle (25%) +#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 @@ -38,9 +44,7 @@ #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 ///< 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 /// Heaters self test enums @@ -93,6 +97,8 @@ 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 //TODO add to AE +static BOOL isTrimmerHeaterOn; ///< Flag to show if the trimmer heater is on //TODO add to AE // private functions prototypes @@ -111,6 +117,10 @@ // 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 @@ -153,8 +163,9 @@ * The setPrimaryHeaterTargetTemperature function sets the primary heater * target temperature * @details - * Inputs : F32 (targetTemp) + * Inputs : primaryHeaterTargetTemperature * Outputs : none + * @param targetTemp : Target temperature * @return none *************************************************************************/ void setPrimaryHeaterTargetTemperature ( F32 targetTemp ) @@ -167,8 +178,9 @@ * The setTrimmerHeaterTargetTemperature function sets the trimmer heater * target temperature * @details - * Inputs : F32 (targetTemp) + * Inputs : trimmerHeaterTargetTemperature * Outputs : none + * @param targetTemp : Target temperature * @return none *************************************************************************/ void setTrimmerHeaterTargetTemperature ( F32 targetTemp ) @@ -313,17 +325,14 @@ switch ( primaryHeatersExecState ) { case PRIMARY_HEATERS_EXEC_STATE_OFF: - primaryHeatersExecState = handlePrimaryHeaterStateOff(); break; case PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET: - primaryHeatersExecState = handlePrimaryHeaterStateControlToTarget(); break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_PRIMARY_HEATER_EXEC_INVALID_STATE, primaryHeatersExecState ); primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; @@ -344,17 +353,14 @@ switch ( trimmerHeaterExecState ) { case TRIMMER_HEATER_EXEC_STATE_OFF: - trimmerHeaterExecState = handleTrimmerHeaterStateOff(); break; case TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET: - trimmerHeaterExecState = handleTrimmerHeaterControlToTarget(); break; default: - SET_ALARM_WITH_2_U32_DATA ( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_HEATERS_TRIMMER_HEATER_EXEC_INVALID_STATE, trimmerHeaterExecState ); trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; @@ -382,10 +388,12 @@ if ( TOGGLEPRIMAYHEATER() ) { setPrimaryHeaterTargetTemperature ( 37 ); - if ( getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ) > 0 ) + //if ( getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ) > 0 ) { startPrimaryHeater(); state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + temporaryStartROPump(); + temporaryStartFan(); } //state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; } @@ -427,12 +435,14 @@ } primaryHeaterTimerCounter = 0; } - publishTemperatureData(); + //publishTemperatureData(); // TODO remove this code if ( !TOGGLEPRIMAYHEATER() ) { stopPrimaryHeater(); + temporaryStopROPump(); + temporaryStopFan(); state = PRIMARY_HEATERS_EXEC_STATE_OFF; } // TODO Remove this code @@ -457,13 +467,15 @@ state = TRIMMER_HEATER_EXEC_STATE_OFF; if ( TOGGLEPRIMAYHEATER() ) { - setTrimmerHeaterTargetTemperature ( 37 ); - if ( getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ) > 0 ) + setTrimmerHeaterTargetTemperature ( 38 ); + //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; + //state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; } // TODO remove this code for testing @@ -490,12 +502,14 @@ setTrimmerHeaterPWM ( trimmerHeaterDutyCycle ); trimmerHeaterTimerCounter = 0; } - publishTemperatureData(); + //publishTemperatureData(); // TODO remove this code if ( !TOGGLEPRIMAYHEATER() ) { stopTrimmerHeater(); + temporaryStopROPump(); + temporaryStopFan(); state = TRIMMER_HEATER_EXEC_STATE_OFF; } // TODO Remove this code @@ -510,6 +524,7 @@ * @details * Inputs : none * Outputs : none + * @param : pwm : To set the PWM * @return none *************************************************************************/ static void setMainPrimaryHeaterPWM ( F32 pwm ) @@ -524,6 +539,7 @@ * @details * Inputs : none * Outputs : none + * @param: pwm : To set the PWM * @return none *************************************************************************/ static void setSmallPrimaryHeaterPWM ( F32 pwm ) @@ -537,6 +553,7 @@ * @details * Inputs : none * Outputs : none + * @param : pwm : To set the PWM * @return none *************************************************************************/ static void setTrimmerHeaterPWM ( F32 pwm ) @@ -551,21 +568,18 @@ * @details * Inputs : none * Outputs : none + * @param : heater (NAME_OF_HEATER) : Name of the heater to reset * @return none *************************************************************************/ static void resetHeaterState ( NAME_OF_HEATER_T heater ) { if ( heater == PRIMARY_HEATER ) { - F32 inletTemperatrue = getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ); - mainPrimaryHeaterDutyCycle = fabs(primaryHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; - resetPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, mainPrimaryHeaterDutyCycle ); + resetPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ); } else if ( heater == 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 ); + resetPIController ( PI_CONTROLLER_ID_TRIMMER_HEATER, SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE ); } } @@ -583,24 +597,49 @@ { 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 +#ifdef DEBUG_ENABLED + { + char debugTempStr[ 256 ]; + sprintf( debugTempStr, "MPDC: %2d, SPDC: %2d, THDC: %2d, 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, ROFlow: %6.2f\r\n", + (U32)(mainPrimaryHeaterDutyCycle*100), (U32)(smallPrimaryHeaterDutyCycle*100), (U32)(trimmerHeaterDutyCycle*100), + 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, + (F32)(10909.0909/getFPGAROPumpFlowRate()) ); + sendDebugData ( (U08*)debugTempStr, strlen(debugTempStr) ); + } +#endif dataPublicationTimerCounter = 0; } } + +// TODO REMOVE THE CODE +static void temporaryStartROPump ( void ) +{ + F32 tempPWM = 0.6; + 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