Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -rbbf1e3736be03a4f041ace57e0f95e23caf472dd -r0831cb6bf766fe461340b711f2ff14c3d797e10d --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision bbf1e3736be03a4f041ace57e0f95e23caf472dd) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 0831cb6bf766fe461340b711f2ff14c3d797e10d) @@ -38,6 +38,9 @@ #define PUMP_PRESSURE_PSIA_PER_COUNT 0.06434 ///< PSIA per ADC count conversion factor for pump in/out pressure sensors. #define PUMP_PRESSURE_PSIA_TO_PSI_OFFSET 14.7 ///< Subtract this offset to convert PSIA to PSI. +#define PRESSURE_SAMPLES_TO_AVERAGE (200 / TASK_PRIORITY_INTERVAL) ///< Averaging pressure data over the reporting interval. +#define PRESSURE_AVERAGE_MULTIPLIER (1.0 / (F32)PRESSURE_SAMPLES_TO_AVERAGE) ///< Optimization - multiplying is faster than dividing. + /// Defined states for the pressures monitor state machine. typedef enum PresOccl_States { @@ -63,6 +66,10 @@ static OVERRIDE_U32_T pressuresDataPublishInterval = { PRESSURES_DATA_PUB_INTERVAL, PRESSURES_DATA_PUB_INTERVAL, 0, 0 }; ///< interval (in ms/task interval) at which to publish pressures data to CAN bus. static OVERRIDE_F32_T pressures[ NUM_OF_PRESSURE_SENSORS ]; ///< Measured pressure from sensors. +static S32 measuredPressureReadingsRaw[ NUM_OF_PRESSURE_SENSORS ]; ///< Latest measured raw pressure sensor readings. +static S32 measuredPressureReadingsSum[ NUM_OF_PRESSURE_SENSORS ]; ///< Raw pressure sensor sums for averaging. +static U32 pressureFilterCounter = 0; ///< used to schedule pressure sensor filtering. + static PRESSURE_SELF_TEST_STATE_T pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; ///< current pressure self test state. static U32 pressuresSelfTestTimerCount = 0; ///< timer counter for pressure self test. @@ -84,6 +91,19 @@ *************************************************************************/ void initPressures( void ) { + U32 i; + + for ( i = 0; i < NUM_OF_PRESSURE_SENSORS; i++ ) + { + pressures[ i ].data = 0.0; + pressures[ i ].ovData = 0.0; + pressures[ i ].ovInitData = 0.0; + pressures[ i ].override = OVERRIDE_RESET; + + measuredPressureReadingsSum[ i ] = 0; + measuredPressureReadingsRaw[ i ] = 0; + } + pressuresState = PRESSURE_INIT_STATE; pressuresSelfTestState = PRESSURE_SELF_TEST_STATE_START; pressuresDataPublicationTimerCounter = 0; @@ -150,19 +170,41 @@ { PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; - S32 roIn = (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ); - S32 roOut = (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ); - S32 drainIn = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ); - S32 drainOut = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ); + // get latest raw pressure readings + measuredPressureReadingsRaw[ INT_ADC_RO_PUMP_INLET_PRESSURE ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ INT_ADC_RO_PUMP_OUTLET_PRESSURE ] = (S32)getIntADCReading( INT_ADC_RO_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ INT_ADC_DRAIN_PUMP_INLET_PRESSURE ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_INLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + measuredPressureReadingsRaw[ INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ] = (S32)getIntADCReading( INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ) - PUMP_PRESSURE_ZERO; + // update sums for pressure average calculations + measuredPressureReadingsSum[ INT_ADC_RO_PUMP_INLET_PRESSURE ] += measuredPressureReadingsRaw[ INT_ADC_RO_PUMP_INLET_PRESSURE ]; + measuredPressureReadingsSum[ INT_ADC_RO_PUMP_OUTLET_PRESSURE ] += measuredPressureReadingsRaw[ INT_ADC_RO_PUMP_OUTLET_PRESSURE ]; + measuredPressureReadingsSum[ INT_ADC_DRAIN_PUMP_INLET_PRESSURE ] += measuredPressureReadingsRaw[ INT_ADC_DRAIN_PUMP_INLET_PRESSURE ]; + measuredPressureReadingsSum[ INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ] += measuredPressureReadingsRaw[ INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ]; - // convert ADC counts to PSI for each sensor - pressures[ PRESSURE_SENSOR_RO_PUMP_INLET ].data = (F32)( roIn - PUMP_PRESSURE_ZERO ) * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - pressures[ PRESSURE_SENSOR_RO_PUMP_OUTLET ].data = (F32)( roOut - PUMP_PRESSURE_ZERO ) * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - pressures[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ].data = (F32)( drainIn - PUMP_PRESSURE_ZERO ) * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; - pressures[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ].data = (F32)( drainOut - PUMP_PRESSURE_ZERO ) * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + // filter every 200ms + if ( ++pressureFilterCounter >= PRESSURE_SAMPLES_TO_AVERAGE ) + { // calculate average pressures + F32 avgRoIn = (F32)measuredPressureReadingsSum[ INT_ADC_RO_PUMP_INLET_PRESSURE ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgRoOut = (F32)measuredPressureReadingsSum[ INT_ADC_RO_PUMP_OUTLET_PRESSURE ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgDrnIn = (F32)measuredPressureReadingsSum[ INT_ADC_DRAIN_PUMP_INLET_PRESSURE ] * PRESSURE_AVERAGE_MULTIPLIER; + F32 avgDrnOut = (F32)measuredPressureReadingsSum[ INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE ] * PRESSURE_AVERAGE_MULTIPLIER; - // TODO - any filtering required??? + // reset average counter + pressureFilterCounter = 0; + // convert average pressure readings to PSI + pressures[ PRESSURE_SENSOR_RO_PUMP_INLET ].data = avgRoIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressures[ PRESSURE_SENSOR_RO_PUMP_OUTLET ].data = avgRoOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressures[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ].data = avgDrnIn * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + pressures[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ].data = avgDrnOut * PUMP_PRESSURE_PSIA_PER_COUNT - PUMP_PRESSURE_PSIA_TO_PSI_OFFSET; + + // reset sums for next averaging + measuredPressureReadingsSum[ INT_ADC_RO_PUMP_INLET_PRESSURE ] = 0; + measuredPressureReadingsSum[ PRESSURE_SENSOR_RO_PUMP_OUTLET ] = 0; + measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_INLET ] = 0; + measuredPressureReadingsSum[ PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ] = 0; + } + // check for pressure ranges checkPressures();