Index: firmware/App/Controllers/LoadCell.c =================================================================== diff -u -rc4434389fe6c3314c2bba98dc2f4cf737551f637 -r0831cb6bf766fe461340b711f2ff14c3d797e10d --- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision c4434389fe6c3314c2bba98dc2f4cf737551f637) +++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 0831cb6bf766fe461340b711f2ff14c3d797e10d) @@ -66,8 +66,7 @@ filteredLoadCellWeights[ i ].override = OVERRIDE_RESET; measuredLoadCellReadingsSum[ i ] = 0; - - measuredLoadCellReadingsRaw[ i ] = 0.0; + measuredLoadCellReadingsRaw[ i ] = 0; } } 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(); Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -rc4434389fe6c3314c2bba98dc2f4cf737551f637 -r0831cb6bf766fe461340b711f2ff14c3d797e10d --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision c4434389fe6c3314c2bba98dc2f4cf737551f637) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 0831cb6bf766fe461340b711f2ff14c3d797e10d) @@ -48,6 +48,9 @@ #define ROP_P_COEFFICIENT 0.005 ///< P term for RO pump control #define ROP_I_COEFFICIENT 0.0025 ///< I term for RO pump control +#define FLOW_SAMPLES_TO_AVERAGE (250 / TASK_PRIORITY_INTERVAL) ///< Averaging flow data over 250 ms intervals. +#define FLOW_AVERAGE_MULTIPLIER (1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE) ///< Optimization - multiplying is faster than dividing. + #define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< conversion factor from target PSI to PWM duty cycle estimate TODO - this is a place holder for real conversion #define RO_FLOW_ADC_TO_LPM_FACTOR 10909.0909 ///< conversion factor from ADC counts to LPM (liters/min) for RO flow rate (multiply this by inverse of FPGA reading). @@ -88,6 +91,9 @@ static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in LPM). static F32 measuredROPumpPressure = 0.0; ///< measured RO pressure (in PSI). +static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging. +static U32 flowFilterCounter = 0; ///< used to schedule flow filtering. + static U32 roControlTimerCounter = 0; ///< determines when to perform control on ro pump static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< current ro pump self test state @@ -183,7 +189,18 @@ { S32 roFlow = (S32)getFPGAROPumpFlowRate(); - measuredROFlowRateLPM.data = ( roFlow == 0 ? 0 : RO_FLOW_ADC_TO_LPM_FACTOR / (F32)(roFlow) ); + // update sum for flow average calculation + measuredFlowReadingsSum += roFlow; + // filter every 250ms + if ( ++flowFilterCounter >= FLOW_SAMPLES_TO_AVERAGE ) + { + F32 avgROFlow = (F32)measuredFlowReadingsSum * FLOW_AVERAGE_MULTIPLIER; + + measuredROFlowRateLPM.data = ( measuredFlowReadingsSum == 0 ? 0.0 : RO_FLOW_ADC_TO_LPM_FACTOR / avgROFlow ); + measuredFlowReadingsSum = 0; + flowFilterCounter = 0; + } + measuredROPumpPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); // TODO - check pressure? Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r4efb2d1786c717ca6cf4b1bc992cec8e16820bff -r0831cb6bf766fe461340b711f2ff14c3d797e10d --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 4efb2d1786c717ca6cf4b1bc992cec8e16820bff) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 0831cb6bf766fe461340b711f2ff14c3d797e10d) @@ -32,7 +32,7 @@ // ********** private definitions ********** #define MIN_RESERVOIR_VOLUME_ML 0 ///< Minimum reservoir volume in mL. -#define MAX_RESERVOIR_VOLUME_ML 2500 ///< Maximum reservoir volume in mL. +#define MAX_RESERVOIR_VOLUME_ML 2000 ///< Maximum reservoir volume in mL. #define DEFAULT_FILL_VOLUME_ML 1700 ///< Default fill volume for treatment in mL. #define DISINFECT_FILL_VOLUME_ML 2400 ///> Fill volume for disinfection in mL. #define MAX_FILL_VOLUME_ML MAX_RESERVOIR_VOLUME_ML ///> Maximum fill volume in mL.