Index: firmware/App/Controllers/Voltages.c =================================================================== diff -u --- firmware/App/Controllers/Voltages.c (revision 0) +++ firmware/App/Controllers/Voltages.c (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -0,0 +1,454 @@ +/************************************************************************** +* +* Copyright (c) 2019-2020 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 Voltages.c +* +* @author (last) Sean Nash +* @date (last) 21-Apr-2021 +* +* @author (original) Sean +* @date (original) 21-Apr-2021 +* +***************************************************************************/ + +#include "AlarmMgmt.h" +#include "InternalADC.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" +#include "Timers.h" +#include "Voltages.h" + +/** + * @addtogroup Voltages + * @{ + */ + +// ********** private definitions ********** + +#define VOLTAGES_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the voltages data is published on the CAN bus. +#define VOLTAGES_ALARM_PERSISTENCE ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Alarm persistence period for voltage monitor alarms. + +/// Defined states for the pressure and occlusion monitor state machine. +typedef enum Voltages_States +{ + VOLTAGES_INIT_STATE = 0, ///< Initialization state. + VOLTAGES_MONITOR_STATE, ///< Continuous read sensors state. + NUM_OF_VOLTAGES_STATES ///< Number of voltage monitor states. +} VOLTAGES_STATE_T; + +/// Defined states for the voltage monitor self-test state machine. +typedef enum Voltages_Self_Test_States +{ + VOLTAGES_SELF_TEST_STATE_START = 0, ///< Self test start state. + VOLTAGES_TEST_STATE_IN_PROGRESS, ///< Self test in progress state. + VOLTAGES_TEST_STATE_COMPLETE, ///< Self test completed state. + NUM_OF_VOLTAGES_SELF_TEST_STATES ///< Number of voltage monitor self-test states. +} VOLTAGES_SELF_TEST_STATE_T; + +/// Maximum voltage/current level for each monitored signal. +static const F32 MAX_VOLTAGES[ NUM_OF_MONITORED_LINES ] = +{ + 26.4, // MONITORED_LINE_24V_MAIN + 1.98, // MONITORED_LINE_1_8V_FPGA + 1.1, // MONITORED_LINE_1V_FPGA + 3.63, // MONITORED_LINE_3_3V_SENSORS + 1.98, // MONITORED_LINE_1_8V_PROC + 5.5, // MONITORED_LINE_5V_SENSORS + 5.5, // MONITORED_LINE_5V_LOGIC + 3.63, // MONITORED_LINE_3_3V + 1.32, // MONITORED_LINE_1_2V_PROC + 3.3, // MONITORED_LINE_V_REF + 3.3, // MONITORED_LINE_EXT_ADC_1_REF_V + 3.3, // MONITORED_LINE_EXT_ADC_2_REF_V + 26.4, // MONITORED_LINE_24V_PRIM_HTR_V + 26.4 // MONITORED_LINE_24V_TRIM_HTR_V +}; +/// Minimum voltage/current level for each monitored signal. +static const F32 MIN_VOLTAGES[ NUM_OF_MONITORED_LINES ] = +{ + 21.6, // MONITORED_LINE_24V_MAIN + 1.62, // MONITORED_LINE_1_8V_FPGA + 0.9, // MONITORED_LINE_1V_FPGA + 2.97, // MONITORED_LINE_3_3V_SENSORS + 1.62, // MONITORED_LINE_1_8V_PROC + 4.5, // MONITORED_LINE_5V_SENSORS + 4.5, // MONITORED_LINE_5V_LOGIC + 2.97, // MONITORED_LINE_3_3V + 1.08, // MONITORED_LINE_1_2V_PROC + 2.7, // MONITORED_LINE_V_REF + 2.7, // MONITORED_LINE_EXT_ADC_1_REF_V + 2.7, // MONITORED_LINE_EXT_ADC_2_REF_V + 21.6, // MONITORED_LINE_24V_PRIM_HTR_V + 21.6 // MONITORED_LINE_24V_TRIM_HTR_V +}; + +// ********** private data ********** + +static VOLTAGES_STATE_T voltagesState; ///< Current state of voltages monitor state machine. +static U32 voltagesDataPublicationTimerCounter = 14; ///< Used to schedule voltages monitor data publication to CAN bus. + +/// Interval (in ms) at which to publish voltages monitor data to CAN bus. +static OVERRIDE_U32_T voltagesDataPublishInterval = { VOLTAGES_DATA_PUB_INTERVAL, VOLTAGES_DATA_PUB_INTERVAL, 0, 0 }; +static OVERRIDE_F32_T voltages[ NUM_OF_MONITORED_LINES ]; ///< Monitored voltages and currents. + +static U32 voltageAlarmPerisistenceCtr[ NUM_OF_MONITORED_LINES ]; ///< Alarm persistence counters for voltage check failures. + +// ********** private function prototypes ********** + +static VOLTAGES_STATE_T handleVoltagesInitState( void ); +static VOLTAGES_STATE_T handleVoltagesMonitorState( void ); +static void checkVoltageRanges( void ); +static void publishVoltagesData( void ); +static U32 getPublishVoltagesDataInterval( void ); + +/*********************************************************************//** + * @brief + * The initVoltagesMonitor function initializes the Voltages module. + * @details Inputs: none + * @details Outputs: Voltages module initialized. + * @return none + *************************************************************************/ +void initVoltagesMonitor( void ) +{ + U32 i; + + voltagesState = VOLTAGES_INIT_STATE; + + for ( i = 0; i < (U32)NUM_OF_MONITORED_LINES; i++ ) + { + voltages[i].data = 0.0; + voltages[i].ovData = 0.0; + voltages[i].ovInitData = 0.0; + voltages[i].override = OVERRIDE_RESET; + + voltageAlarmPerisistenceCtr[i] = 0; + } +} + +/*********************************************************************//** + * @brief + * The execVoltagesMonitor function executes the voltages monitor. + * @details Inputs: voltagesState + * @details Outputs: voltagesState + * @return none + *************************************************************************/ +void execVoltagesMonitor( void ) +{ + // State machine + switch ( voltagesState ) + { + case VOLTAGES_INIT_STATE: + voltagesState = handleVoltagesInitState(); + break; + + case VOLTAGES_MONITOR_STATE: + voltagesState = handleVoltagesMonitorState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, voltagesState ) // TODO - add enum for this s/w fault + break; + } + + // Publish voltages data on interval + publishVoltagesData(); +} + +/*********************************************************************//** + * @brief + * The handleVoltagesInitState function handles the initialize state + * of the voltages monitor state machine. + * @details Inputs: TBD + * @details Outputs: TBD + * @return next state + *************************************************************************/ +static VOLTAGES_STATE_T handleVoltagesInitState( void ) +{ + VOLTAGES_STATE_T result = VOLTAGES_MONITOR_STATE; + + return result; +} + +/*********************************************************************//** + * @brief + * The handleVoltagesMonitorState function handles the monitor state + * of the voltages monitor state machine. + * @details Inputs: converted internal ADC readings + * @details Outputs: alarm on failed check + * @return next state + *************************************************************************/ +static VOLTAGES_STATE_T handleVoltagesMonitorState( void ) +{ + VOLTAGES_STATE_T result = VOLTAGES_MONITOR_STATE; + + // Get latest signal levels + voltages[ MONITORED_LINE_24V_MAIN ].data = getIntADCVoltageConverted( INT_ADC_MAIN_24_VOLTS ); + voltages[ MONITORED_LINE_1_8V_FPGA ].data = getIntADCVoltageConverted( INT_ADC_FPGA_1_8_VOLTS ); + voltages[ MONITORED_LINE_1V_FPGA ].data = getIntADCVoltageConverted( INT_ADC_FPGA_1_VOLT ); + voltages[ MONITORED_LINE_3_3V_SENSORS ].data = getIntADCVoltageConverted( INT_ADC_SENSORS_3_3_VOLTS ); + voltages[ MONITORED_LINE_1_8V_PROC ].data = getIntADCVoltageConverted( INT_ADC_PROCESSOR_1_8_VOLTS ); + voltages[ MONITORED_LINE_5V_SENSORS ].data = getIntADCVoltageConverted( INT_ADC_SENSORS_5_VOLTS ); + voltages[ MONITORED_LINE_5V_LOGIC ].data = getIntADCVoltageConverted( INT_ADC_LOGIC_5_VOLTS ); + voltages[ MONITORED_LINE_3_3V ].data = getIntADCVoltageConverted( INT_ADC_3_3_VOLTS ); + voltages[ MONITORED_LINE_1_2V_PROC ].data = getIntADCVoltageConverted( INT_ADC_PROCESSOR_1_2_VOLTS ); + voltages[ MONITORED_LINE_V_REF ].data = getIntADCVoltageConverted( INT_ADC_REFERENCE_VOLTAGE ); + voltages[ MONITORED_LINE_EXT_ADC_1_REF_V ].data = getIntADCVoltageConverted( INT_ADC_REF_IN1 ); + voltages[ MONITORED_LINE_EXT_ADC_2_REF_V ].data = getIntADCVoltageConverted( INT_ADC_REF_IN2 ); + voltages[ MONITORED_LINE_24V_PRIM_HTR_V ].data = getIntADCVoltageConverted( INT_ADC_PRIMARY_HEATER_24_VOLTS ); + voltages[ MONITORED_LINE_24V_TRIM_HTR_V ].data = getIntADCVoltageConverted( INT_ADC_TRIMMER_HEATER_24_VOLTS ); + + // Check voltage ranges + checkVoltageRanges(); + + return result; +} + +/*********************************************************************//** + * @brief + * The checkVoltageRanges function checks each monitored voltage or current + * against its minimum and maximum range. + * @details Inputs: voltageAlarmPerisistenceCtr, MAX_VOLTAGES[], MIN_VOLTAGES[], voltages[] + * @details Outputs: voltageAlarmPerisistenceCtr, alarm if out of range + * @return none + *************************************************************************/ +static void checkVoltageRanges( void ) +{ + U32 i; + + // Check range + for ( i = 0; i < NUM_OF_MONITORED_LINES; i++ ) + { + F32 volts = getMonitoredLineLevel( (MONITORED_VOLTAGES_T)i ); + + if ( volts > MAX_VOLTAGES[ i ] ) + { + if ( ++voltageAlarmPerisistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) + } + } + else if ( volts < MIN_VOLTAGES[ i ] ) + { + if ( ++voltageAlarmPerisistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) + } + } + else + { + voltageAlarmPerisistenceCtr[ i ] = 0; + } + } +} + +/*********************************************************************//** + * @brief + * The getPublishVoltagesDataInterval function gets the voltages monitor data + * publication interval. + * @details Inputs: voltagesDataPublishInterval + * @details Outputs: none + * @return the current voltage monitor data publication interval (in task intervals). + *************************************************************************/ +static U32 getPublishVoltagesDataInterval( void ) +{ + U32 result = voltagesDataPublishInterval.data; + + if ( OVERRIDE_KEY == voltagesDataPublishInterval.override ) + { + result = voltagesDataPublishInterval.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getMonitoredLineLevel function gets the current voltage or current + * level for a given signal. + * @details Inputs: voltages[] + * @details Outputs: none + * @param signal the signal that is being asked for + * @return the voltage/current for the given signal + *************************************************************************/ +F32 getMonitoredLineLevel( MONITORED_VOLTAGES_T signal ) +{ + F32 result = 0.0; + + if ( signal < NUM_OF_MONITORED_LINES ) + { + result = voltages[ signal ].data; + + if ( OVERRIDE_KEY == voltages[ signal ].override ) + { + result = voltages[ signal ].ovData; + } + } + else + { + // TODO - s/w fault + } + + return result; +} + +/*********************************************************************//** + * @brief + * The publishVoltagesData function publishes voltages monitor data at the + * set interval. + * @details Inputs: latest voltages and currents + * @details Outputs: voltages monitor data are published to CAN bus. + * @return none + *************************************************************************/ +static void publishVoltagesData( void ) +{ + // Publish voltages monitor data on interval + if ( ++voltagesDataPublicationTimerCounter >= getPublishVoltagesDataInterval() ) + { + VOLTAGES_DATA_PAYLOAD_T data; + + data.adc1VFPGA = getMonitoredLineLevel( MONITORED_LINE_1V_FPGA ); + data.adc1_2VProc = getMonitoredLineLevel( MONITORED_LINE_1_2V_PROC ); + data.adc1_8VProc = getMonitoredLineLevel( MONITORED_LINE_1_8V_PROC ); + data.adc1_8VFPGA = getMonitoredLineLevel( MONITORED_LINE_1_8V_FPGA ); + data.adc3VRef = getMonitoredLineLevel( MONITORED_LINE_V_REF ); + data.adc3VExtADC1 = getMonitoredLineLevel( MONITORED_LINE_EXT_ADC_1_REF_V ); + data.adc3VExtADC2 = getMonitoredLineLevel( MONITORED_LINE_EXT_ADC_2_REF_V ); + data.adc3_3V = getMonitoredLineLevel( MONITORED_LINE_3_3V ); + data.adc3_3VSensors = getMonitoredLineLevel( MONITORED_LINE_3_3V_SENSORS ); + data.adc5VLogic = getMonitoredLineLevel( MONITORED_LINE_5V_LOGIC ); + data.adc5VSensors = getMonitoredLineLevel( MONITORED_LINE_5V_SENSORS ); + data.adc24V = getMonitoredLineLevel( MONITORED_LINE_24V_MAIN ); + data.adc24VPrimaryHtr = getMonitoredLineLevel( MONITORED_LINE_24V_TRIM_HTR_V ); + data.adc24VTrimmerHtr = getMonitoredLineLevel( MONITORED_LINE_24V_PRIM_HTR_V ); + + broadcastVoltagesData( data ); + voltagesDataPublicationTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief + * The execVoltagesTest function executes the voltage monitor self-test. + * @details Inputs: none + * @details Outputs: none + * @return the result of the voltage monitor self-test. + *************************************************************************/ +SELF_TEST_STATUS_T execVoltagesTest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; + + // TODO - implement + + return result; +} + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetVoltagesDataPublishIntervalOverride function overrides the + * monitored voltages data publish interval. + * @details Inputs: none + * @details Outputs: voltagesDataPublishInterval + * @param value override monitored voltages data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetVoltagesDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + + result = TRUE; + voltagesDataPublishInterval.ovData = intvl; + voltagesDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetVoltagesDataPublishIntervalOverride function resets the override + * of the monitored voltages data publish interval. + * @details Inputs: none + * @details Outputs: voltagesDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetVoltagesDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + voltagesDataPublishInterval.override = OVERRIDE_RESET; + voltagesDataPublishInterval.ovData = voltagesDataPublishInterval.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetLineLevelOverride function overrides the given monitored voltage + * or current. + * @details Inputs: none + * @details Outputs: voltages[] + * @param signal the signal to override + * @param value override signal level with this value + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetLineLevelOverride( U32 signal, F32 value ) +{ + BOOL result = FALSE; + + if ( signal < NUM_OF_MONITORED_LINES ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + voltages[ signal ].ovData = value; + voltages[ signal ].override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetLineLevelOverride function resets the override of the + * given monitored voltage or current. + * @details Inputs: none + * @details Outputs: voltages[] + * @param signal the signal to reset override + * @return TRUE if reset successful, FALSE if not + *************************************************************************/ +BOOL testResetLineLevelOverride( U32 signal ) +{ + BOOL result = FALSE; + + if ( signal < NUM_OF_MONITORED_LINES ) + { + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + voltages[ signal ].override = OVERRIDE_RESET; + voltages[ signal ].ovData = voltages[ signal ].ovInitData; + } + } + + return result; +} + +/**@}*/ Index: firmware/App/Controllers/Voltages.h =================================================================== diff -u --- firmware/App/Controllers/Voltages.h (revision 0) +++ firmware/App/Controllers/Voltages.h (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -0,0 +1,89 @@ +/************************************************************************** +* +* Copyright (c) 2019-2020 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 Voltages.h +* +* @author (last) Sean Nash +* @date (last) 21-Apr-2021 +* +* @author (original) Sean +* @date (original) 21-Apr-2021 +* +***************************************************************************/ + +#ifndef __VOLTAGES_H__ +#define __VOLTAGES_H__ + +#include "DGCommon.h" + +/** + * @defgroup Voltages Voltages + * @brief Voltages monitor module. Monitors the various system voltages + * to ensure they are in expected range. + * + * @addtogroup Voltages + * @{ + */ + +// ********** public definitions ********** + +/// Enumeration of pressure sensors monitored by this module. +typedef enum Voltages +{ + MONITORED_LINE_24V_MAIN = 0, ///< Main voltage (24V) + MONITORED_LINE_1_8V_FPGA, ///< FPGA logic voltage (1.8V) + MONITORED_LINE_1V_FPGA, ///< FPGA reference voltage (1V) + MONITORED_LINE_3_3V_SENSORS, ///< Sensors voltage (3.3V) + MONITORED_LINE_1_8V_PROC, ///< Processor voltage (1.8V) + MONITORED_LINE_5V_SENSORS, ///< Sensors voltage (5V) + MONITORED_LINE_5V_LOGIC, ///< Logic voltage (5V) + MONITORED_LINE_3_3V, ///< Logic voltage (3.3V) + MONITORED_LINE_1_2V_PROC, ///< Processor voltage (1.2V) + MONITORED_LINE_V_REF, ///< Reference voltage (3V) + MONITORED_LINE_EXT_ADC_1_REF_V, ///< External ADC 1 reference voltage (3V) + MONITORED_LINE_EXT_ADC_2_REF_V, ///< External ADC 2 reference voltage (3V) + MONITORED_LINE_24V_PRIM_HTR_V, ///< Primary heater voltage (24V) + MONITORED_LINE_24V_TRIM_HTR_V, ///< Trimmer heater voltage (24V) + NUM_OF_MONITORED_LINES ///< Number of monitored voltages +} MONITORED_VOLTAGES_T; + +/// Payload record structure for the voltages data message. +typedef struct +{ + F32 adc1VFPGA; ///< Internal ADC channel for 1V FPGA reference + F32 adc1_2VProc; ///< Internal ADC channel for 1.2V to processor + F32 adc1_8VProc; ///< Internal ADC channel for 1.8V to processor + F32 adc1_8VFPGA; ///< Internal ADC channel for 1.8V to FPGA + F32 adc3VRef; ///< Internal ADC channel for 3V reference + F32 adc3VExtADC1; ///< Internal ADC channel for 3V reference to external ADC 1 + F32 adc3VExtADC2; ///< Internal ADC channel for 3V reference to external ADC 2 + F32 adc3_3V; ///< Internal ADC channel for 3.3V + F32 adc3_3VSensors; ///< Internal ADC channel for 3.3V to sensors + F32 adc5VLogic; ///< Internal ADC channel for 5V to logic + F32 adc5VSensors; ///< Internal ADC channel for 5V to sensors + F32 adc24V; ///< Internal ADC channel for 24V + F32 adc24VPrimaryHtr; ///< Internal ADC channel for 24V to primary heater + F32 adc24VTrimmerHtr; ///< Internal ADC channel for 24V to trimmer heater +} VOLTAGES_DATA_PAYLOAD_T; + +// ********** public function prototypes ********** + +void initVoltagesMonitor( void ); +void execVoltagesMonitor( void ); + +SELF_TEST_STATUS_T execVoltagesTest( void ); + +F32 getMonitoredLineLevel( MONITORED_VOLTAGES_T signal ); + +BOOL testSetVoltagesDataPublishIntervalOverride( U32 value ); +BOOL testResetVoltagesDataPublishIntervalOverride( void ); +BOOL testSetLineLevelOverride( U32 signal, F32 value ); +BOOL testResetLineLevelOverride( U32 signal ); + +/**@}*/ + +#endif Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r0b17c6271cdc3c55697a74ecaadb477d9c8f5687 -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 0b17c6271cdc3c55697a74ecaadb477d9c8f5687) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -37,12 +37,12 @@ INT_ADC_RO_PUMP_OUTLET_PRESSURE, // 1 INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE, // 2 INT_ADC_DRAIN_PUMP_INLET_PRESSURE, // 3 - INT_ADC_NOT_USED, // 4 + INT_ADC_MAIN_24_VOLTS, // 4 INT_ADC_FPGA_1_8_VOLTS, // 5 INT_ADC_FPGA_1_VOLT, // 6 INT_ADC_SENSORS_3_3_VOLTS, // 7 INT_ADC_PROCESSOR_1_8_VOLTS, // 8 - INT_ADC_SENSORS_6_VOLTS, // 9 + INT_ADC_POWER_SUPPLY_GATE_DRIVER, // 9 INT_ADC_SENSORS_5_VOLTS, // 10 INT_ADC_LOGIC_5_VOLTS, // 11 INT_ADC_3_3_VOLTS, // 12 @@ -59,6 +59,35 @@ INT_ADC_POWER_SUPPLY_2_THERMISTOR, // 23 }; +const F32 ADC_CHANNEL_READ_TO_UNITS[ NUM_OF_INT_ADC_CHANNELS ] = +{ // TODO - get conversion for these channels + 0.0, // - INT_ADC_NOT_USED + 0.06434, // PSIA- INT_ADC_RO_PUMP_INLET_PRESSURE + 0.06434, // PSIA- INT_ADC_RO_PUMP_OUTLET_PRESSURE + 0.06434, // PSIA- INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE + 0.06434, // PSIA- INT_ADC_DRAIN_PUMP_INLET_PRESSURE + 1.0, // ? - INT_ADC_CONCENTRATE_PUMP_1 + 1.0, // ? - INT_ADC_CONCENTRATE_PUMP_2 + 1.0, // V - INT_ADC_PRIMARY_HEATER_24_VOLTS + 1.0, // V - INT_ADC_TRIMMER_HEATER_24_VOLTS + 1.0, // C - INT_ADC_BOARD_THERMISTOR + 1.0, // V - INT_ADC_FPGA_1_8_VOLTS + 1.0, // V - INT_ADC_FPGA_1_VOLT + 1.0, // V - INT_ADC_PROCESSOR_1_8_VOLTS + 1.0, // V - INT_ADC_PROCESSOR_1_2_VOLTS + 1.0, // V - INT_ADC_SENSORS_3_3_VOLTS + 1.0, // V - INT_ADC_SENSORS_5_VOLTS + 1.0, // V - INT_ADC_MAIN_24_VOLTS + 1.0, // V - INT_ADC_LOGIC_5_VOLTS + 1.0, // V - INT_ADC_3_3_VOLTS + 1.0, // V - INT_ADC_REFERENCE_VOLTAGE + 1.0, // V - INT_ADC_REF_IN1 + 1.0, // V - INT_ADC_REF_IN2 + 1.0, // C - INT_ADC_POWER_SUPPLY_1_THERMISTOR + 1.0, // C - INT_ADC_POWER_SUPPLY_2_THERMISTOR + 1.0 // V - INT_ADC_POWER_SUPPLY_GATE_DRIVER +}; + // ********** private data ********** static adcData_t adcRawReadings[ NUM_OF_INT_ADC_CHANNELS ]; ///< Buffer holds latest adc channel readings. @@ -178,4 +207,29 @@ return result; } +/*********************************************************************//** + * @brief + * The getIntADCVoltageConverted function gets the latest average voltage + * (converted per transfer function) for a given channel. + * @details Inputs: adcReadingsAvgs[], ADC_CHANNEL_READ_TO_UNITS[] + * @details Outputs: none + * @param channel adc channel to retrieve a converted voltage for + * @return average converted voltage for the given channel + *************************************************************************/ +F32 getIntADCVoltageConverted( INT_ADC_CHANNEL_T channel ) +{ + F32 result = 0.0; + + if ( channel < NUM_OF_INT_ADC_CHANNELS ) + { + result = (F32)adcReadingsAvgs[ channel ] * ADC_CHANNEL_READ_TO_UNITS[ channel ]; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, channel ) + } + + return result; +} + /**@}*/ Index: firmware/App/Drivers/InternalADC.h =================================================================== diff -u -r27d91d88b73aa4194cef1d3b08decc12ccdecc33 -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 27d91d88b73aa4194cef1d3b08decc12ccdecc33) +++ firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -53,14 +53,15 @@ INT_ADC_PROCESSOR_1_2_VOLTS, ///< DG internal ADC DG processor 1.2 volt supply channel INT_ADC_SENSORS_3_3_VOLTS, ///< DG internal ADC DG sensors 3.3 volt supply channel INT_ADC_SENSORS_5_VOLTS, ///< DG internal ADC DG sensors 5 volt supply channel - INT_ADC_SENSORS_6_VOLTS, ///< DG internal ADC DG sensors 6 volt supply channel + INT_ADC_MAIN_24_VOLTS, ///< DG internal ADC DG sensors 6 volt supply channel INT_ADC_LOGIC_5_VOLTS, ///< DG internal ADC DG logic 5 volt supply channel INT_ADC_3_3_VOLTS, ///< DG internal ADC DG 3.3 volt supply channel INT_ADC_REFERENCE_VOLTAGE, ///< DG internal ADC reference voltage channel - INT_ADC_REF_IN1, ///< DG internal ADC ??? channel TODO - INT_ADC_REF_IN2, ///< DG internal ADC ??? channel TODO + INT_ADC_REF_IN1, ///< DG internal ADC external ADC1 reference voltage channel + INT_ADC_REF_IN2, ///< DG internal ADC external ADC2 reference voltage channel INT_ADC_POWER_SUPPLY_1_THERMISTOR, ///< DG internal ADC DG power supply 1 thermistor - INT_ADC_POWER_SUPPLY_2_THERMISTOR, ///< DG internal ADC DG power supply 2 thermistor + INT_ADC_POWER_SUPPLY_2_THERMISTOR, ///< DG internal ADC DG power supply 2 thermistor + INT_ADC_POWER_SUPPLY_GATE_DRIVER, ///< DG internal ADC DG power supply gate driver NUM_OF_INT_ADC_CHANNELS ///< Number of DG internal ADC channels } INT_ADC_CHANNEL_T; @@ -69,6 +70,7 @@ void initInternalADC( void ); void execInternalADC( void ); U16 getIntADCReading( INT_ADC_CHANNEL_T channel ); +F32 getIntADCVoltageConverted( INT_ADC_CHANNEL_T channel ); /**@}*/ Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -rebbb1f85550a1f9b8f946655f7b2b63f76fbf67d -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ebbb1f85550a1f9b8f946655f7b2b63f76fbf67d) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -1151,6 +1151,14 @@ handleTestDGAccelBroadcastIntervalOverrideRequest( message ); break; + case MSG_ID_DG_MONITORED_VOLTAGES_SEND_INTERVAL_OVERRIDE: + handleTestMonitoredVoltagesSendIntervalOverrideRequest( message ); + break; + + case MSG_ID_DG_MONITORED_VOLTAGES_OVERRIDE: + handleTestMonitoredVoltageOverrideRequest( message ); + break; + case MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE: handleSetDrainPumpDeltaPressureOverrideRequest( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r28b5f2e7f757647145a82a39aca0a5f3652c68a1 -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 28b5f2e7f757647145a82a39aca0a5f3652c68a1) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -1020,6 +1020,34 @@ /*********************************************************************//** * @brief + * The broadcastVoltagesData function constructs a monitored voltages data msg to + * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: monitored voltages data msg constructed and queued. + * @param data Latest monitored voltage values. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastVoltagesData( VOLTAGES_DATA_PAYLOAD_T data ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_VOLTAGES_DATA; + msg.hdr.payloadLen = sizeof( VOLTAGES_DATA_PAYLOAD_T ); + + memcpy( payloadPtr, &data, sizeof( VOLTAGES_DATA_PAYLOAD_T ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/*********************************************************************//** + * @brief * The sendDGSystemRecord function sends out the DG system record. * @details Inputs: none * @details Outputs: DG system record msg constructed and queued @@ -2167,6 +2195,70 @@ /*********************************************************************//** * @brief + * The handleTestMonitoredVoltagesSendIntervalOverrideRequest function handles a + * request to override the monitored DG voltages data publication interval. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestMonitoredVoltagesSendIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetVoltagesDataPublishIntervalOverride( payload.state.u32 ); + } + else + { + result = testResetVoltagesDataPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief + * The handleTestMonitoredVoltageOverrideRequest function handles a + * request to override the monitored DG voltage override. + * @details Inputs: none + * @details Outputs: message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +void handleTestMonitoredVoltageOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof(TEST_OVERRIDE_ARRAY_PAYLOAD_T) ); + if ( FALSE == payload.reset ) + { + result = testSetLineLevelOverride( payload.index, payload.state.f32 ); + } + else + { + result = testResetLineLevelOverride( payload.index ); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** + * @brief * The handleTestSetConductivityOverrideRequest function handles a * request to override a conductivity sensor's value * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r28b5f2e7f757647145a82a39aca0a5f3652c68a1 -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 28b5f2e7f757647145a82a39aca0a5f3652c68a1) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -31,6 +31,7 @@ #include "TemperatureSensors.h" #include "Thermistors.h" #include "UVReactors.h" +#include "Voltages.h" /** * @defgroup SystemCommMessages SystemCommMessages @@ -110,6 +111,9 @@ // MSG_ID_DG_FLUID_LEAK_STATE BOOL broadcastFluidLeakState( FLUID_LEAK_STATES_T state); +// MSG_ID_DG_VOLTAGES_DATA +BOOL broadcastVoltagesData( VOLTAGES_DATA_PAYLOAD_T data ); + // MSG_ID_DG_COMMAND_RESPONSE void sendCommandResponseMsg( DG_CMD_RESPONSE_T *cmdResponsePtr ); @@ -250,6 +254,12 @@ // MSG_ID_DG_ACCEL_SEND_INTERVAL_OVERRIDE: void handleTestDGAccelBroadcastIntervalOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DG_MONITORED_VOLTAGES_SEND_INTERVAL_OVERRIDE +void handleTestMonitoredVoltagesSendIntervalOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_DG_MONITORED_VOLTAGES_OVERRIDE +void handleTestMonitoredVoltageOverrideRequest( MESSAGE_T *message ); + // MSG_ID_DG_START_STOP_INLET_UV_REACTOR void handleStartStopUVReactors( MESSAGE_T *message ); Index: firmware/DG.dil =================================================================== diff -u -r9301b9ec99beedbb49076dc03526622d313bd8cf -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/DG.dil (.../DG.dil) (revision 9301b9ec99beedbb49076dc03526622d313bd8cf) +++ firmware/DG.dil (.../DG.dil) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -1,4 +1,4 @@ -# RM46L852PGE 03/11/21 13:52:53 +# RM46L852PGE 04/21/21 17:25:51 # ARCH=RM46L852PGE # @@ -5553,10 +5553,10 @@ DRIVER.ADC.VAR.ADC2_GROUP2_RAM_PARITY_ENA.VALUE=0 DRIVER.ADC.VAR.ADC1_GROUP1_PIN3_ENABLE.VALUE=0x00000008 DRIVER.ADC.VAR.ADC1_GROUP0_CHANNEL_TOTAL_TIME.VALUE=0.000000 -DRIVER.ADC.VAR.ADC1_GROUP1_FIFO_SIZE.VALUE=21 +DRIVER.ADC.VAR.ADC1_GROUP1_FIFO_SIZE.VALUE=24 DRIVER.ADC.VAR.ADC1_GROUP2_DISCHARGE_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_SAMPLE_PRESCALER.VALUE=0 -DRIVER.ADC.VAR.ADC1_GROUP1_LENGTH.VALUE=22 +DRIVER.ADC.VAR.ADC1_GROUP1_LENGTH.VALUE=24 DRIVER.ADC.VAR.ADC2_GROUP1_ID_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_CONVERSION_TIME.VALUE=3.271 DRIVER.ADC.VAR.ADC2_PORT_BIT0_DIR.VALUE=0 @@ -5642,7 +5642,7 @@ DRIVER.ADC.VAR.ADC2_RAMBASE.VALUE=0xFF3A0000 DRIVER.ADC.VAR.ADC2_GROUP0_BND.VALUE=8 DRIVER.ADC.VAR.ADC1_PORT_BIT0_DOUT.VALUE=0 -DRIVER.ADC.VAR.ADC1_GROUP1_SCAN_TIME.VALUE=967.726 +DRIVER.ADC.VAR.ADC1_GROUP1_SCAN_TIME.VALUE=1112.885 DRIVER.ADC.VAR.ADC1_GROUP0_RESOLUTION.VALUE=12_BIT DRIVER.ADC.VAR.ADC2_GROUP2_FIFO_SIZE.VALUE=16 DRIVER.ADC.VAR.ADC2_GROUP1_PIN7_ENABLE.VALUE=0x00000000 @@ -5665,7 +5665,7 @@ DRIVER.ADC.VAR.ADC1_GROUP2_CONTINUOUS_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN10_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP1_PINS.VALUE=0 -DRIVER.ADC.VAR.ADC1_GROUP1_PIN22_ENABLE.VALUE=0x00000000 +DRIVER.ADC.VAR.ADC1_GROUP1_PIN22_ENABLE.VALUE=0x00400000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN14_ENABLE.VALUE=0x00004000 DRIVER.ADC.VAR.ADC2_GROUP0_PIN4_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_PIN18_ENABLE.VALUE=0x00000000 @@ -5674,15 +5674,15 @@ DRIVER.ADC.VAR.ADC1_GROUP2_PIN11_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP2_PIN1_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP2_FIFO_SIZE.VALUE=32 -DRIVER.ADC.VAR.ADC1_GROUP1_PIN4_ENABLE.VALUE=0x00000000 +DRIVER.ADC.VAR.ADC1_GROUP1_PIN4_ENABLE.VALUE=0x00000010 DRIVER.ADC.VAR.ADC1_RAMBASE.VALUE=0xFF3E0000 DRIVER.ADC.VAR.ADC1_BASE.VALUE=0xFFF7C000 DRIVER.ADC.VAR.ADC1_PORT_BIT0_DIR.VALUE=0 DRIVER.ADC.VAR.ADC2_RAM_PARITY_ENA.VALUE=0x00000005 DRIVER.ADC.VAR.ADC2_GROUP2_HW_TRIGGER_SOURCE.VALUE=EVENT DRIVER.ADC.VAR.ADC2_GROUP2_ID_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP1_ACTUAL_SAMPLE_TIME.VALUE=387.08 -DRIVER.ADC.VAR.ADC1_GROUP2_LENGTH.VALUE=42 +DRIVER.ADC.VAR.ADC1_GROUP2_LENGTH.VALUE=40 DRIVER.ADC.VAR.ADC1_GROUP0_BND.VALUE=0 DRIVER.ADC.VAR.ADC2_GROUP2_CHANNEL_TOTAL_TIME.VALUE=0.000000 DRIVER.ADC.VAR.ADC2_GROUP2_CONTINUOUS_ENABLE.VALUE=0x00000000 @@ -5701,7 +5701,7 @@ DRIVER.ADC.VAR.ADC1_GROUP2_PIN5_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN23_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN15_ENABLE.VALUE=0x00000000 -DRIVER.ADC.VAR.ADC1_GROUP1_BND.VALUE=11 +DRIVER.ADC.VAR.ADC1_GROUP1_BND.VALUE=12 DRIVER.ADC.VAR.ADC2_GROUP2_PIN13_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN19_ENABLE.VALUE=0x00080000 DRIVER.ADC.VAR.ADC2_PORT_BIT0_DOUT.VALUE=0 @@ -5739,7 +5739,7 @@ DRIVER.ADC.VAR.ADC1_GROUP0_PIN6_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP2_SCAN_TIME.VALUE=0.000 DRIVER.ADC.VAR.ADC2_GROUP1_HW_TRIGGER_SOURCE.VALUE=EVENT -DRIVER.ADC.VAR.ADC1_GROUP1_CHANNEL_TOTAL_TIME.VALUE=80.226346 +DRIVER.ADC.VAR.ADC1_GROUP1_CHANNEL_TOTAL_TIME.VALUE=91.694165 DRIVER.ADC.VAR.ADC1_GROUP0_EXTENDED_SAMPLE_TIME.VALUE=503.22 DRIVER.ADC.VAR.ADC1_GROUP0_HW_TRIGGER_SOURCE_ALT.VALUE=EVENT DRIVER.ADC.VAR.ADC2_GROUP1_PIN14_ENABLE.VALUE=0x00000000 @@ -5772,7 +5772,7 @@ DRIVER.ADC.VAR.ADC1_GROUP0_ID_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP2_DISCHARGE_TIME.VALUE=0.00 DRIVER.ADC.VAR.ADC1_GROUP2_SCAN_TIME.VALUE=0.000 -DRIVER.ADC.VAR.ADC1_GROUP1_PINS.VALUE=21 +DRIVER.ADC.VAR.ADC1_GROUP1_PINS.VALUE=24 DRIVER.ADC.VAR.ADC1_GROUP1_TRIGGER_EDGE_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_ALT_TRIG_COMP.VALUE=1 DRIVER.ADC.VAR.ADC1_GROUP0_CONTINUOUS_ENABLE.VALUE=0x00000000 @@ -5791,7 +5791,7 @@ DRIVER.ADC.VAR.ADC1_GROUP2_PIN1_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC1_GROUP0_PIN11_ENABLE.VALUE=0x00000000 DRIVER.ADC.VAR.ADC2_GROUP0_SCAN_TIME.VALUE=0.000 -DRIVER.ADC.VAR.ADC1_GROUP1_PIN23_ENABLE.VALUE=0x00000000 +DRIVER.ADC.VAR.ADC1_GROUP1_PIN23_ENABLE.VALUE=0x00800000 DRIVER.ADC.VAR.ADC1_GROUP1_PIN15_ENABLE.VALUE=0x00008000 DRIVER.ADC.VAR.ADC2_GROUP0_HW_TRIGGER_SOURCE.VALUE=EVENT DRIVER.ADC.VAR.ADC2_GROUP0_PIN5_ENABLE.VALUE=0x00000000 Index: firmware/include/adc.h =================================================================== diff -u -ra49bd0780d97bb4ce04a9d7b128a6e3c2df044e1 -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/include/adc.h (.../adc.h) (revision a49bd0780d97bb4ce04a9d7b128a6e3c2df044e1) +++ firmware/include/adc.h (.../adc.h) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -240,7 +240,7 @@ #define ADC1_G1SRC_CONFIGVALUE ((uint32)0x00000000U | (uint32)ADC1_EVENT) #define ADC1_G2SRC_CONFIGVALUE ((uint32)0x00000000U | (uint32)ADC1_EVENT) -#define ADC1_BNDCR_CONFIGVALUE ((uint32)((uint32)0U << 16U)|(0U + 11U)) +#define ADC1_BNDCR_CONFIGVALUE ((uint32)((uint32)0U << 16U)|(0U + 12U)) #define ADC1_BNDEND_CONFIGVALUE (2U) #define ADC1_G0SAMP_CONFIGVALUE (0U) Index: firmware/source/adc.c =================================================================== diff -u -r0953a2a6940f9f096fa98cc1e8a5578deab4d8ef -r35de566c96433689821b7a21f731df26b40d67ae --- firmware/source/adc.c (.../adc.c) (revision 0953a2a6940f9f096fa98cc1e8a5578deab4d8ef) +++ firmware/source/adc.c (.../adc.c) (revision 35de566c96433689821b7a21f731df26b40d67ae) @@ -86,7 +86,7 @@ adcREG1->CLOCKCR = 25U; /** - Setup memory boundaries */ - adcREG1->BNDCR = (uint32)((uint32)0U << 16U) | (0U + 11U); + adcREG1->BNDCR = (uint32)((uint32)0U << 16U) | (0U + 12U); adcREG1->BNDEND = (adcREG1->BNDEND & 0xFFFF0000U) | (2U); /** - Setup event group conversion mode @@ -236,7 +236,7 @@ 0x00000002U | 0x00000004U | 0x00000008U | - 0x00000000U | + 0x00000010U | 0x00000020U | 0x00000040U | 0x00000080U | @@ -254,8 +254,9 @@ 0x00080000U | 0x00100000U | 0x00200000U | + 0x00400000U | + 0x00800000U, 0x00000000U | - 0x00000000U, 0x00000000U | 0x00000000U | 0x00000000U | @@ -278,7 +279,6 @@ 0x00000000U | 0x00000000U | 0x00000000U | - 0x00000000U | 0x00000000U}, {0x00000000U | 0x00000000U | @@ -334,7 +334,7 @@ static const uint32 s_adcFiFoSize[2U][3U] = { {0U, - 21U, + 24U, 32U}, {16U, 16U,