Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -ree40156fe9be170a677d5a4a944145dd0c23b9f1 -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision ee40156fe9be170a677d5a4a944145dd0c23b9f1) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -62,8 +62,8 @@ #define CONCENTRATE_PUMP_STEP_PERIOD_RESOLUTION ( 0.50F / ( US_PER_SECOND * SEC_PER_MIN ) ) ///< Convert step period resolution (0.50 us) to minute. /// Volume output per pulse. -#define CONCENTRATE_PUMP_VOLUME_PER_PULSE_DIENER ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER ) -#define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_VOLUME_PER_REV ) +#define CONCENTRATE_PUMP_VOLUME_PER_PULSE_DIENER ( CONCENTRATE_PUMP_VOLUME_PER_REV_DIENER / CONCENTRATE_PUMP_PULSE_PER_REV ) +#define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) #define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. #define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 100 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. Index: firmware/App/Controllers/DialysatePumps.h =================================================================== diff -u -rf6022e86136c821709ce24b61e11e8e2bdf0b11e -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision f6022e86136c821709ce24b61e11e8e2bdf0b11e) +++ firmware/App/Controllers/DialysatePumps.h (.../DialysatePumps.h) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -32,7 +32,7 @@ // ********** public definitions ********** -#define MIN_DIALYSATE_PUMP_RPM 350 ///< Minimum RPM target for dialysate pump (though zero is allowed if turning pump off). +#define MIN_DIALYSATE_PUMP_RPM 200 ///< Minimum RPM target for dialysate pump (though zero is allowed if turning pump off). #define MAX_DIALYSATE_PUMP_RPM 2650 ///< Maximum RPM target for dialysate pump. #define DEGAS_PUMP_TARGET_PRES_ADJ_THRESHOLD -1.0F ///< Dialysate Pump(D12) target pressure threshold adjustment factor. Index: firmware/App/Controllers/RinsePump.c =================================================================== diff -u -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) +++ firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -15,10 +15,11 @@ * ***************************************************************************/ -#include "RinsePump.h" +#include "FpgaDD.h" #include "Messaging.h" #include "OperationModes.h" #include "PersistentAlarm.h" +#include "RinsePump.h" #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" @@ -30,14 +31,21 @@ // ********** private definitions ********** -#define RINSE_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Rinse pump data publish interval. -#define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Rinse pump data publish start counter. +#define RINSE_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Rinse pump data publish interval. +#define DATA_PUBLISH_COUNTER_START_COUNT 13 ///< Rinse pump data publish start counter. +#define RINSE_PUMP_OFF_COUNT 0U ///< Rinse Pump OFF value in count +#define RINSE_PUMP_DEFAULT_PWM_PERCENT 7.0F ///< Initial Rinse pump PWM percentage +#define RINSE_PUMP_MAX_PWM_PERCENT 100.0F ///< Max Rinse pump PWM percentage +#define RINSE_PUMP_PWM_IN_COUNT_MAX 255.0F ///< Rinse pump max count (100% PWM = 255) +#define RINSE_PUMP_PWM_PULSE_RESOLUTION_US 10 ///< Rinse pump PWM pulse resolution in 10us // ********** private data ********** -static RINSE_PUMP_STATE_T currentRinsePumpState; ///< Current rinse pump control state. -static U32 rinsePumpDataPublicationTimerCounter; ///< Rinse pump data broadcast timer counter. -static OVERRIDE_U32_T rinsePumpDataPublishInterval; ///< Rinse pump data broadcast interval (in ms). +static RINSE_PUMP_STATE_T currentRinsePumpState; ///< Current rinse pump control state. +static U32 rinsePumpDataPublicationTimerCounter; ///< Rinse pump data broadcast timer counter. +static U32 rinsePumpMeasuredSpeed; ///< Rinse pump measured speed +static OVERRIDE_F32_T rinsePumpPwmPercentage; ///< Rinse pump PWM percentage. +static OVERRIDE_U32_T rinsePumpDataPublishInterval; ///< Rinse pump data broadcast interval (in ms). // ********** private function prototypes ********** @@ -62,6 +70,11 @@ rinsePumpDataPublishInterval.ovData = RINSE_PUMP_DATA_PUB_INTERVAL; rinsePumpDataPublishInterval.ovInitData = RINSE_PUMP_DATA_PUB_INTERVAL; rinsePumpDataPublishInterval.override = OVERRIDE_RESET; + rinsePumpPwmPercentage.data = RINSE_PUMP_DEFAULT_PWM_PERCENT; + rinsePumpPwmPercentage.ovData = RINSE_PUMP_DEFAULT_PWM_PERCENT; + rinsePumpPwmPercentage.ovInitData = RINSE_PUMP_DEFAULT_PWM_PERCENT; + rinsePumpPwmPercentage.override = OVERRIDE_RESET; + rinsePumpMeasuredSpeed = 0; } /*********************************************************************//** @@ -99,6 +112,24 @@ /*********************************************************************//** * @brief + * The calculateRinsePumpSpeed function calculate rinse pump speed based + * on FPGA report pulse width value. + * @details \b Inputs: fpgaD79PumpSpeed + * @details \b Outputs: rinsePumpMeasuredSpeed + * @return none. + *************************************************************************/ +void calculateRinsePumpSpeed( void ) +{ + // Pulse width in 10us resolution + U16 pumpPulseWidth = getFPGAD79RinsePumpSpeed(); + U32 pumpSpeedPerSec = US_PER_SECOND / ( pumpPulseWidth * RINSE_PUMP_PWM_PULSE_RESOLUTION_US ); + + //Speed in RPM + rinsePumpMeasuredSpeed = pumpSpeedPerSec * SEC_PER_MIN; +} + +/*********************************************************************//** + * @brief * The execRinsePumpController function executes the rinse pump state machine. * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if the current state is invalid. * @details \b Inputs: currentRinsePumpState @@ -154,9 +185,17 @@ { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; - // Current alpha system uses valve D65 to turn on the rinse pump - // and its just On/off control for now. - setValveState( D65_VALV, VALVE_STATE_CLOSED ); + if ( TRUE == getTestConfigStatus( TEST_CONFIG_ENABLE_4WIRE_RINSE_PUMP ) ) + { + // Set PWM count zero to stop the pump + setFPGAD79RinsePumpPWMControl( RINSE_PUMP_OFF_COUNT ); + } + else + { + // Current alpha system uses valve D65 to turn on the rinse pump + // and its just On/off control for now. + setValveState( D65_VALV, VALVE_STATE_CLOSED ); + } return state; } @@ -172,10 +211,21 @@ { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_ON; - // Current alpha system uses valve D65 to turn on the rinse pump - // and its just On/off control for now. - setValveState( D65_VALV, VALVE_STATE_OPEN ); + if ( TRUE == getTestConfigStatus( TEST_CONFIG_ENABLE_4WIRE_RINSE_PUMP ) ) + { + F32 pwmPercent = getF32OverrideValue( &rinsePumpPwmPercentage ); + U32 pwmInCount = (U32)( ( pwmPercent / RINSE_PUMP_MAX_PWM_PERCENT ) * RINSE_PUMP_PWM_IN_COUNT_MAX ); + //Turn on Rinse pump with given PWM value + setFPGAD79RinsePumpPWMControl( pwmInCount ); + } + else + { + // Current alpha system uses valve D65 to turn on the rinse pump + // and its just On/off control for now. + setValveState( D65_VALV, VALVE_STATE_OPEN ); + } + return state; } @@ -194,7 +244,9 @@ { RINSE_PUMP_PAYLOAD_T data; - data.d79State = getRinsePumpState(); + data.d79State = getRinsePumpState(); + data.d79PumpPWM = getF32OverrideValue( &rinsePumpPwmPercentage ); + data.d79PumpRPM = rinsePumpMeasuredSpeed; broadcastData( MSG_ID_DD_RINSE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( RINSE_PUMP_PAYLOAD_T ) ); rinsePumpDataPublicationTimerCounter = 0; @@ -224,5 +276,22 @@ return result; } +/*********************************************************************//** + * @brief + * The testRinsePumpPWMPercentOverride function sets the override value + * of the rinse pump PWM percentage. + * @details Inputs: rinsePumpPwmPercentage (0 to 100%) + * @details Outputs: rinsePumpPwmPercentage + * @param message Override message from Dialin which includes the override + * value of the rinse pump PWM percentage. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testRinsePumpPWMPercentOverride( MESSAGE_T *message ) +{ + BOOL result = f32Override( message, &rinsePumpPwmPercentage ); + + return result; +} + /**@}*/ Index: firmware/App/Controllers/RinsePump.h =================================================================== diff -u -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Controllers/RinsePump.h (.../RinsePump.h) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) +++ firmware/App/Controllers/RinsePump.h (.../RinsePump.h) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -37,6 +37,8 @@ typedef struct { U32 d79State; ///< Rinse pump state status + F32 d79PumpPWM; ///< Rinse pump PWM value + U32 d79PumpRPM; ///< Rinse pump RPM value } RINSE_PUMP_PAYLOAD_T; #pragma pack(pop) @@ -57,6 +59,7 @@ RINSE_PUMP_STATE_T getRinsePumpState( void ); BOOL testRinsePumpDataPublishIntervalOverride( MESSAGE_T *message ); +BOOL testRinsePumpPWMPercentOverride( MESSAGE_T *message ); /**@}*/ Index: firmware/App/Modes/ModeGenDialysate.h =================================================================== diff -u -r9650047180a7b0ed919853d3526645c47445fe61 -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 9650047180a7b0ed919853d3526645c47445fe61) +++ firmware/App/Modes/ModeGenDialysate.h (.../ModeGenDialysate.h) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -33,7 +33,7 @@ #define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. #define SPENT_DIAL_PUMP_INITIAL_RPM 2300 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. -#define SPENT_DIAL_PUMP_FILL_RPM 350 ///< Nominal RPM target for spent chamber fill operations. +#define SPENT_DIAL_PUMP_FILL_RPM 200 ///< Nominal RPM target for spent chamber fill operations. /// Generate dialysate mode data structure typedef struct Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -r498757853c009a4e25dec98461be91fcadd8057d -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 498757853c009a4e25dec98461be91fcadd8057d) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -252,12 +252,15 @@ U16 fpgaD76PumpHallSense; ///< Reg 444. UF D76_Pump hall sensor pulse width U16 fpgaD76PumpStepCountStatus; ///< Reg 446. UF pump revolution down count status U08 fpgaD76PumpFault; ///< Reg 448: UF pump fault + U08 fpgaUnUsed; ///< Reg 449: Unused byte + U16 fpgaD79PumpSpeed; ///< Reg 450: 4-wire Rinse pump (D79) speed - U32 fpgaD74CondDataOut; ///< Reg 449. Data read from Conductivity Sensor D74 register - U16 fpgaD74CondCond; ///< Reg 453. D74 conductivity - U16 fpgaD74CondTemp; ///< Reg 455. D74 Temperature - U08 fpgaD74CondReadCnt; ///< Reg 457. D74 successful read count - U08 fpgaD74CondErrorCnt; ///< Reg 458. D74 error read count + U32 fpgaD74CondDataOut; ///< Reg 452. Data read from Conductivity Sensor D74 register + U16 fpgaD74CondCond; ///< Reg 456. D74 conductivity + U16 fpgaD74CondTemp; ///< Reg 458. D74 Temperature + U08 fpgaD74CondReadCnt; ///< Reg 460. D74 successful read count + U08 fpgaD74CondErrorCnt; ///< Reg 461. D74 error read count + } DD_FPGA_SENSORS_T; typedef struct @@ -356,9 +359,10 @@ U16 fpgaD76PumpSpeed; ///< Reg 152. UF Pump Speed/RPM Control U16 fpgaD76PumpRevCount; ///< Reg 154. UF pump revolution count U08 fpgaD76PumpControl; ///< Reg 156. UF Pump Control - U08 fpgaConSensD74Control; ///< Reg 157. Conductivity/Temperature Sensors D74 Control registers - U16 fpgaConSensD74_Addrs; ///< Reg 158. D74 Initialization Address register - U32 fpgaConSensD74_Data_In; ///< Reg 160. D74 Initialization data register + U08 fpgaD79PumpControl; ///< Reg 157. D79 pump control + U08 fpgaConSensD74Control; ///< Reg 158. Conductivity/Temperature Sensors D74 Control registers + U16 fpgaConSensD74_Addrs; ///< Reg 159. D74 Initialization Address register + U32 fpgaConSensD74_Data_In; ///< Reg 161. D74 Initialization data register } FPGA_ACTUATORS_T; #pragma pack(pop) @@ -1656,6 +1660,20 @@ /*********************************************************************//** * @brief + * The setFPGAD79RinsePumpPWMControl function sets the 4-wire Rinse pump + * control. + * @details \b Inputs: none + * @details \b Outputs: fpgaD79PumpControl + * @param control the PWM count to control the rinse pump + * @return none + *************************************************************************/ +void setFPGAD79RinsePumpPWMControl( U08 control ) +{ + fpgaActuatorSetPoints.fpgaD79PumpControl = control; +} + +/*********************************************************************//** + * @brief * The getFPGAVersions function gets the FPGA version numbers. * @details \b Inputs: fpgaHeader * @details \b Outputs: none @@ -3224,4 +3242,17 @@ return fpgaSensorReadings.fpgaD42RxFIFODataOut; } +/*********************************************************************//** + * @brief + * The getFPGAD79RinsePumpSpeed function returns the 4-wire rinse pump + * speed. + * @details \b Inputs: fpgaD79PumpSpeed + * @details \b Outputs: none + * @return fpgaSensorReadings.fpgaD79PumpSpeed + *************************************************************************/ +U16 getFPGAD79RinsePumpSpeed( void ) +{ + return fpgaSensorReadings.fpgaD79PumpSpeed; +} + /**@}*/ Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -r498757853c009a4e25dec98461be91fcadd8057d -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 498757853c009a4e25dec98461be91fcadd8057d) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -150,6 +150,7 @@ void setFPGAD11PumpRevolutionCount( U16 count ); void setFPGAD10PumpRevolutionCount( U16 count ); void setFPGAD76PumpRevolutionCount( U16 count ); +void setFPGAD79RinsePumpPWMControl( U08 control ); U08 getFPGAD11PumpControlStatus( void ); U08 getFPGAD10PumpControlStatus( void ); @@ -168,6 +169,7 @@ U16 getFPGAD11PumpRevolutionCountStatus( void ); U16 getFPGAD10PumpRevolutionCountStatus( void ); U16 getFPGAD76PumpRevolutionCountStatus( void ); +U16 getFPGAD79RinsePumpSpeed( void ); void setFPGAD48PumpSpeed( U16 speed ); void setFPGAD12PumpSpeed( U16 speed ); Index: firmware/App/Services/Messaging.c =================================================================== diff -u -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 -r812ad8c00b6e976736cc3af210adeaa125f5478d --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 812ad8c00b6e976736cc3af210adeaa125f5478d) @@ -177,6 +177,7 @@ { MSG_ID_DD_BLOOD_LEAK_ZEROING_INTERVAL_IN_MS_OVERRIDE_REQUEST, &testBloodLeakZeroingIntervalInMillisecondsOverride }, { MSG_ID_DD_BLOOD_LEAK_ZERO_REQUEST, &testBloodLeakZeroSequenceRequest }, { MSG_ID_DD_RINSE_PUMP_DATA_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testRinsePumpDataPublishIntervalOverride }, + { MSG_ID_DD_RINSE_PUMP_PWM_PERCENT_OVERRIDE_REQUEST, &testRinsePumpPWMPercentOverride }, }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLER_LOOKUP) / sizeof(MSG_HANDLER_LOOKUP_T))