Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r0b93322875e9aa5719941574fde93d3042dc6796 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 0b93322875e9aa5719941574fde93d3042dc6796) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -23,7 +23,6 @@ #include "AlarmMgmt.h" #include "DGDefs.h" #include "Heaters.h" -#include "InternalADC.h" #include "MessageSupport.h" #include "ModeFill.h" #include "NVDataMgmt.h" @@ -37,6 +36,7 @@ #include "TaskPriority.h" #include "TemperatureSensors.h" #include "Timers.h" +#include "Voltages.h" /** * @addtogroup Heaters @@ -48,6 +48,8 @@ #define HEATERS_MAX_DUTY_CYCLE 1.00F ///< Heaters max duty cycle (100%). #define HEATERS_MIN_DUTY_CYCLE 0.00F ///< Heaters minimum duty cycle (0.00%). #define HEATERS_MIN_HEAT_DISINFECT_DUTY_CYCLE 0.6F ///< Heaters minimum duty cycle during heat disinfect. +#define HEATERS_MAX_EFFICIENCY 0.0F ///< Heaters minimum efficiency. +#define HEATERS_MIN_EFFICIENCY 1.0F ///< Heaters maximum efficiency. #define HEATERS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Heaters data publish interval. @@ -524,7 +526,7 @@ if ( ( DG_MODE_FILL == opMode ) || ( DG_MODE_GENE == opMode ) || ( DG_MODE_DRAI == opMode ) ) { - currentTemperature = getTrimmerHeaterTargetTemperature(); + currentTemperature = getReservoirCurrentTemperature(); dutyCycle = calculateTrimmerHeaterDutyCycle( targetTemperature, currentTemperature, targetFlowLPM, TRUE ); state = HEATER_EXEC_STATE_TRIMMER_CONTROL_TO_TARGET; } @@ -650,9 +652,9 @@ heaterEfficiency += ( primaryTargetTemperature - lastFillTemperature ) * PRIMARY_HEATER_DUTY_CYCLE_PER_TEMPERATURE_C; } - // If the efficiency is less than 0, set it to 0 but if the efficiency is greater than 100, it is not enforced - // to be 100 since the duty cycle range check will cap the duty cycle to 100 anyways. - heaterEfficiency = MAX( heaterEfficiency, 0.0 ); + // Check the heater's efficiency to make sure it is in between 0 and 1 (0 to 100%) + heaterEfficiency = MIN( heaterEfficiency, HEATERS_MAX_EFFICIENCY ); + heaterEfficiency = MAX( heaterEfficiency, HEATERS_MIN_EFFICIENCY ); // Update the heaters efficiency heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency = heaterEfficiency; @@ -661,13 +663,11 @@ // Duty cycle = ( 69.73 * flow rate * deltaT / primary heater maximum power ) ^ 1/2 // Multiply the duty cycle to the heater efficiency - F32 dutyCycle = sqrt( ( WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * - fabs( targetTemperature - currentTemperature ) * flow ) / PRIMARY_HEATERS_MAXIMUM_POWER_WATTS ) * heaterEfficiency; + F32 dutyCycle = sqrt( ( WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * fabs( targetTemperature - currentTemperature ) * flow ) / PRIMARY_HEATERS_MAXIMUM_POWER_WATTS ); + dutyCycle = ( heaterEfficiency > NEARLY_ZERO ? dutyCycle * heaterEfficiency : dutyCycle ); + dutyCycle = MIN( dutyCycle, HEATERS_MAX_DUTY_CYCLE ); + dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); - // Check the boundaries of the calculated duty cycle - dutyCycle = MIN( dutyCycle, HEATERS_MAX_DUTY_CYCLE ); - dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); - return dutyCycle; } @@ -818,29 +818,33 @@ *************************************************************************/ static void monitorHeatersVoltage( void ) { - F32 mainPriVoltage = getIntADCVoltageConverted( INT_ADC_PRIMARY_HEATER_24_VOLTS ); - // TODO it is assumed that the main and small primary heaters have equal voltage since the PWMs are divided into 2 + F32 mainPriVoltage = getMonitoredLineLevel( MONITORED_LINE_24V_PRIM_HTR_V ); + // NOTE: it is assumed that the main and small primary heaters have equal voltage since the PWMs are divided into 2 // before applying the PWMs to the heaters. Right now, there is no ADC channel available for the small primary // heater so the main primary heater's ADC channel is used for the small primary heater as well. - F32 smallPriVoltage = getIntADCVoltageConverted( INT_ADC_PRIMARY_HEATER_24_VOLTS ); - F32 trimmerVoltage = getIntADCVoltageConverted( INT_ADC_TRIMMER_HEATER_24_VOLTS ); + F32 smallPriVoltage = getMonitoredLineLevel( MONITORED_LINE_24V_PRIM_HTR_V ); + F32 trimmerVoltage = getMonitoredLineLevel( MONITORED_LINE_24V_TRIM_HTR_V ); // Voltage to PWM is reverse. If PWM = 0 -> V = 24V - F32 mainPri = heatersStatus[ DG_PRIMARY_HEATER ].dutycycle > NEARLY_ZERO ? heatersStatus[ DG_PRIMARY_HEATER ].dutycycle : 1.0; - F32 smallPri = heatersStatus[ DG_PRIMARY_HEATER ].dutycycle > NEARLY_ZERO ? heatersStatus[ DG_PRIMARY_HEATER ].dutycycle : 1.0; - F32 trimmer = heatersStatus[ DG_TRIMMER_HEATER ].dutycycle > NEARLY_ZERO ? heatersStatus[ DG_TRIMMER_HEATER ].dutycycle : 1.0; + F32 mainPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutycycle; + F32 smallPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutycycle; + F32 trimmerDC = heatersStatus[ DG_TRIMMER_HEATER ].dutycycle; - F32 mainPriVoltageTol = HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL * mainPriVoltage; - F32 smallPriVoltageTol = HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL * smallPriVoltage; - F32 trimmerVoltageTol = HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL * trimmerVoltage; + F32 mainPriVoltageTol = HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL * HEATERS_MAX_OPERATING_VOLTAGE_V; + F32 smallPriVoltageTol = HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL * HEATERS_MAX_OPERATING_VOLTAGE_V; + F32 trimmerVoltageTol = HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL * HEATERS_MAX_OPERATING_VOLTAGE_V; - BOOL isMainPriOut = ( fabs( ( HEATERS_MAX_OPERATING_VOLTAGE_V * mainPri ) - mainPriVoltage ) > mainPriVoltageTol ? TRUE : FALSE ); - BOOL isSmallPriOut = ( fabs( ( HEATERS_MAX_OPERATING_VOLTAGE_V * smallPri ) - smallPriVoltage ) > smallPriVoltageTol ? TRUE : FALSE ); - BOOL isTrimmerOut = ( fabs( ( HEATERS_MAX_OPERATING_VOLTAGE_V * trimmer ) - trimmerVoltage ) > trimmerVoltageTol ? TRUE : FALSE ); + F32 mainPriExpectedVoltage = HEATERS_MAX_OPERATING_VOLTAGE_V * ( 1.0 - mainPriDC ); + F32 smallPriExpectedVoltage = HEATERS_MAX_OPERATING_VOLTAGE_V * ( 1.0 - smallPriDC ); + F32 trimmerExpectedVoltage = HEATERS_MAX_OPERATING_VOLTAGE_V * ( 1.0 - trimmerDC ); - //checkPersistentAlarm( ALARM_ID_DG_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isMainPriOut, mainPri, mainPriVoltageTol ); - //checkPersistentAlarm( ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isSmallPriOut, smallPri, smallPriVoltageTol ); - //checkPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmer, trimmerVoltageTol ); + BOOL isMainPriOut = ( fabs( mainPriExpectedVoltage - mainPriVoltage ) > mainPriVoltageTol ? TRUE : FALSE ); + BOOL isSmallPriOut = ( fabs( smallPriExpectedVoltage - smallPriVoltage ) > smallPriVoltageTol ? TRUE : FALSE ); + BOOL isTrimmerOut = ( fabs( trimmerExpectedVoltage - trimmerVoltage ) > trimmerVoltageTol ? TRUE : FALSE ); + + //checkPersistentAlarm( ALARM_ID_DG_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isMainPriOut, mainPriDC, mainPriVoltageTol ); + //checkPersistentAlarm( ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, isSmallPriOut, smallPriDC, smallPriVoltageTol ); + //checkPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, isTrimmerOut, trimmerDC, trimmerVoltageTol ); } Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -46,7 +46,6 @@ typedef struct { BOOL startHeater; ///< Flag indicates start or stop heater - F32 targetTemp; ///< Target temperature for heater // TODO remove and its counterpart in HD } TRIMMER_HEATER_CMD_T; /// Heaters data structure. Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r224b86c0847207c168d38fa1713a1e9116642267 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -26,7 +26,8 @@ #include "Pressures.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" -#include "TaskPriority.h" +#include "TaskPriority.h" +#include "TemperatureSensors.h" #include "Timers.h" /** @@ -39,6 +40,8 @@ #define PUMP_PRESSURE_ZERO 777 ///< ADC counts equivalent to 0 PSI for pump in/out pressure sensors. #define PUMP_PRESSURE_PSIA_PER_COUNT 0.06434F ///< PSIA per ADC count conversion factor for pump in/out pressure sensors. #define PUMP_PRESSURE_PSIA_TO_PSI_OFFSET 14.7F ///< Subtract this offset to convert PSIA to PSI. TODO - use barometric sensor when available. +#define ONE_BAR_TO_PSI_CONVERSION 14.5F ///< 1 bar to PSI conversion. +#define ONE_BAR_TO_MILLI_BAR 1000 ///< 1 bar to milli bar conversion. #define PRESSURE_SAMPLES_TO_AVERAGE ( 200 / TASK_PRIORITY_INTERVAL ) ///< Averaging pressure data over the reporting interval. #define PRESSURE_AVERAGE_MULTIPLIER ( 1.0F / (F32)PRESSURE_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing. @@ -54,47 +57,65 @@ #define PRESSURES_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the pressures data is published on the CAN bus. #define DATA_PUBLISH_COUNTER_START_COUNT 10 ///< Data publish counter start count. #define PRESSURE_SENSORS_ADC_CHECK_ARRAY_LEN 4 ///< Pressure sensors ADC check array length. + +static const U32 TWO_TO_POWER_OF_6 = ( 1 << 6 ); ///< 2^6. +static const U32 TWO_TO_POWER_OF_7 = ( 1 << 7 ); ///< 2^7. +static const U32 TWO_TO_POWER_OF_15 = ( 1 << 15 ); ///< 2^15. +static const U32 TWO_TO_POWER_OF_16 = ( 1 << 16 ); ///< 2^16. +static const U32 TWO_TO_POWER_OF_17 = ( 1 << 17 ); ///< 2^17. +static const U32 TWO_TO_POWER_OF_21 = ( 1 << 21 ); ///< 2^21. /// Defined states for the pressures monitor state machine. typedef enum PresOccl_States { - PRESSURE_INIT_STATE = 0, ///< Initialization state - PRESSURE_CONTINUOUS_READ_STATE, ///< Continuous read sensors state - NUM_OF_PRESSURE_STATES ///< Number of pressure monitor states + PRESSURE_INIT_STATE = 0, ///< Initialization state. + PRESSURE_CONTINUOUS_READ_STATE, ///< Continuous read sensors state. + NUM_OF_PRESSURE_STATES ///< Number of pressure monitor states. } PRESSURE_STATE_T; /// Defined states for the pressures self-test state machine. typedef enum Pressures_Self_Test_States { - PRESSURE_SELF_TEST_STATE_START = 0, ///< Self-test start state - PRESSURE_TEST_STATE_IN_PROGRESS, ///< Self-test in progress state - PRESSURE_TEST_STATE_COMPLETE, ///< Self-test completed state - NUM_OF_PRESSURE_SELF_TEST_STATES ///< Number of pressure self-test states -} PRESSURE_SELF_TEST_STATE_T; + PRESSURE_SELF_TEST_STATE_START = 0, ///< Self-test start state. + PRESSURE_TEST_STATE_IN_PROGRESS, ///< Self-test in progress state. + PRESSURE_TEST_STATE_COMPLETE, ///< Self-test completed state. + NUM_OF_PRESSURE_SELF_TEST_STATES ///< Number of pressure self-test states. +} PRESSURE_SELF_TEST_STATE_T; + +/// Barometric sensor conversion coefficients +typedef struct +{ + U16 pressureSensitivity; + U16 pressureOffset; + U16 pressureSensitivityTempCoeff; + U16 pressureOffsetTempCoeff; +} BARO_SENSOR_CONSTS_T; // ********** private data ********** -static PRESSURE_STATE_T pressuresState; ///< current state of pressure monitor state machine. -static U32 pressuresDataPublicationTimerCounter; ///< used to schedule pressure data publication to CAN bus. +static PRESSURE_STATE_T pressuresState; ///< current state of pressure monitor state machine. +static U32 pressuresDataPublicationTimerCounter; ///< used to schedule pressure data publication to CAN bus. static OVERRIDE_U32_T pressuresDataPublishInterval = { PRESSURES_DATA_PUB_INTERVAL, - PRESSURES_DATA_PUB_INTERVAL, 0, 0 }; /// Pressure data publish interval. -static OVERRIDE_F32_T pressures[ NUM_OF_PRESSURE_SENSORS ]; ///< Measured pressure from sensors. + PRESSURES_DATA_PUB_INTERVAL, 0, 0 }; /// Pressure data publish interval. +static OVERRIDE_F32_T pressures[ NUM_OF_PRESSURE_SENSORS ]; ///< Measured pressure from sensors. -static S32 measuredPressureReadingsSum[ NUM_OF_PRESSURE_SENSORS ]; ///< Raw pressure sensor sums for averaging. -static U32 pressureFilterCounter = 0; ///< Used to schedule pressure sensor filtering. +static S32 msrdPressureSum[ NUM_OF_PRESSURE_SENSORS ]; ///< Raw pressure sensor sums for averaging. +static U32 pressureFilterCounter; ///< Used to schedule pressure sensor filtering. +static BARO_SENSOR_CONSTS_T baroConvConsts; ///< Barometric sensor conversion constants. +static PRESSURE_SELF_TEST_STATE_T pressuresSelfTestState; ///< Current pressure self-test state. +static SELF_TEST_STATUS_T pressuresSelfTestResult; ///< Self-test result of the Pressures module. +static DG_PRES_SENSORS_CAL_RECORD_T pressuresCalRecord; ///< Pressures calibration record. -static PRESSURE_SELF_TEST_STATE_T pressuresSelfTestState; ///< Current pressure self-test state. -static SELF_TEST_STATUS_T pressuresSelfTestResult; ///< Self-test result of the Pressures module. -static DG_PRES_SENSORS_CAL_RECORD_T pressuresCalRecord; ///< Pressures calibration record. - // ********** private function prototypes ********** static PRESSURE_STATE_T handlePressuresInitState( void ); static PRESSURE_STATE_T handlePressuresContReadState( void ); -static void publishPressuresData( void ); - +static void publishPressuresData( void ); static SELF_TEST_STATUS_T handleSelfTestADCCheck( void ); +static F32 calculateBaroPressure( U32 adcSum ); +static F32 getCalibrationAppliedPressure( U08 sensorId, F32 pressure ); +static F32 getBaroPressurePSI( void ); /*********************************************************************//** * @brief @@ -105,21 +126,20 @@ *************************************************************************/ void initPressures( void ) { - U32 i; + U08 i; + pressuresState = PRESSURE_INIT_STATE; + pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; + pressuresDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + pressureFilterCounter = 0; for ( i = 0; i < NUM_OF_PRESSURE_SENSORS; i++ ) { - pressures[ i ].data = 0.0; - pressures[ i ].ovData = 0.0; + pressures[ i ].data = 0.0; + pressures[ i ].ovData = 0.0; pressures[ i ].ovInitData = 0.0; - pressures[ i ].override = OVERRIDE_RESET; - - measuredPressureReadingsSum[ i ] = 0; - } - - pressuresState = PRESSURE_INIT_STATE; - pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; - pressuresDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + pressures[ i ].override = OVERRIDE_RESET; + msrdPressureSum[ i ] = 0; + } initPersistentAlarm( ALARM_ID_INLET_WATER_PRESSURE_IN_LOW_RANGE, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD, INLET_WATER_PRESSURE_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, PRESSURE_OUT_OF_RANGE_TIMEOUT_MS, PRESSURE_OUT_OF_RANGE_TIMEOUT_MS ); @@ -222,15 +242,29 @@ switch ( pressuresSelfTestState ) { case PRESSURE_SELF_TEST_STATE_START: - getNVRecord2Driver( GET_CAL_PRESSURE_SENOSRS, (U08*)&pressuresCalRecord, sizeof( DG_PRES_SENSORS_CAL_RECORD_T ), - NUM_OF_CAL_DATA_PRES_SENSORS, ALARM_ID_NO_ALARM ); - pressuresSelfTestState = PRESSURE_TEST_STATE_IN_PROGRESS; - pressuresSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + { + BOOL calStatus = getNVRecord2Driver( GET_CAL_PRESSURE_SENOSRS, (U08*)&pressuresCalRecord, sizeof( DG_PRES_SENSORS_CAL_RECORD_T ), + NUM_OF_CAL_DATA_PRES_SENSORS, ALARM_ID_NO_ALARM ); + if ( TRUE == calStatus ) + { + pressuresSelfTestState = PRESSURE_TEST_STATE_IN_PROGRESS; + pressuresSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + } + else + { + pressuresSelfTestResult = SELF_TEST_STATUS_FAILED; + } + } break; case PRESSURE_TEST_STATE_IN_PROGRESS: - pressuresSelfTestResult = handleSelfTestADCCheck(); - pressuresSelfTestState = PRESSURE_TEST_STATE_COMPLETE; + baroConvConsts.pressureSensitivity = getFPGABaroPressureSensitivity(); + baroConvConsts.pressureSensitivityTempCoeff = getFPGABaroTempCoeffOfPressSensitvity(); + baroConvConsts.pressureOffset = getFPGABaroPressureOffset(); + baroConvConsts.pressureOffsetTempCoeff = getFPGABaroTempCoeffOfPressOffset(); + pressuresSelfTestResult = handleSelfTestADCCheck(); + pressuresSelfTestState = PRESSURE_TEST_STATE_COMPLETE; + break; case PRESSURE_TEST_STATE_COMPLETE: @@ -268,23 +302,34 @@ *************************************************************************/ static PRESSURE_STATE_T handlePressuresContReadState( void ) { + PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; S32 measuredPressureReadingsRaw[ NUM_OF_PRESSURE_SENSORS ]; - U32 sensorID; + U08 sensorId; F32 pressureReading; - BOOL isPressureOutOfRange; - PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; + BOOL isPressureOutOfRange; - // get latest raw pressure readings - measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + // Get latest raw pressure readings + /*measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; - measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; - // update sums for pressure average calculations - measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ]; - measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_OUTLET ]; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ]; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ]; + measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ PRESSURE_SENSOR_BAROMETRIC ] = (S32)getFPGABaroPressure(); + // TODO why is this needed? + // Update sums for pressure average calculations + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_INLET ]; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_RO_PUMP_OUTLET ]; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ]; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ]; + msrdPressureSum[ PRESSURE_SENSOR_BAROMETRIC ] += measuredPressureReadingsRaw[ PRESSURE_SENSOR_BAROMETRIC ];*/ + + // Update sums for pressure average calculations + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] += (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] += (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] += (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] += (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + msrdPressureSum[ PRESSURE_SENSOR_BAROMETRIC ] += (S32)getFPGABaroPressure(); + // Check if a new calibration is available if ( TRUE == isNewCalibrationRecordAvailable() ) { @@ -295,47 +340,72 @@ // filter every 200ms if ( ++pressureFilterCounter >= PRESSURE_SAMPLES_TO_AVERAGE ) { - U32 sensor; - F32 pressuresBeforeCal[ NUM_OF_PRESSURE_SENSORS ]; + F32 adcSum; + F32 pressureBeforeCal = 0.0; + F32 baroPressure = getBaroPressurePSI(); + pressureFilterCounter = 0; + for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) + { + adcSum = (F32)msrdPressureSum[ sensorId ] * PRESSURE_AVERAGE_MULTIPLIER; + + switch ( sensorId ) + { + case PRESSURE_SENSOR_RO_PUMP_INLET: + case PRESSURE_SENSOR_RO_PUMP_OUTLET: + case PRESSURE_SENSOR_DRAIN_PUMP_OUTLET: + case PRESSURE_SENSOR_DRAIN_PUMP_INLET: + pressureBeforeCal = ( adcSum * PUMP_PRESSURE_PSIA_PER_COUNT ) - baroPressure; + pressures[ sensorId ].data = getCalibrationAppliedPressure( sensorId, pressureBeforeCal ); + msrdPressureSum[ sensorId ] = 0; + break; + + case PRESSURE_SENSOR_BAROMETRIC: + pressureBeforeCal = calculateBaroPressure( (U32)adcSum ); + pressures[ sensorId ].data = getCalibrationAppliedPressure( sensorId, pressureBeforeCal ); + msrdPressureSum[ sensorId ] = 0; + break; + } + } + + // TODO remove // Calculate average pressures - F32 avgRoIn = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; - F32 avgRoOut = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; - F32 avgDrnIn = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; - F32 avgDrnOut = (F32)measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; + /*F32 avgRoIn = (F32)msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgRoOut = (F32)msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgDrnIn = (F32)msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgDrnOut = (F32)msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] * PRESSURE_AVERAGE_MULTIPLIER; // Convert average pressure readings to PSI pressuresBeforeCal[ PRESSURE_SENSOR_RO_PUMP_INLET ] = avgRoIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; pressuresBeforeCal[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = avgRoOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; pressuresBeforeCal[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = avgDrnIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; pressuresBeforeCal[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = avgDrnOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - // Reset average counter - pressureFilterCounter = 0; + // Apply calibration to the pressure values prior to storing them - for ( sensor = 0; sensor < NUM_OF_PRESSURE_SENSORS; sensor++ ) + for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) { - pressures[ sensor ].data = pow( pressuresBeforeCal[ sensor ], 4 ) * pressuresCalRecord.pressureSensors[ sensor ].fourthOrderCoeff + - pow( pressuresBeforeCal[ sensor ], 3 ) * pressuresCalRecord.pressureSensors[ sensor ].thirdOrderCoeff + - pow( pressuresBeforeCal[ sensor ], 2 ) * pressuresCalRecord.pressureSensors[ sensor ].secondOrderCoeff + - pressuresBeforeCal[ sensor ] * pressuresCalRecord.pressureSensors[ sensor ].gain + - pressuresCalRecord.pressureSensors[ sensor ].offset; + pressures[ sensorId ].data = pow( pressuresBeforeCal[ sensorId ], 4 ) * pressuresCalRecord.pressureSensors[ sensorId ].fourthOrderCoeff + + pow( pressuresBeforeCal[ sensorId ], 3 ) * pressuresCalRecord.pressureSensors[ sensorId ].thirdOrderCoeff + + pow( pressuresBeforeCal[ sensorId ], 2 ) * pressuresCalRecord.pressureSensors[ sensorId ].secondOrderCoeff + + pressuresBeforeCal[ sensorId ] * pressuresCalRecord.pressureSensors[ sensorId ].gain + + pressuresCalRecord.pressureSensors[ sensorId ].offset; } // reset sums for next averaging - measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] = 0; - measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = 0; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = 0; - measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_INLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = 0; + msrdPressureSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = 0;*/ } - for ( sensorID = 0; sensorID < NUM_OF_PRESSURE_SENSORS; sensorID++ ) + for ( sensorId = 0; sensorId < NUM_OF_PRESSURE_SENSORS; sensorId++ ) { - pressureReading = getMeasuredDGPressure( sensorID ) + PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressureReading = getMeasuredDGPressure( sensorId ) + getBaroPressurePSI(); isPressureOutOfRange = ( ( pressureReading < MIN_VALID_PRESSURE_RANGE ) || ( pressureReading > MAX_VALID_PRESSURE_RANGE ) ? TRUE : FALSE ); - checkPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, isPressureOutOfRange, (F32)sensorID, pressureReading ); + checkPersistentAlarm( ALARM_ID_DG_PRESSURE_OUT_OF_RANGE, isPressureOutOfRange, (F32)sensorId, pressureReading ); } return result; @@ -353,15 +423,13 @@ // publish pressure/occlusion data on interval if ( ++pressuresDataPublicationTimerCounter >= getU32OverrideValue( &pressuresDataPublishInterval ) ) { - PRESSURES_DATA_T data; - + PRESSURES_DATA_T data; data.roPumpInletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); data.roPumpOutletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); data.drainPumpInletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_INLET ); data.drainPumpOutletPressure = getMeasuredDGPressure( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); - broadcastData( MSG_ID_DG_PRESSURES_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( PRESSURES_DATA_T ) ); - + broadcastData( MSG_ID_DG_PRESSURES_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( PRESSURES_DATA_T ) ); pressuresDataPublicationTimerCounter = 0; } } @@ -401,6 +469,70 @@ return result; } + +/*********************************************************************//** + * @brief + * The calculateBaroPressure function calculates the barometric pressure + * @details Inputs: measuredPressureReadingsSum + * @details Outputs: none + * @param adcSum sum of barometric pressure sensor ADC counts + * @return barometric pressure in millibars + *************************************************************************/ +static F32 calculateBaroPressure( U32 adcSum ) +{ + S32 tempDiff = getBaroSensorTemperatureDiff(); + U64 tempOffset = ( baroConvConsts.pressureOffsetTempCoeff * tempDiff ) / TWO_TO_POWER_OF_6; + U64 presOffset = baroConvConsts.pressureOffset * TWO_TO_POWER_OF_17; + U64 offset = presOffset + tempOffset; + U64 tempSensitivity = ( baroConvConsts.pressureSensitivityTempCoeff * tempDiff ) / TWO_TO_POWER_OF_7; + U64 presSensitivity = baroConvConsts.pressureSensitivity * TWO_TO_POWER_OF_16; + U64 sensitivity = tempSensitivity + presSensitivity; + S32 pres = (S32)( ( ( adcSum * sensitivity ) / TWO_TO_POWER_OF_21 ) - offset ) / TWO_TO_POWER_OF_15; + F32 presPSI = ( (F32)pres / (F32)ONE_BAR_TO_MILLI_BAR ) * ONE_BAR_TO_PSI_CONVERSION; + + return presPSI; +} + +/*********************************************************************//** + * @brief + * The getCalibrationAppliedPressure function applies the calibration values + * to the provided pressure and returns the values. + * @details Inputs: pressuresCalRecord + * @details Outputs: none + * @param sensorId the ID of the pressure sensor + * @param pressure the pressure before applying calibration to it + * @return calibration applied pressure + *************************************************************************/ +static F32 getCalibrationAppliedPressure( U08 sensorId, F32 pressure ) +{ + F32 calPressure = pow( pressure, 4 ) * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].fourthOrderCoeff + + pow( pressure, 3 ) * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].thirdOrderCoeff + + pow( pressure, 2 ) * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].secondOrderCoeff + + pressure * pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].gain + + pressuresCalRecord.pressureSensors[ (PRESSURE_SENSORS_T)sensorId ].offset; + return calPressure; +} + +/*********************************************************************//** + * @brief + * The getBaroPressurePSI function returns the barometric pressure value. + * @details Inputs: none + * @details Outputs: none + * @return barometric pressure value + *************************************************************************/ +static F32 getBaroPressurePSI( void ) +{ + F32 baroPressure = getF32OverrideValue( &pressures[ PRESSURE_SENSOR_BAROMETRIC ] ); + +#ifndef _RELEASE_ + if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) && ( getCurrentOperationMode() != DG_MODE_INIT ) ) + { + baroPressure = PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + } +#endif + + return baroPressure; +} /************************************************************************* Index: firmware/App/Controllers/Pressures.h =================================================================== diff -u -r22176ce95e49213c48454f34ddf5d29b8109f2cb -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Controllers/Pressures.h (.../Pressures.h) (revision 22176ce95e49213c48454f34ddf5d29b8109f2cb) +++ firmware/App/Controllers/Pressures.h (.../Pressures.h) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -48,7 +48,8 @@ PRESSURE_SENSOR_RO_PUMP_INLET = 0, ///< RO pump pressure sensor PRESSURE_SENSOR_RO_PUMP_OUTLET, ///< RO pump pressure sensor PRESSURE_SENSOR_DRAIN_PUMP_INLET, ///< drain pump inlet pressure - PRESSURE_SENSOR_DRAIN_PUMP_OUTLET, ///< drain pump outlet pressure + PRESSURE_SENSOR_DRAIN_PUMP_OUTLET, ///< drain pump outlet pressure + PRESSURE_SENSOR_BAROMETRIC, ///< Barometric pressure sensor NUM_OF_PRESSURE_SENSORS ///< Number of pressure sensors } PRESSURE_SENSORS_T; Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -rc38c6d64b5f4df1fe08e2daabb37d3a7a483a4be -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision c38c6d64b5f4df1fe08e2daabb37d3a7a483a4be) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -93,6 +93,7 @@ #define NON_FLUID_PATH_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C 80.0F ///< Non fluid temperature sensors path maximum allowed temperature in C. #define TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS ( 5 * MS_PER_SECOND ) ///< Temperature sensor out of range persistent period in milliseconds. #define DATA_PUBLISH_COUNTER_START_COUNT 30 ///< Data publish counter start count. +#define BARO_SENSOR_REFERENCE_TEMP_C 2000 ///< Barometric sensor reference temperature in C. // The count cannot be within 0.1V of the rail on both sides therefore: // ADC count = ((2^12) - 1 / ref voltage) * voltage @@ -128,16 +129,24 @@ U08 sensorErrorBitStatus; ///< Temperature sensor error bit status BOOL fpgaErrorStatus; ///< Temperature sensor FPGA error status BOOL adcErrorStatus; ///< Temperature sensor ADC error status + S32 baroTempSnsrDiff; ///< Barometric sensor temperature difference } TEMP_SENSOR_T; +/// Barometric sensor temperature conversion +typedef struct +{ + U16 refTemperature; ///< Barometric sensor reference temperature. + U16 temperatureCoeff; ///< Barometric sensor temperature coefficient. +} BARO_SENSOR_CONSTS_T; + // ********** private data ********** static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state. static TEMP_SENSOR_T tempSensors [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors' data structure. static U32 fpgaRawADCReadInterval; ///< FPGA raw ADC read interval count. static U32 elapsedTime; ///< Elapsed time variable. static U32 internalHeatersConversionTimer; ///< Conversion timer variable to calculate the heaters internal temperature. - +static BARO_SENSOR_CONSTS_T baroConvConsts; ///< Barometric sensor conversion constants. static U32 dataPublicationTimerCounter; ///< Temperature sensors data publish timer counter. static OVERRIDE_U32_T tempSensorsPublishInterval = { TEMP_SENSORS_DATA_PUBLISH_INTERVAL, TEMP_SENSORS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Temperature sensors publish time interval override. @@ -162,8 +171,10 @@ }; ///< Thermocouple inverse coefficient for positive cold junction temperature. static const U32 TEMP_EQUATION_RESISTOR_CALC = 1 << ( TEMP_SENSORS_ADC_BITS - 1 ); ///< Temperature sensors resistor calculation (2^(24 - 1)). -static const F32 TEMP_EQUATION_COEFF_A = 3.9083E-3; ///< ADC to temperature conversion coefficient A. -static const F32 TEMP_EQUATION_COEFF_B = -5.775E-7; ///< ADC to temperature conversion coefficient B. +static const F32 TEMP_EQUATION_COEFF_A = 3.9083E-3; ///< ADC to temperature conversion coefficient A. +static const F32 TEMP_EQUATION_COEFF_B = -5.775E-7; ///< ADC to temperature conversion coefficient B. +static const U32 TWO_TO_POWER_OF_8 = ( 1 << 8 ); ///< 2^8. +static const U32 TWO_TO_POWER_OF_23 = ( 1 << 23 ); ///< 2^23. // ********** private function prototypes ********** @@ -186,7 +197,7 @@ * @details Inputs: none * @details Outputs: tempSensorsSelfTestState, tempSensorsExecState, * elapsedTime, internalHeatersConversionTimer, dataPublicationTimerCounter, - * tempSensors, fpgaRawADCReadInterval + * tempSensors, fpgaRawADCReadInterval, baroConvConsts * @return none *************************************************************************/ void initTemperatureSensors( void ) @@ -213,6 +224,9 @@ benignPolynomialCalRecord( &tempSensorCalRecord.tempSensors[ i ] ); } + // Initialize the barometric sensor's temperature conversion constants + memset( &baroConvConsts, 0x0, sizeof( BARO_SENSOR_CONSTS_T ) ); + // Initialize TPi, THd, and TPo constants tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].gain = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; tempSensors[ TEMPSENSORS_INLET_PRIMARY_HEATER ].refResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; @@ -457,6 +471,19 @@ /*********************************************************************//** * @brief + * The getBaroSensorTemperatureDiff function returns the barometric pressure + * sensor's temperature difference. + * @details Inputs: tempSensors + * @details Outputs: none + * @return barometric pressure sensor temperature difference + *************************************************************************/ +S32 getBaroSensorTemperatureDiff( void ) +{ + return tempSensors[ TEMPSENSORS_BAROMETRIC_TEMP_SENSOR ].baroTempSnsrDiff; +} + +/*********************************************************************//** + * @brief * The getADC2TempConversion function calculates the temperature from the * moving average ADC samples. * @details Inputs: tempEquationCoeffA, tempEquationCoeffB @@ -769,7 +796,7 @@ case TEMPSENSORS_FPGA_BOARD_SENSOR: // Temperature(C) = ((ADC x 503.975) / 4096) - 273.15 // The value of 503.975/4096 has been calculated and stored in the conversion coefficient variable of the structure - temperature = ( avgADCReads * tempSensors[ sensorIndex ].conversionCoeff ) - CELSIUS_TO_KELVIN_CONVERSION; + temperature = ( avgADCReads * tempSensors[ sensorIndex ].conversionCoeff ) - CELSIUS_TO_KELVIN_CONVERSION; break; case TEMPSENSORS_LOAD_CELL_A1_B1: @@ -785,7 +812,12 @@ break; case TEMPSENSORS_BAROMETRIC_TEMP_SENSOR: - temperature = 30.0; + { + tempSensors[ sensorIndex ].baroTempSnsrDiff = (S32)avgADCReads - ( baroConvConsts.refTemperature * TWO_TO_POWER_OF_8 ); + U64 baroSnsrTemperature = BARO_SENSOR_REFERENCE_TEMP_C + ( ( tempSensors[ sensorIndex ].baroTempSnsrDiff * + baroConvConsts.temperatureCoeff ) / TWO_TO_POWER_OF_23 ); + temperature = (F32)( (U32)( baroSnsrTemperature ) / 100 ); + } break; default: @@ -819,8 +851,11 @@ // A delay to let FPGA to boot up else if ( TRUE == didTimeout( elapsedTime, ADC_FPGA_READ_DELAY ) ) { - elapsedTime = 0; - state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; + // Once FPGA is ready get the barometric sensor's temperature conversion constants + baroConvConsts.refTemperature = getFPGABaroReferenceTemperature(); + baroConvConsts.temperatureCoeff = getFPGABaroTempCoeffOfTemperature(); + elapsedTime = 0; + state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; } return state; @@ -859,6 +894,10 @@ readCount = (U32)getFPGATHdReadCount(); processTempSnsrsADCRead( TEMPSENSORS_HEAT_DISINFECT, getFPGATHdTemp(), errorCount, readCount, TRUE ); processTempSnsrsADCRead( TEMPSENSORS_INTERNAL_THD_RTD, getFPGATHdInternalTemp(), errorCount, readCount, FALSE ); + + errorCount = getFPGABaroErrorCount(); + readCount = getFPGABaroReadCount(); + processTempSnsrsADCRead( TEMPSENSORS_BAROMETRIC_TEMP_SENSOR, getFPGABaroTemperature(), errorCount, readCount, TRUE ); } errorCount = (U32)getFPGATRoErrorCount(); @@ -980,7 +1019,7 @@ } } - //checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_OUT_OF_RANGE, isTemperatureOutOfRange, i, temperature ); + //checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_OUT_OF_RANGE, isTemperatureOutOfRange, i, temperature ); // TODO DEBUG_DENALI } } @@ -994,7 +1033,7 @@ *************************************************************************/ static void adjustTemperatureSensorsV3DVTRefResistance( void ) { - // The default are DVT changes + // The defaults are DVT values U32 primaryAndCondSensorsRefResistance = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; U32 externalTempSesnorsRefResitance = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; Index: firmware/App/Controllers/TemperatureSensors.h =================================================================== diff -u -rf639bbc47806ddcefdbdce78a377cd87050872e5 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision f639bbc47806ddcefdbdce78a377cd87050872e5) +++ firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -99,6 +99,7 @@ void checkInletWaterTemperature( void ); F32 getTemperatureValue( U32 sensorIndex ); +S32 getBaroSensorTemperatureDiff( void ); BOOL testSetMeasuredTemperatureOverride( U32 sensorIndex, F32 temperature ); BOOL testResetMeasuredTemperatureOverride( U32 sensorIndex ); Index: firmware/App/DGCommon.h =================================================================== diff -u -rf639bbc47806ddcefdbdce78a377cd87050872e5 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision f639bbc47806ddcefdbdce78a377cd87050872e5) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -37,6 +37,7 @@ #define DISABLE_ACK_ALARM 1 // Build switch #define THD_USING_TRO_CONNECTOR 1 // Build switch // #define EMC_TEST_BUILD 1 // Build switch +#define DISABLE_RTC_POST_FAULT 1 #define DISABLE_FPGA_ALARMS_UNTIL_THE_NEW_PERSISTENT Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -rf639bbc47806ddcefdbdce78a377cd87050872e5 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision f639bbc47806ddcefdbdce78a377cd87050872e5) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -185,6 +185,7 @@ switch ( faultPOSTState ) { case DG_POST_STATE_RTC: +#ifndef DISABLE_RTC_POST_FAULT faultPOSTSelfTestResult = execRTCSelfTest(); if ( SELF_TEST_STATUS_PASSED == faultPOSTSelfTestResult ) { @@ -194,6 +195,9 @@ { state = DG_FAULT_STATE_COMPLETE; } +#else + faultPOSTState = DG_POST_STATE_NVDATAMGMT; +#endif break; case DG_POST_STATE_NVDATAMGMT: Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -336,7 +336,7 @@ getNVRecord2Driver( GET_INF_HEATERS_RECORD, (U08*)&heaterInfo, sizeof( DG_HEATERS_RECORD_T ), 0, ALARM_ID_NO_ALARM ); // If the data in the NV data management was not initialized properly, set it to 0 otherwise, set the average flow rate - fillStatus.fillFlowRateAverageLPM = ( heaterInfo.averageFillFlow < NEARLY_ZERO ? 0.0 : heaterInfo.averageFillFlow ); + fillStatus.fillFlowRateAverageLPM = ( heaterInfo.averageFillFlow < NEARLY_ZERO ? 0.0 : heaterInfo.averageFillFlow ); fillStatus.fillFlowRateRunningSum = 0.0; fillStatus.fillSampleCounter = 0; fillStatus.fillTemperatureRunningSum = 0.0; Index: firmware/App/Services/FPGA.c =================================================================== diff -u -rc38c6d64b5f4df1fe08e2daabb37d3a7a483a4be -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision c38c6d64b5f4df1fe08e2daabb37d3a7a483a4be) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -88,7 +88,7 @@ #define FPGA_POWER_OUT_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< FPGA power out timeout in milliseconds. #define FPGA_GPIO_POWER_STATUS_PIN 7 ///< FPGA GPIO power status pin. #define FPGA_READ_V3_START_BYTE_NUM 256 ///< FPGA V3 read sensors start byte number. -#define FPGA_READ_V3_END_BYTE_NUM 412 ///< FPGA V3 read sensors end byte number. +#define FPGA_READ_V3_END_BYTE_NUM 420 ///< FPGA V3 read sensors end byte number. /// FPGA size of V3 read bytes. #define FPGA_SIZE_OF_V3_READ_BYTES ( FPGA_READ_V3_END_BYTE_NUM - FPGA_READ_V3_START_BYTE_NUM ) @@ -2150,13 +2150,13 @@ /*********************************************************************//** * @brief - * The getFPGABaroReferenceTemp function gets the FPGA barometric pressure + * The getFPGABaroReferenceTemperature function gets the FPGA barometric pressure * sensor reference temperature. * @details Inputs: fpgaSensorReadings * @details Outputs: none * @return barometric pressure sensor reference temperature *************************************************************************/ -U16 getFPGABaroReferenceTemp( void ) +U16 getFPGABaroReferenceTemperature( void ) { return fpgaSensorReadings.fpgaBaroPROMCoeff5; } Index: firmware/App/Services/FPGA.h =================================================================== diff -u -rf639bbc47806ddcefdbdce78a377cd87050872e5 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision f639bbc47806ddcefdbdce78a377cd87050872e5) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -148,7 +148,7 @@ U16 getFPGABaroPressureOffset( void ); U16 getFPGABaroTempCoeffOfPressSensitvity( void ); U16 getFPGABaroTempCoeffOfPressOffset( void ); -U16 getFPGABaroReferenceTemp( void ); +U16 getFPGABaroReferenceTemperature( void ); U16 getFPGABaroTempCoeffOfTemperature( void ); U32 getFPGABaroPressure( void ); U32 getFPGABaroTemperature( void ); Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r224b86c0847207c168d38fa1713a1e9116642267 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -155,7 +155,7 @@ data.timeReservoirFill2SwitchMS = heatersTempCalc.timeReservoirFill2SwitchMS; data.timeUFDecayMS = heatersTempCalc.timeUFDecayMS; data.tempUFFill = heatersTempCalc.tempUFFill; - data.tempReservoirUseActual = getReservoirActualTemperature(); + data.tempReservoirUseActual = getReservoirCurrentTemperature(); data.tempReservoirEndFill = heatersTempCalc.tempReservoirEndFill; data.tempAvgFill = getAvgFillTemperature(); data.tempLastFill = getLastFillTemperature(); @@ -478,6 +478,19 @@ /*********************************************************************//** * @brief + * The getTrimmerHeaterTargetTemperature function returns the trimmer heater + * target temperature in C. + * @details Inputs: none + * @details Outputs: heatersTempCalc + * @return trimmer target temperature in C + *************************************************************************/ +F32 getTrimmerHeaterTargetTemperature( void ) +{ + return heatersTempCalc.tempTargetTrimmer; +} + +/*********************************************************************//** + * @brief * The getReservoirWeight function returns the small filtered weight * of the reservoir's associated load cell. * @details Inputs: none @@ -613,7 +626,6 @@ F32 tempTargetNumerator; F32 targetTempDenominator; F32 tempReservoirUse; - tempReservoirUse = heatersTempCalc.tempTargetTrimmer + RESERVOIR_EXTRA_TEMPERATURE; heatersTempCalc.tempReservoirEndFill = tempReservoirUse - ( heatersTempCalc.timeReservoirFill2SwitchMS * RsrvrTauCPerMS ); heatersTempCalc.tempReservoir0 = heatersTempCalc.tempReservoirEndFill - ( ( heatersTempCalc.timeReservoirFillMS * 0.5 ) * RsrvrTauCPerMS ); @@ -642,13 +654,13 @@ /*********************************************************************//** * @brief - * The getTrimmerHeaterTargetTemperature function calculates the trimmer - * heater target temperature and returns target temperature value. + * The getReservoirCurrentTemperature function calculates the reservoir's + * current temperature and returns target temperature value. * @details Inputs: heatingConstsCalRecord * @details Outputs: heatersTempCalc * @return primary heater target temperature *************************************************************************/ -F32 getTrimmerHeaterTargetTemperature( void ) +F32 getReservoirCurrentTemperature( void ) { F32 tempRsrvrActual = 0.0; F32 fillROAvgActual = getAvgFillTemperature(); Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r669f36cf32c3b500aa2fd5b08c58ee5e6b2e7f08 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 669f36cf32c3b500aa2fd5b08c58ee5e6b2e7f08) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -110,10 +110,11 @@ void setDialysateHeatingParameters( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ); U32 getTargetFillVolumeML( void ); F32 getTargetFillFlowRateLPM( void ); -F32 getReservoirActualTemperature( void ); +F32 getReservoirActualTemperature( void ); // TODO remove F32 getPrimaryHeaterTargetTemperature( void ); -F32 getTrimmerHeaterTargetTemperature( void ); +F32 getReservoirCurrentTemperature( void ); F32 getTargetDialysateFlowLPM( void ); +F32 getTrimmerHeaterTargetTemperature( void ); DG_RESERVOIR_VOLUME_RECORD_T getReservoirsCalRecord( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -re8c019d3d43b517cabfdfe75fa5d03749d036018 -r544e9782a1b8d444224f41efef38a5204c262722 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision e8c019d3d43b517cabfdfe75fa5d03749d036018) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 544e9782a1b8d444224f41efef38a5204c262722) @@ -427,7 +427,6 @@ if ( message->hdr.payloadLen == sizeof( DG_CMD_DIALYSATE_HEATING_PARAMS_T ) ) { DG_CMD_DIALYSATE_HEATING_PARAMS_T payload; - result = TRUE; memcpy( &payload, message->payload, sizeof( DG_CMD_DIALYSATE_HEATING_PARAMS_T ) ); setDialysateHeatingParameters( payload ); @@ -1103,7 +1102,7 @@ if ( TRUE == heaterCmd.startHeater ) { - BOOL isSet = setHeaterTargetTemperature( DG_TRIMMER_HEATER, heaterCmd.targetTemp ); + BOOL isSet = setHeaterTargetTemperature( DG_TRIMMER_HEATER, getTrimmerHeaterTargetTemperature() ); if ( TRUE == isSet ) {