Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r622eebf6fb7f1c6c232ffd82bc072dd30a7b3f94 -r9a3be9ebb32e5e0d8e1496def50e04dedf490406 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 622eebf6fb7f1c6c232ffd82bc072dd30a7b3f94) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 9a3be9ebb32e5e0d8e1496def50e04dedf490406) @@ -21,6 +21,7 @@ #include "mibspi.h" #include "FPGA.h" +#include "InternalADC.h" #include "NVDataMgmt.h" #include "MessageSupport.h" #include "OperationModes.h" @@ -86,8 +87,8 @@ #define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< Conversion factor from target PSI to PWM duty cycle estimate. #define SAFETY_SHUTDOWN_TIMEOUT ( 3 * MS_PER_SECOND ) ///< RO pump safety shutdown activation timeout in ms. -#define ROP_ZERO_DUTY_CYCLE_FEEDBACK 0x01FF ///< RO pump zero duty cycle feedback from FPGA. -#define ROP_DUTY_CYCLE_PERIOD_US 500 ///< RO pump duty cycle period in micro seconds. +#define ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE 0.0 ///< RO pump 0% duty cycle feedback voltage. +#define ROP_FEEDBACK_100_PCT_DUTY_CYCLE_VOLTAGE 2.5 ///< RO pump 100% duty cycle feedback voltage. #define ROP_DUTY_CYCLE_OUT_OF_RANGE_TOLERANCE 0.05 ///< RO pump duty cycle out of range tolerance. /// Enumeration of RO pump states. @@ -117,6 +118,7 @@ static BOOL isROPumpOn = FALSE; ///< RO pump is currently running. static F32 roPumpPWMDutyCyclePct = 0.0; ///< Initial RO pump PWM duty cycle. static F32 roPumpDutyCyclePctSet = 0.0; ///< Currently set RO pump PWM duty cycle. +static F32 roPumpFeedbackDutyCyclePct = 0.0; ///< RO pump feedback duty cycle in percent. static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Requested RO pump control mode. static F32 pendingROPumpCmdMaxPressure = 0.0; ///< Delayed (pending) RO pump max pressure (in PSI) setting. @@ -194,6 +196,7 @@ roPumpState = RO_PUMP_OFF_STATE; roPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; isROPumpOn = FALSE; + roPumpFeedbackDutyCyclePct = 0.0; } /*********************************************************************//** @@ -326,8 +329,8 @@ *************************************************************************/ void execROPumpMonitor( void ) { - U16 roFlowReading = getFPGAROPumpFlowRate(); - U16 roFeedbackDCPeriod = getFPGAROPumpDutyCycleFeedback(); + U16 roFlowReading = getFPGAROPumpFlowRate(); + U16 roFeedbackVoltage = getIntADCVoltageConverted( INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE ); // Update sum for flow average calculation measuredFlowReadingsSum += (S32)roFlowReading; @@ -385,9 +388,9 @@ checkPersistentAlarm( ALARM_ID_FLOW_RATE_OUT_OF_LOWER_RANGE, isFlowOutOfLowerRange, currentFlow, targetFlow ); } - if ( ( FALSE == isROPumpOn ) && ( roFeedbackDCPeriod != ROP_ZERO_DUTY_CYCLE_FEEDBACK ) ) + if ( ( FALSE == isROPumpOn ) && ( roFeedbackVoltage != ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE ) ) { - checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, TRUE, roFeedbackDCPeriod, ROP_ZERO_DUTY_CYCLE_FEEDBACK ); + checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, TRUE, roFeedbackVoltage, ROP_FEEDBACK_0_PCT_DUTY_CYCLE_VOLTAGE ); // Check if it has timed out if ( TRUE == isAlarmActive( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE ) ) @@ -396,12 +399,13 @@ } } - if ( TRUE == isROPumpOn ) // TODO do we need to check all this every 1 second and not every 10 ms? + if ( TRUE == isROPumpOn ) { - F32 roDutyCycle = roFeedbackDCPeriod / ROP_DUTY_CYCLE_PERIOD_US; - BOOL isDCOutOfRange = ( fabs( roDutyCycle - roPumpDutyCyclePctSet ) > ROP_DUTY_CYCLE_OUT_OF_RANGE_TOLERANCE ? TRUE : FALSE ); + F32 roFeedbackDutyCycle = ROP_FEEDBACK_100_PCT_DUTY_CYCLE_VOLTAGE / roFeedbackVoltage; + BOOL isDCOutOfRange = ( fabs( roFeedbackDutyCycle - roPumpDutyCyclePctSet ) > ROP_DUTY_CYCLE_OUT_OF_RANGE_TOLERANCE ? TRUE : FALSE ); + roPumpFeedbackDutyCyclePct = roFeedbackDutyCycle; - checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, TRUE, roDutyCycle, roPumpDutyCyclePctSet ); + checkPersistentAlarm( ALARM_ID_RO_PUMP_DUTY_CYCLE_OUT_OF_RANGE, TRUE, roFeedbackDutyCycle, roPumpDutyCyclePctSet ); } #endif @@ -841,7 +845,9 @@ pumpData.measROFlowRate = getMeasuredROFlowRate(); pumpData.roPumpDutyCycle = roPumpDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; pumpData.roPumpState = (U32)roPumpState; + pumpData.roPumpFBDutyCycle = roPumpFeedbackDutyCyclePct * FRACTION_TO_PERCENT_FACTOR; + broadcastData( MSG_ID_RO_PUMP_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&pumpData, sizeof( RO_PUMP_DATA_T ) ); roPumpDataPublicationTimerCounter = 0; } Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r752defbb739ea0756a8bf060f00bc6b9429c2764 -r9a3be9ebb32e5e0d8e1496def50e04dedf490406 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 752defbb739ea0756a8bf060f00bc6b9429c2764) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 9a3be9ebb32e5e0d8e1496def50e04dedf490406) @@ -42,6 +42,7 @@ F32 roPumpDutyCycle; ///< RO pump duty cycle. U32 roPumpState; ///< RO pump current state. F32 roPumpTgtFlowRate; ///< RO pump target flow rate. + F32 roPumpFBDutyCycle; ///< RO pump feedback duty cycle. } RO_PUMP_DATA_T; // ********** public function prototypes ********** Index: firmware/App/DGCommon.h =================================================================== diff -u -r622eebf6fb7f1c6c232ffd82bc072dd30a7b3f94 -r9a3be9ebb32e5e0d8e1496def50e04dedf490406 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 622eebf6fb7f1c6c232ffd82bc072dd30a7b3f94) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 9a3be9ebb32e5e0d8e1496def50e04dedf490406) @@ -45,7 +45,7 @@ // #define PRESSURES_DEBUG 1 // #define IGNORE_DRAIN_PUMP_MONITOR 1 // #define IGNORE_HEATERS_MONITOR 1 -// #define IGNORE_RO_PUMP_MONITOR 1 + #define IGNORE_RO_PUMP_MONITOR 1 #define DISABLE_RO_RATIO_CHECK 1 // #define DISABLE_COND_SENSOR_CHECK 1 // #define DISABLE_WATER_QUALITY_CHECK 1 Index: firmware/App/Drivers/InternalADC.c =================================================================== diff -u -r5a36a768d11cc597a36b894c1fb3a5e5590130f1 -r9a3be9ebb32e5e0d8e1496def50e04dedf490406 --- firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 5a36a768d11cc597a36b894c1fb3a5e5590130f1) +++ firmware/App/Drivers/InternalADC.c (.../InternalADC.c) (revision 9a3be9ebb32e5e0d8e1496def50e04dedf490406) @@ -33,30 +33,30 @@ /// ADC channel number to ADC channel ID (enumeration) look-up table. const INT_ADC_CHANNEL_T adcChannelNum2ChannelId[ MAX_ADC_CHANNELS ] = { - INT_ADC_RO_PUMP_INLET_PRESSURE, // 0 - INT_ADC_RO_PUMP_OUTLET_PRESSURE, // 1 - INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE, // 2 - INT_ADC_DRAIN_PUMP_INLET_PRESSURE, // 3 - INT_ADC_MAIN_24_VOLTS, // 4 - INT_ADC_FPGA_1_8_VOLTS, // 5 - INT_ADC_FPGA_1_VOLT, // 6 - INT_ADC_SENSORS_3_3_VOLTS, // 7 - INT_ADC_PROCESSOR_1_8_VOLTS, // 8 - INT_ADC_POWER_SUPPLY_GATE_DRIVER, // 9 - INT_ADC_SENSORS_5_VOLTS, // 10 - INT_ADC_LOGIC_5_VOLTS, // 11 - INT_ADC_3_3_VOLTS, // 12 - INT_ADC_CONCENTRATE_PUMP_1, // 13 - INT_ADC_CONCENTRATE_PUMP_2, // 14 - INT_ADC_PROCESSOR_1_2_VOLTS, // 15 - INT_ADC_REFERENCE_VOLTAGE, // 16 - INT_ADC_PRIMARY_HEATER_24_VOLTS, // 17 - INT_ADC_TRIMMER_HEATER_24_VOLTS, // 18 - INT_ADC_REF_IN1, // 19 - INT_ADC_REF_IN2, // 20 - INT_ADC_BOARD_THERMISTOR, // 21 - INT_ADC_POWER_SUPPLY_1_THERMISTOR, // 22 - INT_ADC_POWER_SUPPLY_2_THERMISTOR, // 23 + INT_ADC_RO_PUMP_INLET_PRESSURE, // 0 + INT_ADC_RO_PUMP_OUTLET_PRESSURE, // 1 + INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE, // 2 + INT_ADC_DRAIN_PUMP_INLET_PRESSURE, // 3 + INT_ADC_MAIN_24_VOLTS, // 4 + INT_ADC_FPGA_1_8_VOLTS, // 5 + INT_ADC_FPGA_1_VOLT, // 6 + INT_ADC_SENSORS_3_3_VOLTS, // 7 + INT_ADC_PROCESSOR_1_8_VOLTS, // 8 + INT_ADC_POWER_SUPPLY_GATE_DRIVER, // 9 + INT_ADC_SENSORS_5_VOLTS, // 10 + INT_ADC_LOGIC_5_VOLTS, // 11 + INT_ADC_3_3_VOLTS, // 12 + INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE, // 13 + INT_ADC_AVAILABLE_CHANNEL, // 14 + INT_ADC_PROCESSOR_1_2_VOLTS, // 15 + INT_ADC_REFERENCE_VOLTAGE, // 16 + INT_ADC_PRIMARY_HEATER_24_VOLTS, // 17 + INT_ADC_TRIMMER_HEATER_24_VOLTS, // 18 + INT_ADC_REF_IN1, // 19 + INT_ADC_REF_IN2, // 20 + INT_ADC_BOARD_THERMISTOR, // 21 + INT_ADC_POWER_SUPPLY_1_THERMISTOR, // 22 + INT_ADC_POWER_SUPPLY_2_THERMISTOR, // 23 }; const F32 ADC_CHANNEL_READ_TO_UNITS[ NUM_OF_INT_ADC_CHANNELS ] = @@ -66,8 +66,8 @@ 0.06438104, // PSIA- INT_ADC_RO_PUMP_OUTLET_PRESSURE 0.06438104, // PSIA- INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE 0.06438104, // PSIA- INT_ADC_DRAIN_PUMP_INLET_PRESSURE - 1.0, // ? - INT_ADC_CONCENTRATE_PUMP_1 // TODO - get units and conversion for these 2 channels - 1.0, // ? - INT_ADC_CONCENTRATE_PUMP_2 + 0.001365, // V - INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE + 1.0, // ? - INT_ADC_AVAILABLE_CHANNEL 0.00700441, // V - INT_ADC_PRIMARY_HEATER_24_VOLTS (varies inversely with PWM for secondary element) 0.00763285, // V - INT_ADC_TRIMMER_HEATER_24_VOLTS (varies inversely with PWM) 0.001221, // V - INT_ADC_BOARD_THERMISTOR Index: firmware/App/Drivers/InternalADC.h =================================================================== diff -u -r88b5435baa604c699d2d4b752667fa055ed5574a -r9a3be9ebb32e5e0d8e1496def50e04dedf490406 --- firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 88b5435baa604c699d2d4b752667fa055ed5574a) +++ firmware/App/Drivers/InternalADC.h (.../InternalADC.h) (revision 9a3be9ebb32e5e0d8e1496def50e04dedf490406) @@ -42,8 +42,8 @@ INT_ADC_RO_PUMP_OUTLET_PRESSURE, ///< DG internal ADC RO pump outlet pressure channel INT_ADC_DRAIN_PUMP_OUTLET_PRESSURE, ///< DG internal ADC drain pump outlet pressure channel INT_ADC_DRAIN_PUMP_INLET_PRESSURE, ///< DG internal ADC drain pump inlet pressure channel - INT_ADC_CONCENTRATE_PUMP_1, ///< DG internal ADC concentrate pump number 1 channel - INT_ADC_CONCENTRATE_PUMP_2, ///< DG internal ADC concentrate pump number 2 channel + INT_ADC_RO_PUMP_FEEDBACK_DUTY_CYCLE, ///< DG internal ADC RO pump feedback duty cycle channel + INT_ADC_AVAILABLE_CHANNEL, ///< DG internal ADC available channel INT_ADC_PRIMARY_HEATER_24_VOLTS, ///< DG internal ADC primary heater 24 volt supply channel INT_ADC_TRIMMER_HEATER_24_VOLTS, ///< DG internal ADC trimmer heater 24 volt supply channel INT_ADC_BOARD_THERMISTOR, ///< DG internal ADC DG board thermistor channel