Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r186d10f0644b9726f1a632197a0ccfba7b00bf48 -rd4850547b287cc1f94ea3617a1902c5278ea86b4 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 186d10f0644b9726f1a632197a0ccfba7b00bf48) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision d4850547b287cc1f94ea3617a1902c5278ea86b4) @@ -45,7 +45,7 @@ #define MAX_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.88 ///< controller will error if PWM duty cycle > 90%, so set max to 88% #define MIN_DIAL_IN_PUMP_PWM_DUTY_CYCLE 0.12 ///< controller will error if PWM duty cycle < 10%, so set min to 12% -#define DIP_CONTROL_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the dialIn pump is controlled +#define DIP_CONTROL_INTERVAL ( 10000 / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the dialIn pump is controlled #define DIP_P_COEFFICIENT 0.00005 ///< P term for dialIn pump control #define DIP_I_COEFFICIENT 0.00015 ///< I term for dialIn pump control @@ -83,9 +83,7 @@ #define DIAL_IN_PUMP_ADC_ZERO 1998 ///< Mid-point (zero) for ADC readings. #define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)DIAL_IN_PUMP_ADC_ZERO ) ///< Macro converts a 12-bit ADC reading to a signed 16-bit value. -#define DIAL_IN_FLOW_SAMPLE_FREQ ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< -#define SIZE_OF_ROLLING_AVG ( DIAL_IN_FLOW_SAMPLE_FREQ * 2 ) ///< measured dialIn flow is filtered w/ moving average -#define MAX_FLOW_FILTER_INTERVAL 5 ///< slowest sample interval for filter is every 5th sample +#define SIZE_OF_ROLLING_AVG ( ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) * 10 ) ///< measured dialIn flow is filtered w/ moving average /// Enumeration of dialysate inlet pump states. typedef enum DialInPump_States @@ -761,10 +759,9 @@ *************************************************************************/ static void resetDialInFlowMovingAverage( void ) { - flowReadingsTotal = 0.0; flowReadingsIdx = 0; flowReadingsCount = 0; - flowReadingsTmrCtr = 0; + flowReadingsTotal = 0.0; dipControlTimerCounter = 0; } @@ -775,70 +772,19 @@ * @details * Inputs : none * Outputs : flowReadings[], flowReadingsIdx, flowReadingsCount - * @param flow : newest dialIn flow sample * @return none *************************************************************************/ static void filterDialInFlowReadings( F32 flow ) { - BOOL addSampleToFilter = FALSE; - - if ( ( targetDialInFlowRate.data < MIN_DIAL_IN_FLOW_RATE ) || ( targetDialInFlowRate.data >= MAX_DIAL_IN_FLOW_RATE ) ) + if ( flowReadingsCount >= SIZE_OF_ROLLING_AVG ) { - addSampleToFilter = TRUE; + flowReadingsTotal -= flowReadings[ flowReadingsIdx ]; } - else - { - switch ( flowReadingsTmrCtr ) - { - case 0: - addSampleToFilter = TRUE; - break; - - case 1: - addSampleToFilter = FALSE; - break; - - case 2: - if ( targetDialInFlowRate.data >= 400 ) - { - addSampleToFilter = TRUE; - } - break; - - case 3: - if ( targetDialInFlowRate.data >= 200 ) - { - addSampleToFilter = TRUE; - } - break; - - case 4: - if ( targetDialInFlowRate.data >= 300 ) - { - addSampleToFilter = TRUE; - } - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_IN_FLOW_INVALID_FILTER_STATE, flowReadingsTmrCtr ) - break; - } - } - - // if it's time to add sample to filter, add it. - if ( TRUE == addSampleToFilter ) - { - if ( flowReadingsCount >= SIZE_OF_ROLLING_AVG ) - { - flowReadingsTotal -= flowReadings[ flowReadingsIdx ]; - } - flowReadings[ flowReadingsIdx ] = flow; - flowReadingsTotal += flow; - flowReadingsIdx = INC_WRAP( flowReadingsIdx, 0, SIZE_OF_ROLLING_AVG - 1 ); - flowReadingsCount = INC_CAP( flowReadingsCount, SIZE_OF_ROLLING_AVG ); - measuredDialInFlowRate.data = flowReadingsTotal / (F32)flowReadingsCount; - } - flowReadingsTmrCtr = INC_WRAP( flowReadingsTmrCtr, 0, MAX_FLOW_FILTER_INTERVAL - 1 ); + flowReadings[ flowReadingsIdx ] = flow; + flowReadingsTotal += flow; + flowReadingsIdx = INC_WRAP( flowReadingsIdx, 0, SIZE_OF_ROLLING_AVG - 1 ); + flowReadingsCount = INC_CAP( flowReadingsCount, SIZE_OF_ROLLING_AVG ); + measuredDialInFlowRate.data = flowReadingsTotal / (F32)flowReadingsCount; } /*********************************************************************//**