Index: firmware/App/Controllers/DialysatePumps.c =================================================================== diff -u -r8736efaf98697bd9b2e4c52587469b5c634b1fb6 -r597c1b8b790357bdcacb3a50ae4b5e4278ba7a88 --- firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision 8736efaf98697bd9b2e4c52587469b5c634b1fb6) +++ firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision 597c1b8b790357bdcacb3a50ae4b5e4278ba7a88) @@ -68,16 +68,20 @@ #define SPENT_DIALYSATE_TARGET_PRESSURE_PSI 29.0F ///< Spent dialysate pump recommended pressure(PDs) in psi. #define SPENT_DIALYSATE_MAX_PRESSURE_PSI 30.0F ///< Spent dialysate pump maximum allowed (PDs) pressure in psi. #define DIALYSATE_PUMP_MIN_PRESSURE_PSI 4.0F ///< Minimum dialysate pump pressure in psi. -#define DIALYSATE_PUMP_MAX_PRESSURE_PSI 25.0F ///< Maximum dialysate pump pressure in psi. +#define FRESH_DIAL_PUMP_CNTRL_MAX_PRESSURE_PSI 25.0F ///< Fresh dialysate pump control maximum pressure in psi. +#define SPENT_DIAL_PUMP_CNTRL_MAX_PRESSURE_PSI 29.0F ///< Spent dialysate pump control maximum pressure in psi. +#define FRESH_DIAL_OPEN_CNTRL_PRES_PSI 25.0F ///< fresh dialysate pump pressure in psi at the end of open loop control. +#define SPENT_DIAL_OPEN_CNTRL_PRES_PSI 29.0F ///< spent dialysate pump pressure in psi at the end of open loop control. #define DIALYSATE_PUMP_SPEED_ZERO_RPM 0 ///< Dialysate pump zero RPM speed. #define SPEED_COUNT_ZERO 0 ///< Measured speed count zero check. #define SPEED_CONV_FACTOR 1500000 ///< Measured speed count conversion to RPM -#define PRES_TO_SPD_CONV_FACTOR 85.0F ///< Pressure to speed conversion factor for pump control. +#define D12_PRES_TO_SPD_CONV_FACTOR 106.0F ///< Pressure to speed conversion factor for fresh dialysate pump control. +#define D48_PRES_TO_SPD_CONV_FACTOR 91.4F ///< Pressure to speed conversion factor for fresh dialysate pump control. -#define D12_PUMP_P_COEFFICIENT 3.0F ///< P term for fresh dialysate pump delta pressure control. -#define D12_PUMP_I_COEFFICIENT 0.3F ///< I term for fresh dialysate pump delta pressure control. -#define D48_PUMP_P_COEFFICIENT 3.0F ///< P term for spent dialysate pump delta pressure control. -#define D48_PUMP_I_COEFFICIENT 0.3F ///< I term for spent dialysate pump delta pressure control. +#define D12_PUMP_P_COEFFICIENT 0.20F ///< P term for fresh dialysate pump delta pressure control. +#define D12_PUMP_I_COEFFICIENT 1.0F ///< I term for fresh dialysate pump delta pressure control. +#define D48_PUMP_P_COEFFICIENT 0.20F ///< P term for spent dialysate pump delta pressure control. +#define D48_PUMP_I_COEFFICIENT 1.0F ///< I term for spent dialysate pump delta pressure control. #define MAX_ALLOWED_RPM_OUT_OF_RANGE 300 ///< Maximum allowed RPM out of range from target RPM in open loop. #define PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD 20.0F ///< Speed change that alters the state to ramp during control state. @@ -137,6 +141,10 @@ static OVERRIDE_F32_T dialysatePumpMeasuredCurrentA[ NUM_OF_DIALYSATE_PUMPS ]; ///< Measured dialysate pump current feedback. static OVERRIDE_U32_T measuredDirection[ NUM_OF_DIALYSATE_PUMPS ]; ///< Measured dialysate pump direction. static OVERRIDE_F32_T pumpTargetPressure[ NUM_OF_DIALYSATE_PUMPS ]; ///< Target dialysate pumps' pressure (PSI). +//For testing +#ifdef __PITEST__ +static F32 pIControlSignal[ NUM_OF_CONTROLLER_SIGNAL ]; +#endif //TODO : Validate once HDD defines the conversion. static const F32 CURRENT_CONVERSION_COEFF = (F32)( 2.5F / ( BITS_12_FULL_SCALE - 1.0F ) ); @@ -160,7 +168,9 @@ void initDialysatePump( void ) { DIALYSATE_PUMPS_T pumpId; - +#ifdef __PITEST__ + U32 i; +#endif dialysatePumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; for ( pumpId = DIALYSATE_PUMPS_FIRST; pumpId < NUM_OF_DIALYSATE_PUMPS; pumpId++ ) @@ -203,18 +213,24 @@ pumpTargetPressure[D48_PUMP].override = OVERRIDE_RESET; // Initialize the fresh dialysate pump PI controller - initializePIController( PI_CONTROLLER_ID_D12_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI, D12_PUMP_P_COEFFICIENT, D12_PUMP_I_COEFFICIENT, - DIALYSATE_PUMP_MIN_PRESSURE_PSI, DIALYSATE_PUMP_MAX_PRESSURE_PSI ); + initializePIController( PI_CONTROLLER_ID_D12_PUMP, FRESH_DIAL_OPEN_CNTRL_PRES_PSI, D12_PUMP_P_COEFFICIENT, D12_PUMP_I_COEFFICIENT, + DIALYSATE_PUMP_MIN_PRESSURE_PSI, FRESH_DIAL_PUMP_CNTRL_MAX_PRESSURE_PSI ); // Initialize spent dialysate pump PI controller - initializePIController( PI_CONTROLLER_ID_D48_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI, D48_PUMP_P_COEFFICIENT, D48_PUMP_I_COEFFICIENT, - DIALYSATE_PUMP_MIN_PRESSURE_PSI, DIALYSATE_PUMP_MAX_PRESSURE_PSI ); + initializePIController( PI_CONTROLLER_ID_D48_PUMP, SPENT_DIAL_OPEN_CNTRL_PRES_PSI, D48_PUMP_P_COEFFICIENT, D48_PUMP_I_COEFFICIENT, + DIALYSATE_PUMP_MIN_PRESSURE_PSI, SPENT_DIAL_PUMP_CNTRL_MAX_PRESSURE_PSI ); // Init the dialysate pump with valid PWM while motor is disabled. // when enable triggers, we dont want invlid RPM set that triggers alarm in motor controller. setFPGAD12PumpSpeed( MIN_DIALYSATE_PUMP_RPM ); setFPGAD48PumpSpeed( MIN_DIALYSATE_PUMP_RPM ); +#ifdef __PITEST__ + for ( i = 0; i < NUM_OF_CONTROLLER_SIGNAL; i++ ) + { + pIControlSignal[ i ] = 0.0F; + } +#endif // Initialize the persistent alarms for fresh dialysate pump initPersistentAlarm( ALARM_ID_DD_D12_PUMP_RPM_OUT_OF_RANGE, RPM_OUT_OF_RANGE_TIME_OUT, RPM_OUT_OF_RANGE_TIME_OUT ); initPersistentAlarm( ALARM_ID_DD_D12_PUMP_OFF_FAULT, SAFETY_SHUTDOWN_TIMEOUT, SAFETY_SHUTDOWN_TIMEOUT ); @@ -320,11 +336,11 @@ //Reset PI Controller if ( D12_PUMP == pumpId ) { - resetPIController( PI_CONTROLLER_ID_D12_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI ); + resetPIController( PI_CONTROLLER_ID_D12_PUMP, FRESH_DIAL_OPEN_CNTRL_PRES_PSI ); } else { - resetPIController( PI_CONTROLLER_ID_D48_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI ); + resetPIController( PI_CONTROLLER_ID_D48_PUMP, SPENT_DIAL_OPEN_CNTRL_PRES_PSI ); } } @@ -655,11 +671,11 @@ { if ( D12_PUMP == pumpId ) { - resetPIController( PI_CONTROLLER_ID_D12_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI ); + resetPIController( PI_CONTROLLER_ID_D12_PUMP, FRESH_DIAL_OPEN_CNTRL_PRES_PSI ); } else { - resetPIController( PI_CONTROLLER_ID_D48_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI ); + resetPIController( PI_CONTROLLER_ID_D48_PUMP, SPENT_DIAL_OPEN_CNTRL_PRES_PSI ); } state = DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE; } @@ -750,9 +766,18 @@ #if 1 F32 control = runPIController( PI_CONTROLLER_ID_D12_PUMP, targetPressure, measuredPressure ); //TODO : get the equivalent speed for the given control - newSpeed = control * PRES_TO_SPD_CONV_FACTOR; + newSpeed = control * D12_PRES_TO_SPD_CONV_FACTOR; #endif +#ifdef __PITEST__ + U32 i; + + for ( i = 0; i < NUM_OF_CONTROLLER_SIGNAL; i++ ) + { + pIControlSignal[ i ] = getPIControllerSignals( PI_CONTROLLER_ID_D12_PUMP, (PI_CONTROLLER_SIGNALS_ID)i ); + } +#endif + #if 0 if ( measuredPressure < targetPressure ) { @@ -777,10 +802,19 @@ F32 measuredPressure = getFilteredPressure( D51_PRES ); F32 targetPressure = getDialysatePumpTargetPressure( pumpId ); F32 newSpeed = 0; +#if 1 + F32 control = runPIController( PI_CONTROLLER_ID_D48_PUMP, targetPressure, measuredPressure ); + newSpeed = control * D48_PRES_TO_SPD_CONV_FACTOR; +#endif - //F32 control = runPIController( PI_CONTROLLER_ID_D48_PUMP, targetPressure, measuredPressure ); - // TODO : get the equivalent speed for the given control - // newSpeed = control * ( MAX_DIALYSATE_PUMP_RPM / DIALYSATE_PUMP_MAX_PRESSURE_PSI ); +#ifdef __PITEST__ + U32 i; + + for ( i = 0; i < NUM_OF_CONTROLLER_SIGNAL; i++ ) + { + pIControlSignal[ i ] = getPIControllerSignals( PI_CONTROLLER_ID_D48_PUMP, (PI_CONTROLLER_SIGNALS_ID)i ); + } +#endif #if 0 if ( measuredPressure < targetPressure ) { @@ -790,15 +824,15 @@ { newSpeed = dialysatePumps[ pumpId ].currentPumpSpeed - DIALYSATE_PUMP_SPEED_INCREMENT; } - +#endif //Apply speed limit newSpeed = MIN( newSpeed, MAX_DIALYSATE_PUMP_RPM ); newSpeed = MAX( newSpeed, MIN_DIALYSATE_PUMP_RPM ); dialysatePumps[ pumpId ].currentPumpSpeed = newSpeed; //Set spent dialyate pump speed setFPGAD48PumpSpeed( (U16)dialysatePumps[ pumpId ].currentPumpSpeed ); -#endif + } dialysatePumps[ pumpId ].controlTimerCounter = 0; } @@ -952,20 +986,35 @@ DIALYSATE_PUMPS_PUBLISH_DATA_T dialPump; // Populate the data structure for publication +#ifndef __PITEST__ dialPump.d12PumpTargetRPM = getDialysatePumpTargetSpeed( D12_PUMP ); dialPump.d48PumpTargetRPM = getDialysatePumpTargetSpeed( D48_PUMP ); +#else + dialPump.d12PumpTargetRPM = pIControlSignal[ 0 ]; + dialPump.d48PumpTargetRPM = pIControlSignal[ 1 ]; +#endif + dialPump.d12PumpMeasuredSpeed = getDialysatePumpMeasuredSpeed( D12_PUMP ); dialPump.d48PumpMeasuredSpeed = getDialysatePumpMeasuredSpeed( D48_PUMP ); dialPump.d12PumpCurrentSpeed = dialysatePumps[ D12_PUMP ].currentPumpSpeed; dialPump.d48PumpCurrentSpeed = dialysatePumps[ D48_PUMP ].currentPumpSpeed; dialPump.d12PumpState = (U32)dialysatePumps[ D12_PUMP ].dialysatePumpState; dialPump.d48PumpState = (U32)dialysatePumps[ D48_PUMP ].dialysatePumpState; +#ifndef __PITEST__ dialPump.d12PumpTargetPressure = getDialysatePumpTargetPressure( D12_PUMP ); dialPump.d48PumpTargetPressure = getDialysatePumpTargetPressure( D48_PUMP ); dialPump.d12PumpMeasuredPressure = getFilteredPressure( D18_PRES ); dialPump.d48PumpMeasuredPressure = getFilteredPressure( D51_PRES ); dialPump.d12PumpMeasuredCurrent = getDialysatePumpMeasuredCurrentA( D12_PUMP ); dialPump.d48PumpMeasuredCurrent = getDialysatePumpMeasuredCurrentA( D48_PUMP ); +#else + dialPump.d12PumpTargetPressure = pIControlSignal[ 2 ]; + dialPump.d48PumpTargetPressure = pIControlSignal[ 3 ]; + dialPump.d12PumpMeasuredPressure = pIControlSignal[ 4 ]; + dialPump.d48PumpMeasuredPressure = pIControlSignal[ 5 ]; + dialPump.d12PumpMeasuredCurrent = pIControlSignal[ 6 ]; + dialPump.d48PumpMeasuredCurrent = pIControlSignal[ 7 ]; +#endif dialPump.d12PumpControl = (U32)dialysatePumps[ D12_PUMP ].control; dialPump.d48PumpControl = (U32)dialysatePumps[ D48_PUMP ].control; dialPump.d12PumpDirErrCnt = dialysatePumps[ D12_PUMP ].directionErrorCount;