Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r4d7d40a27130dc813d653f044cbb856b1b7d8481 -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 4d7d40a27130dc813d653f044cbb856b1b7d8481) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2024 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 +* @file InternalADC.c * -* @author (last) Quang Nguyen -* @date (last) 25-Aug-2020 +* @author (last) Dara Navaei +* @date (last) 17-Apr-2023 * -* @author (original) Sean -* @date (original) 04-Feb-2020 +* @author (original) Sean +* @date (original) 04-Feb-2020 * ***************************************************************************/ @@ -33,32 +33,61 @@ /// ADC channel number to ADC channel ID (enumeration) look-up table. const INT_ADC_CHANNEL_T adcChannelNum2ChannelId[ MAX_ADC_CHANNELS ] = { - INT_ADC_RO_PUMP_INLET_PRESSURE, // 0 - 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_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_SENSORS_5_VOLTS, // 10 - INT_ADC_LOGIC_5_VOLTS, // 11 - INT_ADC_3_3_VOLTS, // 12 - INT_ADC_CONCENTRATE_PUMP_1, // 13 - INT_ADC_CONCENTRATE_PUMP_2, // 14 - INT_ADC_PROCESSOR_1_2_VOLTS, // 15 - INT_ADC_REFERENCE_VOLTAGE, // 16 - INT_ADC_PRIMARY_HEATER_24_VOLTS, // 17 - INT_ADC_TRIMMER_HEATER_24_VOLTS, // 18 - INT_ADC_REF_IN1, // 19 - INT_ADC_REF_IN2, // 20 - INT_ADC_BOARD_THERMISTOR, // 21 - INT_ADC_NOT_USED, // 22 - INT_ADC_NOT_USED // 23 + INT_ADC_RO_PUMP_INLET_PRESSURE, // 0 + INT_ADC_RO_PUMP_OUTLET_PRESSURE, // 1 + INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE, // 2 + INT_ADC_DRAIN_PUMP_INLET_PRESSURE, // 3 + 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_POWER_SUPPLY_GATE_DRIVER, // 9 + INT_ADC_SENSORS_5_VOLTS, // 10 + INT_ADC_LOGIC_5_VOLTS, // 11 + INT_ADC_3_3_VOLTS, // 12 + INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE, // 13 + INT_ADC_AVAILABLE_CHANNEL, // 14 + INT_ADC_PROCESSOR_1_2_VOLTS, // 15 + INT_ADC_REFERENCE_VOLTAGE, // 16 + INT_ADC_TRIMMER_HEATER_24_VOLTS, // 17 + INT_ADC_SECONDARY_HEATER_24_VOLTS, // 18 + INT_ADC_REF_IN1, // 19 + INT_ADC_REF_IN2, // 20 + INT_ADC_BOARD_THERMISTOR, // 21 + INT_ADC_POWER_SUPPLY_1_THERMISTOR, // 22 + INT_ADC_MAIN_NON_ISOLATED_24_VOLTS, // 23 }; +const F32 ADC_CHANNEL_READ_TO_UNITS[ NUM_OF_INT_ADC_CHANNELS ] = +{ + 0.0, // - INT_ADC_NOT_USED + 0.06438104, // PSIA- INT_ADC_RO_PUMP_INLET_PRESSURE + 0.06438104, // PSIA- INT_ADC_RO_PUMP_OUTLET_PRESSURE + 0.06438104, // PSIA- INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE + 0.06438104, // PSIA- INT_ADC_DRAIN_PUMP_INLET_PRESSURE + 0.00073242, // V - INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE + 1.0, // ? - INT_ADC_AVAILABLE_CHANNEL + 0.00763285, // V - INT_ADC_TRIMMER_HEATER_24_VOLTS (varies inversely with PWM) + 0.00700441, // V - INT_ADC_SECONDARY_HEATER_24_VOLTS (varies inversely with PWM for secondary element) + 0.001221, // V - INT_ADC_BOARD_THERMISTOR + 0.0007326, // V - INT_ADC_FPGA_1_8_VOLTS + 0.0007326, // V - INT_ADC_FPGA_1_VOLT + 0.0007326, // V - INT_ADC_PROCESSOR_1_8_VOLTS + 0.0007326, // V - INT_ADC_PROCESSOR_1_2_VOLTS + 0.00117296, // V - INT_ADC_SENSORS_3_3_VOLTS + 0.0014652, // V - INT_ADC_SENSORS_5_VOLTS + 0.00700441, // V - INT_ADC_MAIN_24_VOLTS + 0.0014652, // V - INT_ADC_LOGIC_5_VOLTS + 0.00117296, // V - INT_ADC_3_3_VOLTS + 0.00117296, // V - INT_ADC_REFERENCE_VOLTAGE (3V) + 0.0014652, // V - INT_ADC_REF_IN1 (3V) + 0.0014652, // V - INT_ADC_REF_IN2 (3V) + 0.001221, // V - INT_ADC_POWER_SUPPLY_1_THERMISTOR + 0.00700441, // V - INT_ADC_MAIN_NON_ISOLATED_24_VOLTS + 0.00304608 // V - INT_ADC_POWER_SUPPLY_GATE_DRIVER (5V) +}; + // ********** private data ********** static adcData_t adcRawReadings[ NUM_OF_INT_ADC_CHANNELS ]; ///< Buffer holds latest adc channel readings. @@ -135,14 +164,21 @@ { // process readings from last conversion for ( i = 0; i < adcRawReadingsCount; i++ ) - { - U32 ch = adcChannelNum2ChannelId[ adcRawReadings[ i ].id ]; // TODO - need to range check .id? + { + 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; - adcReadingsIdx[ ch ] = INC_WRAP( adcReadingsIdx[ ch ], 0, SIZE_OF_ROLLING_AVG - 1 ); + 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_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_INT_ADC_CHANNEL_NUMBER, adcRawReadings[ i ].id ) + } } } else @@ -178,4 +214,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; +} + /**@}*/