Index: firmware/App/Controllers/RinsePump.c =================================================================== diff -u -rf32ce45ed787bb8cc691bf0bf8b41d646d681e47 -r2df08cbe162400cce7c67fc2a6a32a91f37bb9f5 --- firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision f32ce45ed787bb8cc691bf0bf8b41d646d681e47) +++ firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision 2df08cbe162400cce7c67fc2a6a32a91f37bb9f5) @@ -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 10.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; +} + /**@}*/