Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -re03873e424a6c2fc6eca07511e8c80dc91a5afdc -r1bae132ac03871b4a1ef4db9b907acf24c08c873 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision e03873e424a6c2fc6eca07511e8c80dc91a5afdc) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 1bae132ac03871b4a1ef4db9b907acf24c08c873) @@ -53,10 +53,10 @@ #define MAX_ALLOWED_UNCHANGED_ADC_READS 4U ///< Maximum number of times that the read of a sensor cannot change #define SHIFT_BITS_BY_2 2U ///< Shift bits by 2 #define SHIFT_BITS_BY_5_FOR_AVERAGING 5U ///< Shift the ADCs of the temperature sensors by 5 to average them +#define INLET_WATER_TEMPERATURE_PERSISTENCE_COUNT 1000 ///< Number of persistence count for temperature sensors out of range error #define MIN_WATER_INPUT_TEMPERATURE 10U ///< Minimum water input temperature #define MAX_WATER_INPUT_TEMPERATURE 35U ///< Maximum water input temperature -#define INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL 100U ///< Time interval that is used to check the input water #define HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL 20U ///< Time interval that is used to calculate the heaters internal temperature #define HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient @@ -68,7 +68,7 @@ #define EXTERNAL_TEMP_SENSORS_ERROR_VALUE 0x80 ///< External temperature sensors error value #define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 ///< Heaters internal temperature sensor fault -#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL (5000 / TASK_PRIORITY_INTERVAL) ///< Temperature sensors publish data time interval +#define TEMP_SENSORS_DATA_PUBLISH_INTERVAL (1000 / TASK_PRIORITY_INTERVAL) ///< Temperature sensors publish data time interval /// Temperature sensor self test states typedef enum tempSensors_Self_Test_States @@ -113,8 +113,11 @@ static TEMP_SENSOR_T tempSensors [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors' data structure static U32 elapsedTime; ///< Elapsed time variable -static U32 internalHeatersConversionTimer; ///< Conversion timer variable to calculate the heaters internal temperature +static U32 internalHeatersConversionTimer; +static U32 inletWaterTempOutOfRangeCounter; +static U32 inletWaterTempInRangeCounter; + static F32 tempValuesForPublication [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors data publication array static U32 dataPublicationTimerCounter; ///< Temperature sensors data publish timer counter static OVERRIDE_U32_T tempSensorsPublishInterval = { TEMP_SENSORS_DATA_PUBLISH_INTERVAL, @@ -173,11 +176,13 @@ void initTemperatureSensors ( void ) { U08 i; - tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; - tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; - elapsedTime = 0; - internalHeatersConversionTimer = 0; - dataPublicationTimerCounter = 0; + tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; + tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; + elapsedTime = 0; + internalHeatersConversionTimer = 0; + inletWaterTempOutOfRangeCounter = 0; + inletWaterTempInRangeCounter = 0; + dataPublicationTimerCounter = 0; /* NOTE: The temperature sensors do not have conversion coefficient. * The conversion coefficients are used for the heaters internal temperature sensors and @@ -304,6 +309,40 @@ /************************************************************************* * @brief + * The checkInletWaterTemperature checks inlet water temperature value + * and triggers an alarm when temperature value is out of allowed range. + * @details + * Inputs : none + * Outputs : Trigger alarms when temperature is out of allowed range + * @param none + * @return none + *************************************************************************/ +void checkInletWaterTemperature( void ) +{ + F32 const temperature = getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ); + if ( temperature < MIN_WATER_INPUT_TEMPERATURE || temperature > MAX_WATER_INPUT_TEMPERATURE ) + { + ++inletWaterTempOutOfRangeCounter; + inletWaterTempInRangeCounter = 0; + if ( inletWaterTempOutOfRangeCounter > INLET_WATER_TEMPERATURE_PERSISTENCE_COUNT ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE, temperature ); + } + } + else + { + ++inletWaterTempInRangeCounter; + inletWaterTempOutOfRangeCounter = 0; + if ( isAlarmActive( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE ) && + inletWaterTempInRangeCounter > INLET_WATER_TEMPERATURE_PERSISTENCE_COUNT ) + { + clearAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE ); + } + } +} + +/************************************************************************* + * @brief * The getTemperatureValue function gets the enum of the requested * temperature sensor and returns the temperature * @details @@ -511,16 +550,13 @@ ++tempSensors[ sensorIndex ].internalErrorCount; if ( tempSensors[ sensorIndex ].internalErrorCount > MAX_ALLOWED_UNCHANGED_ADC_READS ) { - // TODO alarm + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_TEMPERATURE_SENSORS_FAULT, sensorIndex ); } } } else { - /*if ( error == EXTERNAL_TEMP_SENSORS_ERROR_VALUE ) - { - // TODO: alarm? - }*/ + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_TEMPERATURE_SENSORS_FAULT, sensorIndex ); } return isADCValid; @@ -680,21 +716,6 @@ processHtrsTempSnsrsADCRead ( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR, getFPGAPRimaryColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGAPrimaryHeaterReadCount() ); processHtrsTempSnsrsADCRead ( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR, getFPGATrimmerColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); - // Check the inlet water is within temperature range at the desired time interval - if ( elapsedTime == 0 ) - { - elapsedTime = getMSTimerCount(); - } - else if ( didTimeout( elapsedTime, INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL ) && - tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].temperatureValues.override != OVERRIDE_KEY ) - { - elapsedTime = 0; - F32 inletTemperature = tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].temperatureValues.data; - if ( inletTemperature < MIN_WATER_INPUT_TEMPERATURE || inletTemperature >= MAX_WATER_INPUT_TEMPERATURE ) - { - SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE, inletTemperature ); - } - } // Check if time has elapsed to calculate the internal temperature of the heaters if ( internalHeatersConversionTimer >= HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL ) {