Index: firmware/App/Drivers/ConductivitySensors.c =================================================================== diff -u -r05cb5bf2a80c40d4c08e22abc46f3b074690eaf0 -r55addba733659d02ddabf09bfc0af7c8f69fd50a --- firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 05cb5bf2a80c40d4c08e22abc46f3b074690eaf0) +++ firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 55addba733659d02ddabf09bfc0af7c8f69fd50a) @@ -56,11 +56,19 @@ #define COND_SENSORS_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Conductivity sensors FPGA error timeout in milliseconds. #define COND_SENSORS_READ_ERR_MAX_CNT 255 ///< Conductivity sensors read and error count max value. -#define COND_TEMP_COMP_LOW_BOUNDS 0 -#define COND_TEMP_COMP_HIGH_BOUNDS 0 -#define TEMP_COMP_ALPHA_LOW 0 -#define TEMP_COMP_ALPHA_HIGH 0 -#define TEMP_COMP_ALPHA_MED 0 +#define COND_TEMP_COMP_LOW_BOUNDS 25.0F ///< Low temperature range for temperature compensation +#define COND_TEMP_COMP_HIGH_BOUNDS 42.0F ///< High temperature range for temperature compensation +#define DIALYSATE_SENSORS_ALPHA_LOW 0.02F ///< Temp compensated low alpha value for D27, D29, D43. +#define DIALYSATE_SENSORS_ALPHA_HIGH 0.0213F ///< Temp compensated high alpha value for D27, D29, D43. +#define DIALYSATE_SENSORS_ALPHA_SLOPE 0.00007647F ///< Calculated linear slope between temp and alpha range for dialysate sensors +#define DIALYSATE_SENSORS_ALPHA_INTERCEPT 0.01808824F ///< Calculated linear intercept between temp and alpha range for dialysate sensors +#define BICARB_SENSORS_ALPHA_SLOPE 0.0001F ///< Calculated linear slope between temp and alpha range for bicarb sensors +#define BICARB_SENSORS_ALPHA_INTERCEPT 0.0186F ///< Calculated linear intercept between temp and alpha range for bicarb sensors +#define BICARB_SENSORS_ALPHA_LOW 0.0211F ///< Temp compensated low alpha value for D17 and D74. +#define BICARB_SENSORS_ALPHA_HIGH 0.0228F ///< Temp compensated high alpha value for D17 and D74. +#define RO_SENSORS_ALPHA 0.02F ///< Temp compensated alpha value for P9, P18 with RO water. +#define TEMP_COMP_LINEAR(slope, intercept, temp) ( ( slope * temp ) + intercept ) ///< Line equation for temp + #define COND_TEMP_OFFSET 25 ///< Temperature offset constant used in RTD calculations. #define SIEMENS_TO_MICROSIEMENS_CONVERSION 1000000.0F ///< Siemens to microSiemens conversion factor. #define KOHMS_TO_OHMS 1000.0F ///< Kilo ohms to ohms conversion factor. @@ -80,6 +88,7 @@ F32 rawResistance; ///< Raw Resistance in kOhms from the conductivity sensor. F32 calculatedTemperature; ///< Calculated temperature in C. F32 calculatedResistance; ///< Calculated resistance in Ohms. + F32 currentAlphaValue; ///< Last used alpha value in temperature compensation. U08 condReadCount; ///< Last conductivity read count. U08 condErrorCount; ///< Last conductivity error count. U08 tempReadCount; ///< Last temperature read count. @@ -117,7 +126,7 @@ static BOOL monitorCalDataReads( CONDUCTIVITY_SENSORS_T sensorId ); static BOOL checkConductivityCoefficientRanges( CONDUCTIVITY_SENSORS_T sensorId ); static void calculateConductivityUpdatedStandard( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ); -static void calculateConductivityUpdatedStandardTempCompensated( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ) +static void calculateConductivityUpdatedStandardTempCompensated( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ); static void calculateTemperature( CONDUCTIVITY_SENSORS_T sensorNum ); static void calculateResistance( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ); @@ -544,7 +553,7 @@ isFPSensor = TRUE; } - calculateConductivityUpdatedStandard( sensor, isFPSensor ); + calculateConductivityUpdatedStandardTempCompensated( sensor, isFPSensor ); } return state; @@ -994,7 +1003,7 @@ /*********************************************************************//** * @brief - * The calculateConductivityUpdatedStandard function calculates the conductivity value. + * The calculateConductivityUpdatedStandardTempCompensated function calculates the conductivity value with temperature compensation. * @details \b Inputs: conductivitySensorCoefficients - Conductivity Coefficients * @details \b Inputs: conductivitySensorStatus - Raw measurement values * @details \b Outputs: conductivitySensorStatus - calculated conductivity value @@ -1004,39 +1013,61 @@ *************************************************************************/ static void calculateConductivityUpdatedStandardTempCompensated( CONDUCTIVITY_SENSORS_T sensorNum, BOOL isFPSensor ) { - - /* - * Each conductivity sensor is paired with a temperature sensor to provide temperature-compensated conductivity - * measurements for more accurate conductivity measurements (D17+D16, D74+D75, D27+D28, D29+D30, D43+D44). - * The formula for temperature compensated conductivity at 25°C, - * E_25 = Uncompensated conductivity / (1 + temp compensation factor * (measured temp - 25)). - * The temperature compensation factor, α, depends on the solution that is being measured. There are 3 temperature compensation factors, to be used: - * For dialysate conductivity measurements (D27, D29, D43): α = 2.00 to 2.13% between 25-42°C, 2.00% below 25°C, and 2.13% above 42°C - * For bicarbonate + water (D17, D74) conductivity measurements: α = 2.11 to 2.28% between 25-42°C - * For inlet tap water and RO permeate water (P9, P18) conductivity measurements (IOFP): α = 2.00% - */ F64 calculatedConductivity = 0.0; - F64 alpha = 0.0; F64 k = 0.0; - conductivitySensorStatus[ sensorNum ].calculatedTemperature - - if ( < ) if ( TRUE == isFPSensor ) { - alpha = conductivitySensorCoefficients[ sensorNum ].alpha_low; k = conductivitySensorCoefficients[ sensorNum ].K_low; + conductivitySensorStatus[ sensorNum ].currentAlphaValue = RO_SENSORS_ALPHA; } else { - alpha = conductivitySensorCoefficients[ sensorNum ].alpha_high; k = conductivitySensorCoefficients[ sensorNum ].K_high; + + switch ( sensorNum ) + { + case D74_COND: + case D17_COND: + // check temp range and apply alpha + if ( conductivitySensorStatus[ sensorNum ].calculatedTemperature < COND_TEMP_COMP_LOW_BOUNDS ) + { + conductivitySensorStatus[ sensorNum ].currentAlphaValue = BICARB_SENSORS_ALPHA_LOW; + } + else if( conductivitySensorStatus[ sensorNum ].calculatedTemperature > COND_TEMP_COMP_LOW_BOUNDS ) + { + conductivitySensorStatus[ sensorNum ].currentAlphaValue = BICARB_SENSORS_ALPHA_HIGH; + } + else + { + conductivitySensorStatus[ sensorNum ].currentAlphaValue = TEMP_COMP_LINEAR( BICARB_SENSORS_ALPHA_SLOPE, BICARB_SENSORS_ALPHA_INTERCEPT, conductivitySensorStatus[ sensorNum ].calculatedTemperature ); + } + + break; + default: + // check temp range and apply alpha + if ( conductivitySensorStatus[ sensorNum ].calculatedTemperature < COND_TEMP_COMP_LOW_BOUNDS ) + { + conductivitySensorStatus[ sensorNum ].currentAlphaValue = DIALYSATE_SENSORS_ALPHA_LOW; + } + else if( conductivitySensorStatus[ sensorNum ].calculatedTemperature > COND_TEMP_COMP_LOW_BOUNDS ) + { + conductivitySensorStatus[ sensorNum ].currentAlphaValue = DIALYSATE_SENSORS_ALPHA_HIGH; + } + else + { + conductivitySensorStatus[ sensorNum ].currentAlphaValue = TEMP_COMP_LINEAR( DIALYSATE_SENSORS_ALPHA_SLOPE, DIALYSATE_SENSORS_ALPHA_INTERCEPT, conductivitySensorStatus[ sensorNum ].calculatedTemperature ); + } + break; + } } + + calculateResistance( sensorNum, isFPSensor ); calculateTemperature( sensorNum ); calculatedConductivity = ( ( k / conductivitySensorStatus[ sensorNum ].calculatedResistance ) * - ( 1 + ( alpha * ( COND_TEMP_OFFSET - conductivitySensorStatus[ sensorNum ].calculatedTemperature ) ) ) ); + ( 1 + ( conductivitySensorStatus[ sensorNum ].currentAlphaValue * ( COND_TEMP_OFFSET - conductivitySensorStatus[ sensorNum ].calculatedTemperature ) ) ) ); currentConductivityReadings[ sensorNum ].data = calculatedConductivity * SIEMENS_TO_MICROSIEMENS_CONVERSION; }