Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -r766708fceb0bdf1af8c7897df29d4f5036bfd3db -r52362c924eb6233f0a23f6978ea3ce6a2b1b9376 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 766708fceb0bdf1af8c7897df29d4f5036bfd3db) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 52362c924eb6233f0a23f6978ea3ce6a2b1b9376) @@ -64,25 +64,23 @@ /// PI Controllers -- initial configurations. static PI_CONTROLLER_T piControllers[ NUM_OF_PI_CONTROLLERS_IDS ] = { // Kp Ki uMax uMin ref meas err esw esum ctrl Ilimit controller type - { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_ULTRAFILTRATION + { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_ULTRAFILTRATION { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_BLOOD_FLOW { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0, CONTROLLER_UNIDIRECTIONAL } // PI_CONTROLLER_ID_DIALYSATE_FLOW }; -/**@}*/ - /*********************************************************************//** * @brief * Initialize controller before operation. Make sure to call it before * first call to runController function. - * + * @details Inputs: piControllers + * @details Outputs: piControllers * @param controllerID ID filter number * @param initialControlSignal Value of the output on the first iteration * @param kP Coefficient for proportional * @param kI Coefficient for integral * @param controlMin Minimum control output * @param controlMax Maximum control output - * * @return none *************************************************************************/ void initializePIController( PI_CONTROLLER_ID_T controllerID, F32 initialControlSignal, @@ -117,10 +115,10 @@ * @brief * Reset controller before new set point. Make sure to call it before first * call to runController function. - * + * @details Inputs: piControllers + * @details Outputs: piControllers * @param controllerID ID filter number * @param initialControlSignal Value of the output on the first iteration - * * @return none *************************************************************************/ void resetPIController( PI_CONTROLLER_ID_T controllerID, F32 initialControlSignal ) @@ -146,11 +144,11 @@ /*********************************************************************//** * @brief * Call this function whenever a new measured signal sampled is acquired. - * + * @details Inputs: piControllers + * @details Outputs: piControllers * @param controllerID ID filter number * @param referenceSignal reference signal value * @param measuredSignal latest measured sample - * * @return value of the control signal *************************************************************************/ F32 runPIController(PI_CONTROLLER_ID_T controllerID, F32 referenceSignal, F32 measuredSignal) @@ -195,9 +193,9 @@ controller->errorSum += controller->errorSignal; } - // Calculate control signal + // Calculate control signal from i term controller->errorSumBeforeWindUp = controller->errorSum; - controlSignalBeforeWindup = ( controller->Kp * controller->errorSignal ) + ( controller->Ki * controller->errorSum ); + controlSignalBeforeWindup = ( controller->Ki * controller->errorSum ); controller->controlSignal = RANGE( controlSignalBeforeWindup, controller->uMin, controller->uMax ); // Handle anti-windup for i term @@ -206,6 +204,10 @@ { controller->errorSum -= ( windupError / controller->Ki ); } + + // Add p term to control signal and re-apply range limits + controller->controlSignal += ( controller->Kp * controller->errorSignal ); + controller->controlSignal = RANGE( controller->controlSignal, controller->uMin, controller->uMax ); result = controller->controlSignal; } @@ -220,10 +222,10 @@ /*********************************************************************//** * @brief * Returns the latest requested signal sample. - * + * @details Inputs: piControllers + * @details Outputs: piControllers * @param controllerID ID filter number * @param signalID signal sample ID request - * * @return latest sample requested *************************************************************************/ F32 getPIControllerSignals( PI_CONTROLLER_ID_T controllerID, PI_CONTROLLER_SIGNALS_ID signalID )