Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r5217f70ca5c74bd586dc14540e6404b43feea004 -re5bb82cad756fbb10f04d576dffd499df78f6b35 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 5217f70ca5c74bd586dc14540e6404b43feea004) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision e5bb82cad756fbb10f04d576dffd499df78f6b35) @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright (c) 2019-2019 Diality Inc. - All Rights Reserved. + * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. @@ -22,7 +22,7 @@ #include "gio.h" #include "mibspi.h" -#include "Common.h" +#include #include "FPGA.h" #include "InternalADC.h" #include "OperationModes.h" @@ -44,9 +44,9 @@ #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 ( 500 / TASK_GENERAL_INTERVAL ) // interval (ms/task time) at which the dialIn pump is controlled -#define DIP_P_COEFFICIENT 0.0002 // P term for dialIn pump control -#define DIP_I_COEFFICIENT 0.00002 // I term for dialIn pump control +#define DIP_CONTROL_INTERVAL ( 1000 / 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 #define DIP_MAX_PWM_DC_DELTA 0.01 // prevents large steps in PWM duty cycle #define DIP_MIN_PWM_DC_DELTA -0.01 @@ -61,7 +61,7 @@ #define DIP_REV_PER_LITER 124.0 // rotor revolutions per liter #define DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DIP_REV_PER_LITER / ML_PER_LITER ) #define DIP_GEAR_RATIO 32.0 // dialIn pump motor to dialIn pump gear ratio -#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.0003717 // ~27 BP motor RPM = 1% PWM duty cycle +#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00042 // ~24 BP motor RPM = 1% PWM duty cycle #define DIP_PWM_ZERO_OFFSET 0.1 // 10% PWM duty cycle = zero speed #define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET ) @@ -70,7 +70,7 @@ #define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)DIAL_IN_PUMP_ADC_MID_PT_BITS ) #define DIAL_IN_FLOW_SAMPLE_FREQ ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) -#define SIZE_OF_ROLLING_AVG (U32)( (F32)DIAL_IN_FLOW_SAMPLE_FREQ * 0.8 ) // measured dialIn flow is filtered w/ moving average +#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 typedef enum DialInPump_States @@ -136,6 +136,7 @@ static DIAL_IN_PUMP_STATE_T handleDialInPumpRampingUpState( void ); static DIAL_IN_PUMP_STATE_T handleDialInPumpRampingDownState( void ); static DIAL_IN_PUMP_STATE_T handleDialInPumpControlToTargetState( void ); +static void setDialInPumpControlSignalPWM( F32 newPWM ); static void stopDialInPump( void ); static void releaseDialInPumpStop( void ); static void setDialInPumpDirection( MOTOR_DIR_T dir ); @@ -339,7 +340,7 @@ { // set initial PWM duty cycle dialInPumpPWMDutyCyclePctSet = DIP_PWM_ZERO_OFFSET + MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); + setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePctSet ); // allow dialIn pump to run in requested direction setDialInPumpDirection( dialInPumpDirection ); releaseDialInPumpStop(); @@ -369,7 +370,7 @@ { // start ramp down to stop dialInPumpPWMDutyCyclePctSet -= MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); + setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePctSet ); result = DIAL_IN_PUMP_RAMPING_DOWN_STATE; } // have we reached end of ramp up? @@ -383,7 +384,7 @@ else { dialInPumpPWMDutyCyclePctSet += MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); + setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePctSet ); } return result; @@ -420,7 +421,7 @@ else { dialInPumpPWMDutyCyclePctSet -= MAX_DIAL_IN_PUMP_PWM_STEP_CHANGE; - etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); + setDialInPumpControlSignalPWM( dialInPumpPWMDutyCyclePctSet ); } return result; @@ -448,14 +449,29 @@ { newPWM = runPIController( PI_CONTROLLER_ID_DIALYSATE_FLOW, tgtFlow, actFlow ); dialInPumpPWMDutyCyclePctSet = newPWM; - etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( dialInPumpPWMDutyCyclePctSet * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); + setDialInPumpControlSignalPWM( newPWM ); dipControlTimerCounter = 0; } return result; } /************************************************************************* + * @brief setDialInPumpControlSignalPWM + * The setDialInPumpControlSignalPWM function sets the PWM duty cycle for \n + * the dialysate inlet pump to a given %. + * @details + * Inputs : none + * Outputs : dialIn pump stop signal activated, PWM duty cycle zeroed + * @param newPWM : new duty cycle % to apply to PWM + * @return none + *************************************************************************/ +static void setDialInPumpControlSignalPWM( F32 newPWM ) +{ + etpwmSetCmpA( etpwmREG2, (U32)( (S32)( ( newPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} + +/************************************************************************* * @brief stopDialInPump * The stopDialInPump function sets the dialIn pump stop signal. * @details