Index: firmware/App/Controllers/Thermistors.c =================================================================== diff -u -rddb9707d9e6e46c4b384782aeec20d41f3822996 -r6499ea25921fcf67826fa0c35bb03caf411ba542 --- firmware/App/Controllers/Thermistors.c (.../Thermistors.c) (revision ddb9707d9e6e46c4b384782aeec20d41f3822996) +++ firmware/App/Controllers/Thermistors.c (.../Thermistors.c) (revision 6499ea25921fcf67826fa0c35bb03caf411ba542) @@ -1,12 +1,30 @@ +/************************************************************************** +* +* Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file Thermistors.c +* +* @author (last) Dara Navaei +* @date (last) 03-Nov-2022 +* +* @author (original) Dara Navaei +* @date (original) 25-Nov-2020 +* +***************************************************************************/ #include // For temperature calculations #include "FPGA.h" #include "InternalADC.h" +#include "MessageSupport.h" #include "PersistentAlarm.h" #include "SystemCommMessages.h" #include "Thermistors.h" #include "TaskGeneral.h" +#include "Utilities.h" /** * @addtogroup Thermistors @@ -17,16 +35,17 @@ #define THERMISTORS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Thermistors publish data time interval. #define THERMISTORS_ADC_READ_INTERVAL ( MS_PER_SECOND / ( 2 * TASK_GENERAL_INTERVAL ) ) ///< Thermistors ADC read time interval. -#define ADC_FPGA_READ_DELAY_COUNT 1.0 ///< FGPA read delay upon startup. +#define ADC_FPGA_READ_DELAY_COUNT 1.0F ///< FGPA read delay upon startup. #define TWELVE_BIT_RESOLUTION 4096U ///< 12 bit resolution conversion. -#define THERMISTOR_REFERENCE_VOLTAGE 3.0 ///< Thermistors source voltage. -#define THERMISTOR_REFERENCE_RESISTOR_AT_25 10000.0 ///< Thermistors reference resistor in ohms. -#define THERMISTOR_REFERENCE_TEMPERATURE 298.0 ///< Thermistors reference temperature in kelvin. -#define THERMISTOR_BETA_VALUE 3380.0 ///< Thermistors beta value. -#define CELSIUS_TO_KELVIN_CONVERSION 273.15 ///< Celsius to Kelvin temperature conversion. -#define MIN_ALLOWED_TEMPERATURE 0.0 ///< Thermistors/sensors minimum allowed temperature reading. -#define MAX_ALLOWED_TEMPERATURE 80.0 ///< Thermistors/sensors maximum allowed temperature reading. +#define THERMISTOR_REFERENCE_VOLTAGE 3.0F ///< Thermistors source voltage. +#define THERMISTOR_REFERENCE_RESISTOR_AT_25 10000.0F ///< Thermistors reference resistor in ohms. +#define THERMISTOR_REFERENCE_TEMPERATURE 298.0F ///< Thermistors reference temperature in kelvin. +#define THERMISTOR_BETA_VALUE 3380.0F ///< Thermistors beta value. +#define CELSIUS_TO_KELVIN_CONVERSION 273.15F ///< Celsius to Kelvin temperature conversion. +#define MIN_ALLOWED_TEMPERATURE 0.0F ///< Thermistors/sensors minimum allowed temperature reading. +#define MAX_ALLOWED_TEMPERATURE 80.0F ///< Thermistors/sensors maximum allowed temperature reading. #define MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD ( 5 * MS_PER_SECOND ) ///< Thermistors/sensors maximum allowed temperature out of range period. +#define DATA_PUBLISH_COUNTER_START_COUNT 2 ///< Data publish counter start count. /// Thermistors exec states typedef enum thermistors_Exec_States @@ -43,7 +62,7 @@ OVERRIDE_F32_T temperatureValue; ///< Thermistor temperature value. } THERMISTOR_T; -static THERMISTORS_EXEC_STATES_T thermistorsExecState = THERMISTORS_EXEC_STATE_START_STATE; ///< Thermistors exec state. +static THERMISTORS_EXEC_STATES_T thermistorsExecState; ///< Thermistors exec state. static THERMISTOR_T thermistorsStatus[ NUM_OF_THERMISTORS ]; ///< Thermistors array. static OVERRIDE_U32_T thermistorsPublishInterval = { THERMISTORS_DATA_PUBLISH_INTERVAL, THERMISTORS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Thermistors publish time interval override. @@ -63,7 +82,6 @@ static void convertADC2Temperature( void ); static F32 calculateThemristorTemperature( U32 adcValue ); static void publishThermistorsData( void ); -static U32 getPublishThermistorsDataInterval( void ); /*********************************************************************//** * @brief @@ -76,7 +94,7 @@ { // Reset the thermistors values for a run thermistorsExecState = THERMISTORS_EXEC_STATE_START_STATE; - dataPublishCounter = 0; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; // Initialize a persistent alarm for thermistors temeprature out of range initPersistentAlarm( ALARM_ID_DG_THERMISTORS_TEMPERATURE_OUT_OF_RANGE, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD ); @@ -93,7 +111,6 @@ { SELF_TEST_STATUS_T status = SELF_TEST_STATUS_IN_PROGRESS; - // TODO implement the calibration processing function. // It returns a pass for now status = SELF_TEST_STATUS_PASSED; @@ -126,6 +143,15 @@ break; } + // First convert the values + convertADC2Temperature(); + + // Monitor the values for a gross range check + // Monitor is called in this function because this driver is constantly reading + // the thermistor values. Also the internal ADC values are processed with moving average in the internalADC driver + // So the thermistors drivers just gets the latest ADC value and converts it to temperature + monitorThermistors(); + // Check if it is time to publish any data publishThermistorsData(); } @@ -200,17 +226,17 @@ // If time has elapsed to read the ADCs, read them all if ( ++adcReadCounter >= THERMISTORS_ADC_READ_INTERVAL ) { +#ifndef _RELEASE_ + if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) + { + thermistorsStatus[ THERMISTOR_ONBOARD_NTC ].rawADCRead = getIntADCReading( INT_ADC_BOARD_THERMISTOR ); + } +#endif // Get all the raw readings in ADC - thermistorsStatus[ THERMISTOR_ONBOARD_NTC ].rawADCRead = getIntADCReading( INT_ADC_BOARD_THERMISTOR ); + thermistorsStatus[ THERMISTOR_ONBOARD_NTC ].rawADCRead = getFPGAOnBoardThermistorCount(); thermistorsStatus[ THERMISTOR_POWER_SUPPLY_1 ].rawADCRead = getIntADCReading( INT_ADC_POWER_SUPPLY_1_THERMISTOR ); thermistorsStatus[ THERMISTOR_POWER_SUPPLY_2 ].rawADCRead = getIntADCReading( INT_ADC_POWER_SUPPLY_2_THERMISTOR ); - // Monitor the values for a gross range check - // Monitor is called in this function because this driver is constantly reading - // the thermistor values. Also the internal ADC values are processed with moving average in the internalADC driver - // So the thermistors drivers just gets the latest ADC value and converts it to temperature - monitorThermistors(); - // Zero the counter for the next round of reading adcReadCounter = 0; } @@ -231,13 +257,10 @@ THERMISTORS_TEMP_SENSORS_T thermistor; F32 temperature; - // First convert the values - convertADC2Temperature(); - for ( thermistor = THERMISTOR_ONBOARD_NTC; thermistor < NUM_OF_THERMISTORS; thermistor++ ) { temperature = getThermistorTemperatureValue( thermistor ); - BOOL const isTempOutOfRange = ( temperature > MAX_ALLOWED_TEMPERATURE ) || ( temperature < MIN_ALLOWED_TEMPERATURE ); + BOOL isTempOutOfRange = ( temperature > MAX_ALLOWED_TEMPERATURE ) || ( temperature < MIN_ALLOWED_TEMPERATURE ); checkPersistentAlarm( ALARM_ID_DG_THERMISTORS_TEMPERATURE_OUT_OF_RANGE, isTempOutOfRange, temperature, MAX_ALLOWED_TEMPERATURE ); } @@ -302,26 +325,6 @@ /*********************************************************************//** * @brief - * The getPublishThermistorsDataInterval function gets the thermistors - * data publish interval. - * @details Inputs: thermistorsPublishInterval - * @details Outputs: none - * @return data publish time interval in counts - *************************************************************************/ -static U32 getPublishThermistorsDataInterval( void ) -{ - U32 result = thermistorsPublishInterval.data; - - if ( OVERRIDE_KEY == thermistorsPublishInterval.override ) - { - result = thermistorsPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The publishThermistorsData function publishes the thermistors and * temperature sensors data at the specified time interval. * @details Inputs: dataPublishCounter @@ -330,7 +333,7 @@ *************************************************************************/ static void publishThermistorsData( void ) { - if ( ++dataPublishCounter > getPublishThermistorsDataInterval() ) + if ( ++dataPublishCounter > getU32OverrideValue( &thermistorsPublishInterval ) ) { THERMISTORS_DATA_T sensorsData; @@ -340,7 +343,8 @@ sensorsData.powerSupply2Thermistor = getThermistorTemperatureValue( THERMISTOR_POWER_SUPPLY_2 ); // Broadcast the thermistors data - broadcastThermistorsData( &sensorsData ); + broadcastData( MSG_ID_DG_THERMISTORS_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&sensorsData, sizeof( THERMISTORS_DATA_T ) ); + // Reset the counter dataPublishCounter = 0; }