Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r6e22cc1ec54e6e283827b4b30fb02646343c809f -re071a6ac6e8fe7a729730b90334af153afe97817 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 6e22cc1ec54e6e283827b4b30fb02646343c809f) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision e071a6ac6e8fe7a729730b90334af153afe97817) @@ -390,7 +390,7 @@ setPrimaryHeaterTargetTemperature ( 37 ); //if ( getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ) > 0 ) { - //startPrimaryHeater(); + startPrimaryHeater(); state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; temporaryStartROPump(); temporaryStartFan(); @@ -415,7 +415,7 @@ { PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; - /*if ( ++primaryHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) + if ( ++primaryHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { F32 outletTemp = getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ); mainPrimaryHeaterDutyCycle = runPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); @@ -434,7 +434,7 @@ setSmallPrimaryHeaterPWM ( smallPrimaryHeaterDutyCycle ); } primaryHeaterTimerCounter = 0; - }*/ + } publishTemperatureData(); // TODO remove this code @@ -470,7 +470,7 @@ setTrimmerHeaterTargetTemperature ( 38 ); //if ( getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ) > 0 ) { - //startTrimmerHeater(); + startTrimmerHeater(); state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; //temporaryStartROPump(); //temporaryStartFan(); @@ -495,13 +495,13 @@ { TRIMMER_HEATER_EXEC_STATES_T state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; - /*if ( ++trimmerHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) + if ( ++trimmerHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { F32 outletTemp = getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ); trimmerHeaterDutyCycle = runPIController ( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); setTrimmerHeaterPWM ( trimmerHeaterDutyCycle ); trimmerHeaterTimerCounter = 0; - }*/ + } publishTemperatureData(); // TODO remove this code @@ -601,20 +601,41 @@ { #ifdef DEBUG_ENABLED { + //U16 primaryJC = ( (U16)getFPGAPRimaryColdJunctionTemp() ) << 4; + //S16 convertedPriJC = ( (S16)primaryJC ) >> 4; + + //U16 trimmerJC = ( (U16)getFPGATrimmerColdJunctionTemp() ) << 4; + //S16 convertedTriJC = ( (S16)trimmerJC ) >> 4; char debugTempStr[ 256 ]; - sprintf( debugTempStr, "MPDC: %2d, SPDC: %2d, THDC: %2d, TPi: %6.2f, TPo: %6.2f, TD1: %6.2f, " - "TD2: %6.2f, TRo: %6.2f, TDi: %6.2f, TPh: %6.2f, TTh: %6.2f, PTarg: %6.2f, TTarg: %6.2f, ROFlow: %6.2f\r\n", + /*sprintf( debugTempStr, "MPDC: %2d, SPDC: %2d, THDC: %2d, TPi: %6.2f, TPo: %6.2f, TD1: %6.2f, " + "TD2: %6.2f, TRo: %6.2f, TDi: %6.2f, TPh: %6.2f, TTh: %6.2f, PTarg: %6.2f, TTarg: %6.2f, ROFlow: %6.2f, PCJ: %6.2f, TCJ: %6.2f\r\n", (U32)(mainPrimaryHeaterDutyCycle*100), (U32)(smallPrimaryHeaterDutyCycle*100), (U32)(trimmerHeaterDutyCycle*100), getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ), getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ), getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ), getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ), getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ), getTemperatureValue ( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ), - getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ), + getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ), primaryHeaterTargetTemperature, trimmerHeaterTargetTemperature, - (F32)(10909.0909/getFPGAROPumpFlowRate()) ); //TODO Remove flow reader later + (F32)(10909.0909/getFPGAROPumpFlowRate()), + getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR )) + //(F32)(convertedPriJC*0.0625), + //(F32)(convertedTriJC*0.0625)); //TODO Remove flow reader later */ + sprintf( debugTempStr, "MPDC: %2d, SPDC: %2d, THDC: %2d, TPi: %6.2f, TPo: %6.2f, TRo: %6.2f, TPh: %6.2f, TTh: %6.2f, PCJ: %6.2f, TCJ: %6.2f," + " TPI: %6.2f, TTI: %6.2f\r\n", + (U32)(mainPrimaryHeaterDutyCycle*100), (U32)(smallPrimaryHeaterDutyCycle*100), (U32)(trimmerHeaterDutyCycle*100), + getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ), + getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR )); sendDebugData ( (U08*)debugTempStr, strlen(debugTempStr) ); } #endif @@ -625,7 +646,7 @@ // TODO REMOVE THE CODE static void temporaryStartROPump ( void ) { - F32 tempPWM = 0.6; + F32 tempPWM = 1; etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( tempPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } static void temporaryStopROPump ( void ) @@ -645,3 +666,5 @@ etpwmSetCmpB( etpwmREG6, 0 ); } // TODO REMOVE THE CODE + +/**@}*/ Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r6e22cc1ec54e6e283827b4b30fb02646343c809f -re071a6ac6e8fe7a729730b90334af153afe97817 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 6e22cc1ec54e6e283827b4b30fb02646343c809f) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision e071a6ac6e8fe7a729730b90334af153afe97817) @@ -39,8 +39,6 @@ #define TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 5110U ///< Trimmer heater external temperature sensors reference resistance #define TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 100U ///< Trimmer heater external temperature sensors zero degree resistance -#define HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient - #define TEMP_SENSORS_ADC_BITS 24U ///< External temperature sensors ADC bits #define TEMP_SENSORS_ADC_MAX_COUNT (pow(2,TEMP_SENSORS_ADC_BITS)) ///< Temperature sensors max ADC count @@ -79,6 +77,37 @@ #define ADC_FPGA_READ_DELAY 30U ///< Delay in ms before reading the ADC values from FPGA #define INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL 100U ///< Time interval that is used to check the input water +#define HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient +#define HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF 0.0625 + +#define K_THERMOCOUPLE_TEMP_2_MILLI_VOLT_CONVERSION_COEFF 0.041276 + +#define THERMOCOUPLE_POSITIVE_TEMP_C_0 (-0.176004136860 * pow(10,-1)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_1 (0.389212049750 * pow(10,-1)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_2 (0.185587700320 * pow(10,-4)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_3 (-0.994575928740 * pow(10,-7)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_4 (0.318409457190 * pow(10,-9)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_5 (-0.560728448890 * pow(10,-12)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_6 (0.560750590590 * pow(10,-15)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_7 (-0.320207200030 * pow(10,-18)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_8 (0.971511471520 * pow(10,-22)) +#define THERMOCOUPLE_POSITIVE_TEMP_C_9 (-0.121047212750 * pow(10,-25)) + +#define THERMOCOUPLE_POSITIVE_TEMP_EXP_A_0 (0.118597600000 * pow(10,0)) +#define THERMOCOUPLE_POSITIVE_TEMP_EXP_A_1 (-0.118343200000 * pow(10,-3)) +#define THERMOCOUPLE_POSITIVE_TEMP_EXP_A_2 (0.126968600000 * pow(10,3)) + +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_0 0 +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_1 (2.508355 * pow(10,1)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_2 (7.860106 * pow(10,-2)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_3 (-2.503131 * pow(10,-1)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_4 (8.315270 * pow(10,-2)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_5 (-1.228034 * pow(10,-2)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_6 (9.804036 * pow(10,-4)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_7 (-4.413030 * pow(10,-5)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_8 (1.057734 * pow(10,-6)) +#define THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_9 (-1.052755 * pow(10,-8)) + /// Temperature sensor self test states typedef enum tempSensors_Self_Test_States { @@ -111,9 +140,10 @@ [ NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS ];///< Temperature sensors constants array static U32 readAndErrorCounts [ NUM_OF_TEMPERATURE_SENSORS ] [ NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS ]; ///< Read and error counts from FPGA array -static F32 temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature values array +//static F32 temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature values array //TODO Remove +static OVERRIDE_F32_T temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature values array static U32 elapsedTime; ///< Elapsed time - +static U32 conversionTimer; // Private functions prototypes static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestStart ( void ); @@ -124,6 +154,7 @@ static TEMPSENSORS_EXEC_STATES_T handleExecGetADCValues ( void ); static F32 getADC2TempConversion ( F32 avgADC, U32 gain, U32 refResistance, U32 zeroDegResistance ); +static void getHeaterInternalTemp ( U32 TCIndex, U32 CJIndex ); static void processADCRead ( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); // Public functions @@ -161,7 +192,7 @@ tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE; } // Initialize TRo and TDi constants - for ( i = TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR; i++ ) + for ( i = TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR; i++ ) { tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; @@ -170,13 +201,13 @@ // Initialize primary heater internal temperature sensor // The heaters do not need gain, reference resistance, and zero degree resistance - tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; // Initialize trimmer heater internal temperature sensor - tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ] [ ADC_READ_GAIN_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; + tempSensorsConstants [ TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; } /************************************************************************* @@ -261,55 +292,111 @@ * @param none * @return F32 (temperature in deg C) *************************************************************************/ -F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ) +F32 getTemperatureValue ( U32 sensor ) { F32 temperature; - switch ( sensor ) + if ( temperatureValues [ sensor ].override == OVERRIDE_KEY ) { + temperature = temperatureValues [ sensor ].ovData; + } + else + { + temperature = temperatureValues [ sensor ].data; + } + /*switch ( sensor ) + { case TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ]; + if ( temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].data; + } break; case TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ]; + if ( temperatureValues [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ].data; + } break; case TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ]; + if ( temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ].data; + } break; case TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ]; + if ( temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ].data; + } break; case TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ]; + if ( temperatureValues [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ].data; + } break; case TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ]; + if ( temperatureValues [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ].data; + } break; case TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR: - - temperature = temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ]; + if ( temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ].data; + } break; case TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR: - - temperature = temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ]; + if ( temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ].override == OVERRIDE_KEY ) + { + temperature = temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ].ovData; + } + else + { + temperature = temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ].data; + } break; default: // ToDo: Warning? break; - } + }*/ return temperature; } @@ -337,6 +424,54 @@ return temperature; } +static void getHeaterInternalTemp ( U32 TCIndex, U32 CJIndex ) +{ + F32 temperature; + F32 equiVoltage; + F32 correctedVoltage; + F32 TCTemp = temperatureValues [ TCIndex ].data; + F32 CJTemp = temperatureValues [ CJIndex ].data; + + // Value in milli-volts + F32 rawVoltage = ( TCTemp - CJTemp ) * K_THERMOCOUPLE_TEMP_2_MILLI_VOLT_CONVERSION_COEFF; + + // TODO add positive and negative check + equiVoltage = THERMOCOUPLE_POSITIVE_TEMP_C_0 * pow(CJTemp, 0) + + THERMOCOUPLE_POSITIVE_TEMP_C_1 * pow(CJTemp, 1) + + THERMOCOUPLE_POSITIVE_TEMP_C_2 * pow(CJTemp, 2) + + THERMOCOUPLE_POSITIVE_TEMP_C_3 * pow(CJTemp, 3) + + THERMOCOUPLE_POSITIVE_TEMP_C_4 * pow(CJTemp, 4) + + THERMOCOUPLE_POSITIVE_TEMP_C_5 * pow(CJTemp, 5) + + THERMOCOUPLE_POSITIVE_TEMP_C_6 * pow(CJTemp, 6) + + THERMOCOUPLE_POSITIVE_TEMP_C_7 * pow(CJTemp, 7) + + THERMOCOUPLE_POSITIVE_TEMP_C_8 * pow(CJTemp, 8) + + THERMOCOUPLE_POSITIVE_TEMP_C_9 * pow(CJTemp, 9) + + THERMOCOUPLE_POSITIVE_TEMP_EXP_A_0 * + exp(THERMOCOUPLE_POSITIVE_TEMP_EXP_A_1 * pow((CJTemp - THERMOCOUPLE_POSITIVE_TEMP_EXP_A_2),2)); + + correctedVoltage = rawVoltage + equiVoltage; + + temperature = THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_0 + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_1 * correctedVoltage + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_2 * pow(correctedVoltage, 2) + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_3 * pow(correctedVoltage, 3) + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_4 * pow(correctedVoltage, 4) + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_5 * pow(correctedVoltage, 5) + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_6 * pow(correctedVoltage, 6) + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_7 * pow(correctedVoltage, 7) + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_8 * pow(correctedVoltage, 8) + + THERMOCOUPLE_POSITIVE_TEMP_INVERSE_D_9 * pow(correctedVoltage, 9); + + if ( TCIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR ) + { + temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP ].data = temperature; + } + else if ( TCIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ) + { + temperatureValues [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP ].data = temperature; + } +} + /************************************************************************* * @brief * The processADCRead function receives the ADC value and the sensor @@ -365,8 +500,11 @@ * set the avgCalc to true * if the avgCalc in true, calculate all the steps and immediately convert to temperature */ - if ( sensorIndex != TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR && - sensorIndex != TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ) + //TODO clean up + if ( sensorIndex != TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR && + sensorIndex != TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR && + sensorIndex != TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR && + sensorIndex != TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR ) { error = 0; //TODO non-zero error convertedADC = (S32)(adc & MASK_OFF_U32_MSB); @@ -390,11 +528,18 @@ } } // It is a heaters temperature sensor - else + else if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR || + sensorIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ) { U16 adcConv = ( (U16)adc ) << SHIFT_BITS_BY_2; convertedADC = ( (S16)adcConv ) >> SHIFT_BITS_BY_2; } + else if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR || + sensorIndex == TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR ) + { + U16 rawADC = ( (U16)adc ) << SHIFT_BITS_BY_4; + convertedADC = ( (S16)rawADC ) >> SHIFT_BITS_BY_4; + } U32 previousReadCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ]; if ( fpgaCount == previousReadCount ) @@ -454,11 +599,17 @@ tempSensorsConstants [ sensorIndex ] [ ADC_READ_REF_RESISTANCE_INDEX ], tempSensorsConstants [ sensorIndex ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); } - else + else if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR || + sensorIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR ) { temperature = avgADCReads * HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF; } - temperatureValues [ sensorIndex ] = temperature; + else if ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR || + sensorIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR ) + { + temperature = avgADCReads * HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF; + } + temperatureValues [ sensorIndex ].data = temperature; } } @@ -533,7 +684,7 @@ { if ( i != j ) { - largestDelta = MAX( largestDelta, fabs(temperatureValues [ i ] - temperatureValues [ j ]) ); + largestDelta = MAX( largestDelta, fabs(temperatureValues [ i ].data - temperatureValues [ j ].data) ); } if ( largestDelta > MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS ) { @@ -586,29 +737,78 @@ // Look at the error counter and the specific error flag to make sure the error is a temp sensor // Add a byte array to have bits for each sensor to find out exactly what sensor failed - processADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); - processADCRead( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp(), getFPGATHDoErrorCount(), getFPGATHDoReadCount() ); - processADCRead( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp(), getFPGATDiErrorCount(), getFPGATDiReadCount() ); - processADCRead( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, getFPGAPrimaryHeaterTemp(), getFPGAPrimaryHeaterFlags(), getFPGAPrimaryHeaterReadCount() ); - processADCRead( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, getFPGATrimmerHeaterTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); + processADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); + processADCRead( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp(), getFPGATHDoErrorCount(), getFPGATHDoReadCount() ); + processADCRead( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp(), getFPGATDiErrorCount(), getFPGATDiReadCount() ); + processADCRead( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR, getFPGAPrimaryHeaterTemp(), getFPGAPrimaryHeaterFlags(), getFPGAPrimaryHeaterReadCount() ); + processADCRead( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR, getFPGATrimmerHeaterTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); + processADCRead( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR, getFPGAPRimaryColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); + processADCRead( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR, getFPGATrimmerColdJunctionTemp(), getFPGATrimmerHeaterFlags(), getFPGATrimmerHeaterReadCount() ); // Check the inlet water is within temperature range at the desired time interval if ( elapsedTime == 0 ) { elapsedTime = getMSTimerCount(); } - else if ( didTimeout( elapsedTime, INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL ) ) + else if ( didTimeout( elapsedTime, INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL ) && + temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].override != OVERRIDE_KEY ) { elapsedTime = 0; - F32 inletTemperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ]; + F32 inletTemperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ].data; if ( inletTemperature < MIN_WATER_INPUT_TEMPERATURE || inletTemperature >= MAX_WATER_INPUT_TEMPERATURE ) { SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE, inletTemperature ); } } + if ( conversionTimer >= 20 ) + { + getHeaterInternalTemp ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR, + TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR); + getHeaterInternalTemp ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR, + TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR); + conversionTimer = 0; + } + else + { + conversionTimer++; + } + return state; } + +BOOL testSetMeasuredTemperatureOverride ( TEMPERATURE_SENSORS_T sensor, F32 temperature ) +{ + BOOL result = FALSE; + if ( sensor < NUM_OF_TEMPERATURE_SENSORS ) + { + if ( isTestingActivated() ) + { + result = TRUE; + temperatureValues [ sensor ].ovData = temperature; + temperatureValues [ sensor ].override = OVERRIDE_KEY; + } + } + + return result; +} +BOOL testResetMeasuredTemperatureOverride ( TEMPERATURE_SENSORS_T sensor ) +{ + BOOL result = FALSE; + if ( sensor < NUM_OF_TEMPERATURE_SENSORS ) + { + if ( isTestingActivated() ) + { + result = TRUE; + temperatureValues [ sensor ].override = OVERRIDE_RESET; + temperatureValues [ sensor ].ovData = temperatureValues [ sensor ].ovInitData; + } + } + + return result; +} + +/**@}*/ Index: firmware/App/Controllers/TemperatureSensors.h =================================================================== diff -u -r6e22cc1ec54e6e283827b4b30fb02646343c809f -re071a6ac6e8fe7a729730b90334af153afe97817 --- firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision 6e22cc1ec54e6e283827b4b30fb02646343c809f) +++ firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision e071a6ac6e8fe7a729730b90334af153afe97817) @@ -31,15 +31,19 @@ /// Sensors name typedef enum SENSORS_NAME { - TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR = 0, ///< Inlet primary heaters temperature sensor - TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, ///< Outlet primary heaters temperature sensor - TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, ///< Conductivity sensor 1 temperature sensor - TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, ///< Conductivity sensor 2 temperature sensor - TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, ///< Outlet redundancy temperature sensor - TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, ///< Inlet dialysate temperature sensor - TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, ///< Primary heaters internal temperature sensor - TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, ///< Trimmer heater internal temperature sensor - NUM_OF_TEMPERATURE_SENSORS ///< Number of temperature sensors + TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR = 0, ///< Inlet primary heaters temperature sensor + TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, ///< Outlet primary heaters temperature sensor + TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, ///< Conductivity sensor 1 temperature sensor + TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, ///< Conductivity sensor 2 temperature sensor + TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, ///< Outlet redundancy temperature sensor + TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, ///< Inlet dialysate temperature sensor + TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR, ///< Primary heaters internal temperature sensor //TODO update AE + TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SESNOR, ///< Trimmer heater internal temperature sensor //TODO update AE + TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR, ///< Primary heaters cold junction temperature sensor //TODO add to AE + TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR, ///< Trimmer heater cold junction temperature sensor //TODO add to AE + TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP, ///< Primary heaters internal temperature + TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP, + NUM_OF_TEMPERATURE_SENSORS ///< Number of temperature sensors } TEMPERATURE_SENSORS_T; void initTemperatureSensors ( void ); @@ -48,11 +52,11 @@ void execTemperatureSensors ( void ); -F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ); +//F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ); //Todo Remove -//DATA_GET_PROTOTYPE ( F32, ); +DATA_ARRAY_GET_PROTOTYPE ( F32, getTemperatureValue, sensor ); -BOOL testSetMeasuredTemperatureOverride ( F32 temperatrue ); -BOOL testResetMeasuredTemperatureOverride ( void ); +BOOL testSetMeasuredTemperatureOverride ( TEMPERATURE_SENSORS_T sensor, F32 temperature ); //Todo add to AE +BOOL testResetMeasuredTemperatureOverride ( TEMPERATURE_SENSORS_T sensor ); //TODO add to AE #endif Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r6e22cc1ec54e6e283827b4b30fb02646343c809f -re071a6ac6e8fe7a729730b90334af153afe97817 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 6e22cc1ec54e6e283827b4b30fb02646343c809f) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision e071a6ac6e8fe7a729730b90334af153afe97817) @@ -1355,3 +1355,12 @@ { return fpgaSensorReadings.fpgaTrimmerHeaterReadCnt; } + +U16 getFPGAPRimaryColdJunctionTemp ( void ) +{ + return fpgaSensorReadings.fpgaPrimaryHeaterIntJunctionTemp; +} +U16 getFPGATrimmerColdJunctionTemp ( void ) +{ + return fpgaSensorReadings.fpgaTrimmerHeaterIntJunctionTemp; +} Index: firmware/App/Services/FPGA.h =================================================================== diff -u -re7f256098e5c23cc621af73b17160a247d40559c -re071a6ac6e8fe7a729730b90334af153afe97817 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision e7f256098e5c23cc621af73b17160a247d40559c) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision e071a6ac6e8fe7a729730b90334af153afe97817) @@ -73,4 +73,6 @@ U08 getFPGATrimmerHeaterFlags( void ); U08 getFPGATrimmerHeaterReadCount( void ); +U16 getFPGAPRimaryColdJunctionTemp ( void ); +U16 getFPGATrimmerColdJunctionTemp ( void ); #endif