Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r837e86dd59014bd075bc39839c8b4b6324288880 -rc07917caced76b53a0ed8f35167fac6f9d8310a4 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 837e86dd59014bd075bc39839c8b4b6324288880) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision c07917caced76b53a0ed8f35167fac6f9d8310a4) @@ -1,208 +1,210 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2025 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 InternalADC.c * -* @author (last) Vinayakam Mani -* @date (last) 13-Aug-2024 +* @author (last) Sean Nash +* @date (last) 11-Sep-2025 * * @author (original) Vinayakam Mani -* @date (original) 13-Aug-2024 +* @date (original) 15-Aug-2024 * ***************************************************************************/ - -#include "adc.h" - -#include "InternalADC.h" - -/** - * @addtogroup InternalADC - * @{ - */ - -// ********** private definitions ********** - -#define MAX_ADC_CHANNELS 24 ///< DD internal ADC supports up to 24 channels. -#define SIZE_OF_ROLLING_AVG 16 ///< Number of DD internal ADC samples in rolling average calculations for each channel. -#define ROLLING_AVG_SHIFT_DIVIDER 4 ///< Rolling average shift divider for DD internal ADC readings. - -/// ADC channel number to ADC channel ID (enumeration) look-up table. -const INT_ADC_CHANNEL_T adcChannelNum2ChannelId[ MAX_ADC_CHANNELS ] = -{ - INT_ADC_NOT_USED, // 0 - INT_ADC_NOT_USED, // 1 - TD specific - INT_ADC_3_3V_SENSOR_ADC_REF, // 2 - INT_ADC_24V_ACTUATORS_REG, // 3 - INT_ADC_1_2V_PROCESSOR, // 4 - INT_ADC_5V_SENSORS, // 5 - INT_ADC_NOT_USED, // 6 - INT_ADC_NOT_USED, // 7 - INT_ADC_NOT_USED, // 8 - TD specific - INT_ADC_NOT_USED, // 9 - INT_ADC_BOARD_THERMISTOR, // 10 - INT_ADC_1_25_FPGA_ADC_REF, // 11 - INT_ADC_3_3V, // 12 - INT_ADC_5V_LOGIC, // 13 - INT_ADC_NOT_USED, // 14 - TD specific - INT_ADC_NOT_USED, // 15 - INT_ADC_NOT_USED, // 16 - INT_ADC_NOT_USED, // 17 - INT_ADC_BACKUP_V, // 18 - INT_ADC_NOT_USED, // 19 - INT_ADC_NOT_USED, // 20 - INT_ADC_NOT_USED, // 21 - INT_ADC_24V_ACTUATORS, // 22 - INT_ADC_NOT_USED // 23 -}; -/// ADC channel read to units look-up table. +#include "adc.h" + +#include "InternalADC.h" + +/** + * @addtogroup InternalADC + * @{ + */ + +// ********** private definitions ********** + +#define MAX_ADC_CHANNELS 24 ///< DD internal ADC supports up to 24 channels. +#define SIZE_OF_ROLLING_AVG 16 ///< Number of DD internal ADC samples in rolling average calculations for each channel. +#define ROLLING_AVG_SHIFT_DIVIDER 4 ///< Rolling average shift divider for DD internal ADC readings. + +/// Mapping from enumerated used ADC channel to processor channel ID. +const INT_ADC_CHANNEL_T ADC_CHANNEL_NUM_TO_CHANNEL_ID[ MAX_ADC_CHANNELS ] = +{ + INT_ADC_24V_ACTUATORS_1, // 0 + INT_ADC_NOT_USED, // 1 + INT_ADC_1_8V_FPGA, // 2 + INT_ADC_1V_FPGA, // 3 + INT_ADC_1_2V_PROCESSOR, // 4 + INT_ADC_NOT_USED, // 5 + INT_ADC_NOT_USED, // 6 + INT_ADC_24V_ACTUATORS_2, // 7 + INT_ADC_PRIMARY_ALARM_CURRENT_HG, // 8 + INT_ADC_NOT_USED, // 9 + INT_ADC_BOARD_THERMISTOR, // 10 + INT_ADC_1_8V_XADC, // 11 + INT_ADC_3_3V, // 12 + INT_ADC_5V_LOGIC, // 13 + INT_ADC_PRIMARY_ALARM_CURRENT_LG, // 14 + INT_ADC_NOT_USED, // 15 + INT_ADC_NOT_USED, // 16 + INT_ADC_NOT_USED, // 17 + INT_ADC_BACKUP_V, // 18 + INT_ADC_ADC_REF, // 19 + INT_ADC_NOT_USED, // 20 + INT_ADC_NOT_USED, // 21 + INT_ADC_NOT_USED, // 22 + INT_ADC_NOT_USED // 23 +}; + const F32 ADC_CHANNEL_READ_TO_UNITS[ NUM_OF_INT_ADC_CHANNELS ] = { - 0.0, // - INT_ADC_NOT_USED - 0.001465, // V - INT_ADC_3_3V_SENSOR_ADC_REF - 0.009420, // V - INT_ADC_24V_ACTUATORS_REG - 0.000733, // V - INT_ADC_1_2V_PROCESSOR - 0.001465, // V - INT_ADC_5V_SENSORS - 0.001221, // V - INT_ADC_BOARD_THERMISTOR - 0.000733, // V - INT_ADC_1_25_FPGA_ADC_REF - 0.001465, // V - INT_ADC_3_3V - 0.001465, // V - INT_ADC_5V_LOGIC - 0.007106, // V - INT_ADC_24V_ACTUATORS - 0.007106, // V - INT_ADC_BACKUP_V - 0.000000, // V - INT_ADC_DUMMY + 0.000000, // - Not used + 0.014650, // mA - Internal ADC channel for primary alarm audio current high gain + 0.073240, // mA - Internal ADC channel for primary alarm audio current low gain + 0.001465, // V - Internal ADC channel for 5V to logic + 0.001465, // V - Internal ADC channel for 3.3V + 0.000733, // V - Internal ADC channel for 1.2V to processor + 0.000733, // V - Internal ADC channel for 1.8V external ADC + 0.000733, // V - Internal ADC channel for 1.0V FPGA + 0.000733, // V - Internal ADC channel for 1.8V FPGA + 0.001221, // V - Internal ADC channel for PCB temperature + 0.001465, // V - Internal ADC channel for ADC reference voltage + 0.009420, // V - Internal ADC channel for VBackup + 0.007106, // V - Internal ADC channel for 24V to actuators (1) + 0.007106, // V - Internal ADC channel for 24V to actuators (2) + 0.000000, // - Not used }; -// ********** private data ********** - -static adcData_t adcRawReadings[ NUM_OF_INT_ADC_CHANNELS ]; ///< Buffer holds latest adc channel readings. -static U32 adcRawReadingsCount = 0; ///< Readings count for raw readings buffer. - -static U16 adcReadings[ NUM_OF_INT_ADC_CHANNELS ][ SIZE_OF_ROLLING_AVG ]; ///< Buffer holds samples for each channel for a rolling average. -static U32 adcReadingsIdx[ NUM_OF_INT_ADC_CHANNELS ]; ///< Index for next reading in each rolling average buffer. -static U32 adcReadingsTotals[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling sum for each ADC channel - used to calc average. -static U32 adcReadingsAvgs[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling average for each ADC channel. - -/*********************************************************************//** - * @brief - * The initInternalADC function initializes the InternalADC unit. - * @details \b Inputs: none - * @details \b Outputs: InternalADC unit is initialized. - * @return none - *************************************************************************/ -void initInternalADC( void ) -{ - U32 c,r; - - // zero all adc values and stats - adcRawReadingsCount = 0; - for ( c = 0; c < NUM_OF_INT_ADC_CHANNELS; c++ ) - { - adcRawReadings[ c ].id = 0; - adcRawReadings[ c ].value = 0; - adcReadingsIdx[ c ] = 0; - adcReadingsTotals[ c ] = 0; - adcReadingsAvgs[ c ] = 0; - for ( r = 0; r < SIZE_OF_ROLLING_AVG; r++ ) - { - adcReadings[ c ][ r ] = 0; - } - } - - // enable interrupt when all channels converted - adcEnableNotification( adcREG1, adcGROUP1 ); -} - -/*********************************************************************//** - * @brief - * The adcNotification function handles an ADC conversion complete interrupt. - * All channel readings in the FIFO are retrieved. - * @details \b Inputs: ADC FIFO - * @details \b Outputs: adcRawReadingsCount, adcRawReadings[] - * @param adc pointer to the ADC1 controller - * @param group ADC channel group ID - * @return none - *************************************************************************/ -void adcNotification( adcBASE_t *adc, uint32 group ) -{ - if ( adcGROUP1 == group ) - { - adcRawReadingsCount = adcGetData( adcREG1, adcGROUP1, adcRawReadings ); - } -} - -/*********************************************************************//** - * @brief - * The execInternalADC function processes the last set of raw ADC channel - * readings and kicks off the next conversion of ADC channels. - * @details \b Inputs: adcRawReadingsCount, adcRawReadings[] +// ********** private data ********** + +static adcData_t adcRawReadings[ NUM_OF_INT_ADC_CHANNELS ]; ///< Buffer holds latest adc channel readings. +static U32 adcRawReadingsCount = 0; ///< Readings count for raw readings buffer. + +static U16 adcReadings[ NUM_OF_INT_ADC_CHANNELS ][ SIZE_OF_ROLLING_AVG ]; ///< Buffer holds samples for each channel for a rolling average. +static U32 adcReadingsIdx[ NUM_OF_INT_ADC_CHANNELS ]; ///< Index for next reading in each rolling average buffer. +static U32 adcReadingsTotals[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling sum for each ADC channel - used to calc average. +static U32 adcReadingsAvgs[ NUM_OF_INT_ADC_CHANNELS ]; ///< Rolling average for each ADC channel. + +/*********************************************************************//** + * @brief + * The initInternalADC function initializes the InternalADC unit. + * @details \b Inputs: none + * @details \b Outputs: InternalADC unit is initialized. + * @return none + *************************************************************************/ +void initInternalADC( void ) +{ + U32 c,r; + + // zero all adc values and stats + adcRawReadingsCount = 0; + for ( c = 0; c < NUM_OF_INT_ADC_CHANNELS; c++ ) + { + adcRawReadings[ c ].id = 0; + adcRawReadings[ c ].value = 0; + adcReadingsIdx[ c ] = 0; + adcReadingsTotals[ c ] = 0; + adcReadingsAvgs[ c ] = 0; + for ( r = 0; r < SIZE_OF_ROLLING_AVG; r++ ) + { + adcReadings[ c ][ r ] = 0; + } + } + + // enable interrupt when all channels converted + adcEnableNotification( adcREG1, adcGROUP1 ); +} + +/*********************************************************************//** + * @brief + * The adcNotification function handles an ADC conversion complete interrupt. + * All channel readings in the FIFO are retrieved. + * @details \b Inputs: ADC FIFO + * @details \b Outputs: adcRawReadingsCount, adcRawReadings[] + * @param adc pointer to the ADC1 controller + * @param group ADC channel group ID + * @return none + *************************************************************************/ +void adcNotification( adcBASE_t *adc, uint32 group ) +{ + if ( adcGROUP1 == group ) + { + adcRawReadingsCount = adcGetData( adcREG1, adcGROUP1, adcRawReadings ); + } +} + +/*********************************************************************//** + * @brief + * The execInternalADC function processes the last set of raw ADC channel + * readings and kicks off the next conversion of ADC channels. + * @details \b Inputs: adcRawReadingsCount, adcRawReadings[] * @details \b Outputs: adcReadings[][], adcReadingsIdx[], adcReadingsTotals[], adcReadingsAvgs[] * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when invalid ADC channel number - * processed. - * @return none - *************************************************************************/ -void execInternalADC( void ) -{ - U32 i; - - if ( adcRawReadingsCount < NUM_OF_INT_ADC_CHANNELS ) - { - // process readings from last conversion - for ( i = 0; i < adcRawReadingsCount; i++ ) + * processed. + * @return none + *************************************************************************/ +void execInternalADC( void ) +{ + U32 i; + + if ( adcRawReadingsCount < NUM_OF_INT_ADC_CHANNELS ) + { + // process readings from last conversion + for ( i = 0; i < adcRawReadingsCount; i++ ) { if ( adcRawReadings[ i ].id < NUM_OF_INT_ADC_CHANNELS ) - { - U32 ch = adcChannelNum2ChannelId[ adcRawReadings[ i ].id ]; - - adcReadingsTotals[ ch ] -= adcReadings[ ch ][ adcReadingsIdx[ ch ] ]; - adcReadings[ ch ][ adcReadingsIdx[ ch ] ] = adcRawReadings[i].value; - adcReadingsTotals[ ch ] += adcRawReadings[ i ].value; - adcReadingsAvgs[ ch ] = adcReadingsTotals[ ch ] >> ROLLING_AVG_SHIFT_DIVIDER; + { + U32 ch = ADC_CHANNEL_NUM_TO_CHANNEL_ID[ adcRawReadings[ i ].id ]; + + adcReadingsTotals[ ch ] -= adcReadings[ ch ][ adcReadingsIdx[ ch ] ]; + adcReadings[ ch ][ adcReadingsIdx[ ch ] ] = adcRawReadings[i].value; + adcReadingsTotals[ ch ] += adcRawReadings[ i ].value; + adcReadingsAvgs[ ch ] = adcReadingsTotals[ ch ] >> ROLLING_AVG_SHIFT_DIVIDER; adcReadingsIdx[ ch ] = INC_WRAP( adcReadingsIdx[ ch ], 0, SIZE_OF_ROLLING_AVG - 1 ); } else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_INT_ADC_CHANNEL_NUMBER, adcRawReadings[ i ].id ) - } - } - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, adcRawReadingsCount ) - } - - // start an adc channel group conversion - adcStartConversion( adcREG1, adcGROUP1 ); -} - -/*********************************************************************//** - * @brief - * The getIntADCReading function gets the latest average reading for a given channel. - * @details \b Inputs: adcReadingsAvgs[] + } + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, adcRawReadingsCount ) + } + + // start an adc channel group conversion + adcStartConversion( adcREG1, adcGROUP1 ); +} + +/*********************************************************************//** + * @brief + * The getIntADCReading function gets the latest average reading for a given channel. + * @details \b Inputs: adcReadingsAvgs[] * @details \b Outputs: none - * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when invalid ADC channel requested. - * @param channel adc channel to retrieve a reading for - * @return average reading for the given channel - *************************************************************************/ -U16 getIntADCReading( INT_ADC_CHANNEL_T channel ) -{ - U16 result = 0; - - if ( channel < NUM_OF_INT_ADC_CHANNELS ) - { - result = adcReadingsAvgs[ channel ]; - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, channel ) - } - - return result; -} - + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when invalid ADC channel requested. + * @param channel adc channel to retrieve a reading for + * @return average reading for the given channel + *************************************************************************/ +U16 getIntADCReading( INT_ADC_CHANNEL_T channel ) +{ + U16 result = 0; + + if ( channel < NUM_OF_INT_ADC_CHANNELS ) + { + result = adcReadingsAvgs[ channel ]; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, channel ) + } + + return result; +} + /*********************************************************************//** * @brief * The getIntADCVoltageConverted function gets the latest average voltage @@ -229,4 +231,4 @@ return result; } -/**@}*/ +/**@}*/