Index: firmware/App/Common.h =================================================================== diff -u -r316e7117180362d54af53818822694c4f936e550 -r90ff6d5060b3f679d17fada9057e4dcecdecae9c --- firmware/App/Common.h (.../Common.h) (revision 316e7117180362d54af53818822694c4f936e550) +++ firmware/App/Common.h (.../Common.h) (revision 90ff6d5060b3f679d17fada9057e4dcecdecae9c) @@ -89,7 +89,10 @@ #define MS_PER_SECOND 1000 #define SEC_PER_MIN 60 #define FRACTION_TO_PERCENT_FACTOR 100.0 +#define ZERO 0 +#define MIN_PER_HOUR 60 + // **** Common Macros **** #define FLOAT_TO_INT_WITH_ROUND(f) ((f) < 0.0 ? (S32)((f) - FLOAT_TO_INT_ROUNDUP_OFFSET) : (S32)((f) + FLOAT_TO_INT_ROUNDUP_OFFSET)) Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r520a29bd1dc8d34710d96c21679d636563fc1c2c -r90ff6d5060b3f679d17fada9057e4dcecdecae9c --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 520a29bd1dc8d34710d96c21679d636563fc1c2c) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 90ff6d5060b3f679d17fada9057e4dcecdecae9c) @@ -35,6 +35,7 @@ #include "DialOutFlow.h" // ********** private definitions ********** +#define DIALOUT_SIMULATOR 1 #define DIAL_OUT_FLOW_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) // interval (ms/task time) at which the dialIn flow data is published on the CAN bus @@ -111,10 +112,15 @@ static F32 dialOutPumpSpeedInRPM; static F32 dialOutPumpCurrentInMA; +#ifdef DIALOUT_SIMULATOR + // Simulator static volatile F32 simulator_volume_in_ml_per_min; static volatile F32 simulator_inlet_flow_rate; +#endif + + // ********** private function prototypes ********** static DIALOUT_FLOW_STATE_T handleDialOutFlowStopState( void ); @@ -130,9 +136,12 @@ static void publishDialOutFlowData( void ); +#ifdef DIALOUT_SIMULATOR + static F32 UFSimulator( F32 pwm ); static void ResetSimulator( void ); +#endif /************************************************************************* * @brief setDialOutFlowNewState @@ -208,15 +217,14 @@ *************************************************************************/ static void setControlSignalPWM( F32 newPWM ) { - etpwmSetCmpA( etpwmREG3, (U16)( FLOAT_TO_INT_WITH_ROUND( newPWM * (F32)(etpwmREG3->TBPRD) ) ) ); + etpwmSetCmpA( etpwmREG3, (U16)( FLOAT_TO_INT_WITH_ROUND( newPWM * (F32)( etpwmREG3->TBPRD ) ) ) ); } /************************************************************************* * @brief updateTargetVolume * The updateTargetVolume function updates the next sample for total target * volume based on rate of UF * - * @param newPWM a fraction of between 0.0 and 1.0. * @return none *************************************************************************/ static void updateTargetVolume( void ) @@ -232,12 +240,11 @@ * @param rxTotalVolumeInMl Total Volume requested for ultra-filtration * @param rxTotalTimeInMinutes Total Rx time in minutes * @param rxFlowRateinMlPerMin - * @return none + * @return TRUE if settings are correct and save, false if parameters are + * saved. *************************************************************************/ BOOL setDialOutFlowRxTotalVolumeAndRxTime( U16 rxTotalVolumeInMl, U16 rxTotalTimeInMinutes, U16 rxFlowRateinMlPerMin) { - #define SECS_IN_MIN 60 - #define DOP_REV_PER_LITER 124.0 // rotor revolutions per liter #define DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DOP_REV_PER_LITER / ML_PER_LITER ) #define DOP_GEAR_RATIO 32.0 // dialIn pump motor to dialIn pump gear ratio @@ -248,7 +255,6 @@ #define MAX_RX_TOTAL_VOLUME_ML 8000 #define MIN_RX_TOTAL_VOLUME_ML 100 - #define MIN_PER_HOUR 60.0 #define MAX_UF_RATE_ML_PER_HOUR 2500.0 @@ -257,7 +263,7 @@ F32 rxUFPatientRate = ((F32) rxTotalVolumeInMl * MIN_PER_HOUR )/ rxTotalTimeInMinutes; - if ( rxTotalVolumeInMl > MAX_RX_TOTAL_VOLUME_ML || rxTotalVolumeInMl < MIN_RX_TOTAL_VOLUME_ML) + if ( rxTotalVolumeInMl > MAX_RX_TOTAL_VOLUME_ML || rxTotalVolumeInMl < MIN_RX_TOTAL_VOLUME_ML ) { returnValue = FALSE; } @@ -274,7 +280,7 @@ rxTotalTargetVolumeInMl = (F32) rxTotalVolumeInMl; rxTargetTimeInSamples = (U32) rxTotalTimeInMinutes * SEC_PER_MIN * DIAL_OUT_CONTROLLER_SAMPLE_FREQ ; - rxInitialTargetFlowRatePWM = RANGE(DOP_PWM_FROM_ML_PER_MIN(rxFlowRateinMlPerMin), MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE); + rxInitialTargetFlowRatePWM = RANGE( DOP_PWM_FROM_ML_PER_MIN( rxFlowRateinMlPerMin ), MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE ); resetPIController( PI_CONTROLLER_ID_LOAD_CELL, rxInitialTargetFlowRatePWM ); @@ -296,14 +302,14 @@ stopDialOutPump(); setDialOutPumpDirection( MOTOR_DIR_FORWARD ); - initializeFilter(FILTER_ID_LOAD_CELL_WEIGHT, 0); + initializeFilter(FILTER_ID_LOAD_CELL_WEIGHT, ZERO ); setDialOutFlowNewState( DIALOUT_FLOW_STOP_STATE , TRUE ); // initialize dialysate outlet flow PI controller initializePIController( PI_CONTROLLER_ID_LOAD_CELL, rxInitialTargetFlowRatePWM, DOP_P_COEFFICIENT, DOP_I_COEFFICIENT, - MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE); + MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE, MAX_DIAL_OUT_PUMP_PWM_DUTY_CYCLE ); } @@ -314,7 +320,7 @@ * @param signal is a measured signal enum. * @return actual signal as float. *************************************************************************/ -F32 getMeasuredVariable( DIALOUT_MEASURED_SIGNALS_T signal) +F32 getMeasuredVariable( DIALOUT_MEASURED_SIGNALS_T signal ) { #define DIP_SPEED_ADC_TO_RPM_FACTOR 1.375 // conversion factor from ADC counts to RPM for dialIn pump motor #define DIP_CURRENT_ADC_TO_MA_FACTOR 2.65 // conversion factor from ADC counts to mA for dialIn pump motor @@ -370,20 +376,24 @@ publishDialOutFlowData(); } +#ifdef DIALOUT_SIMULATOR /* * TODO: Delete UFSimulator when hardware is ready */ F32 UFSimulator(F32 pwm) { + #define SIMULATOR_PWM_TO_ML_PER_MIN 678.0 + #define SIMULATOR_ZERO_CROSSING_ML_PER_MIN 67.80 + F32 flow; if(dialOutFlowState == DIALOUT_FLOW_STOP_STATE) { - flow = 0; + flow = ZERO; } else { - flow = ( ((678.0*pwm - simulator_inlet_flow_rate - 67.80) * (F32) TASK_PRIORITY_INTERVAL )/ (F32) MS_PER_SECOND ); + flow = ( ((SIMULATOR_PWM_TO_ML_PER_MIN*pwm - simulator_inlet_flow_rate - SIMULATOR_ZERO_CROSSING_ML_PER_MIN) * (F32) TASK_PRIORITY_INTERVAL )/ (F32) MS_PER_SECOND ); } simulator_volume_in_ml_per_min += flow; @@ -397,6 +407,7 @@ simulator_volume_in_ml_per_min = 0.0; } +#endif /************************************************************************* * @brief execDialOutFlowController * The execDialOutFlowController function executes the dialIn flow controller. @@ -423,7 +434,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, dialOutFlowState ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, dialOutFlowState ); break; } } @@ -501,7 +512,7 @@ *************************************************************************/ static void stopDialOutPump( void ) { - setControlSignalPWM(0.0); + setControlSignalPWM(ZERO); SET_DOP_STOP(); } @@ -529,7 +540,7 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, dir ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, dir ); break; } } Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -r316e7117180362d54af53818822694c4f936e550 -r90ff6d5060b3f679d17fada9057e4dcecdecae9c --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 316e7117180362d54af53818822694c4f936e550) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 90ff6d5060b3f679d17fada9057e4dcecdecae9c) @@ -136,15 +136,15 @@ controller->referenceSignal = referenceSignal; controller->measuredSignal = measuredSignal; // calculate error signal - controller->errorSignal = referenceSignal-measuredSignal;//fabs( referenceSignal ) - ( referenceSignal < 0.0 ? ( measuredSignal * -1.0 ) : measuredSignal ); + controller->errorSignal = referenceSignal-measuredSignal; controller->errorSum += controller->errorSignal; // anti-windup controller->errorSumBeforeWindUp = controller->errorSum; // calculate control signal controlSignalBeforeWindup = ( controller->Kp * controller->errorSignal ) + ( controller->Ki * controller->errorSum ); controller->controlSignal = RANGE( controlSignalBeforeWindup, controller->uMin, controller->uMax ); // handle anti-windup for i term - windupError = controller->controlSignal - controlSignalBeforeWindup; + windupError = controlSignalBeforeWindup - controller->controlSignal; if ( fabs( windupError ) > NEARLY_ZERO ) { controller->errorSum -= ( windupError / controller->Ki ); Fisheye: Tag 90ff6d5060b3f679d17fada9057e4dcecdecae9c refers to a dead (removed) revision in file `firmware/App/Services/PIControllers.c.old'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 90ff6d5060b3f679d17fada9057e4dcecdecae9c refers to a dead (removed) revision in file `firmware/App/Services/PIControllers.h.old'. Fisheye: No comparison available. Pass `N' to diff?