Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r6158f53357d5d4023df091b6ed1e8f6aa9f30947 -rc12bff518c0b58065eede15469ad8a2a6f6e317b --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 6158f53357d5d4023df091b6ed1e8f6aa9f30947) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision c12bff518c0b58065eede15469ad8a2a6f6e317b) @@ -18,6 +18,10 @@ #include "TemperatureSensors.h" #include "FPGA.h" +// TODO: For testing only REMOVE +#include "Timers.h" +// TODO: For testing only REMOVE + // Private variables #define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 16U ///< Primary heater external temperature sensors gain @@ -28,38 +32,37 @@ #define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 19600U ///< Conductivity sensor reference resistance #define COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE 1000U ///< Conductivity sensor zero degree resistance -#define TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN 32U ///< Trimmer heater external temperature sensors gains +#define TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN 32U ///< Trimmer heater external temperature sensors gain #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 PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_CONVERSION_COEFF 0.25 ///< Primary heater internal temperature sensor conversion coefficient +#define TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_CONVERSION_COEFF 0.25 ///< Trimmer heater internal temperature sensor 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 #define TEMP_EQUATION_COEFF_A (3.9083 * pow(10,-3)) ///< ADC to temperature conversion coefficient A #define TEMP_EQUATION_COEFF_B (-5.775 * pow(10,-7)) ///< ADC to temperature conversion coefficient B -#define MAX_NUM_OF_RAW_ADC_SAMPLES 20U ///< Number of ADC reads for moving average calculations +#define MAX_NUM_OF_RAW_ADC_SAMPLES 20U ///< Number of ADC reads for moving average calculations #define ADC_READ_FIRST_READ_INDEX 0U ///< ADC array first ADC read index -#define ADC_READ_NEXT_INDEX_INDEX 0U ///< ADC array next insertion index -#define ADC_READ_RUNNING_SUM_INDEX 1U ///< ADC array running sum index +#define ADC_READ_NEXT_INDEX_INDEX 0U ///< ADC array next insertion index +#define ADC_READ_RUNNING_SUM_INDEX 1U ///< ADC array running sum index -#define ADC_READ_GAIN_INDEX 0U ///< ADC array gain index -#define ADC_READ_REF_RESISTANCE_INDEX 1U ///< ADC array reference resistances index -#define ADC_READ_0_DEG_RESISTANCE_INDEX 2U ///< ADC array zero degree resistance index +#define ADC_READ_GAIN_INDEX 0U ///< ADC array gain index +#define ADC_READ_REF_RESISTANCE_INDEX 1U ///< ADC array reference resistances index +#define ADC_READ_0_DEG_RESISTANCE_INDEX 2U ///< ADC array zero degree resistance index #define MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS 2U ///< Maximum allowed temperature delta between sensors -#define INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX 0U ///< Input primary heater temperature sensor index -#define OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX 1U ///< Output primary heater temperature sensor index -#define CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX 2U ///< Conductivity sensor 1 temperature sensor index -#define CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX 3U ///< Conductivity sensor 2 temperature sensor index -#define OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX 4U ///< Output redundancy temperature sensor index -#define INPUT_DIALYSATE_TEMP_SENSOR_INDEX 5U ///< Input dialysate temperature sensor index -#define PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX 6U ///< Primary heater internal temperature sensor index -#define TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX 7U ///< Trimmer heater internal temperature sensor index +#define NUM_OF_RUNNING_SUM_AND_INDEX_ARRAY_COLUMNS 2U ///< Number of columns in running sum and index array +#define NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS 3U ///< Number of columns in temperature sensors constants +#define MAX_ALLOWED_UNCHANGED_READS 4U ///< Maximum number of times that the read of a sensor cannot change + /// Temperature sensor self test states typedef enum tempSensors_Self_Test_States { @@ -78,22 +81,34 @@ NUM_OF_TEMPSENSORS_EXEC_STATES, ///< Total number of exec states } TEMPSENSORS_EXEC_STATES_T; -static SELF_TEST_STATUS_T tempSensorsSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; ///< Self test result of the TemperatureSensors module -static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; ///< TemperatureSensor self test state -static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; ///< TemperatureSensor exec state +/// FPGA error and read counts +typedef struct +{ + U08 RTDErrorCount; ///< RTD error count (include all 4 conductivity and temperature sensors) + U08 RTDReadCount; ///< RTD read count (include all 4 conductivity and temperature sensors) + U08 TRoErrorCount; ///< THDo (outlet redundant temperature sensor) error count + U08 TRoReadCount; ///< THDo (outlet redundant temperature sensor) read count + U08 TDiErrorCount; ///< TDi (inlet dialysate) temperature sensor error count + U08 TDiReadCount; ///< TDi (inlet dialysate) temperature sensor read count + U08 primaryHeaterFlags; ///< Primary heater internal temperature sensor error flags + U08 primaryHeaterReadCount; ///< Primary heater internal temperature sensor read count + U08 trimmerHeaterFlags; ///< Trimmer heater internal temperature sensor error flags + U08 trimmerHeaterReadCount; ///< Trimmer heater internal temperature sensor read count +} FPGA_READ_AND_ERROR_COUNTS_T; -static U32 rawADCReads [ NUM_OF_TEMPERATURE_SENSORS ] [ MAX_NUM_OF_RAW_ADC_SAMPLES ]; ///< Number of ADC reads + the running sum +static SELF_TEST_STATUS_T tempSensorsSelfTestResult; ///< Self test result of the TemperatureSensors module +static TEMPSENSORS_SELF_TEST_STATES_T tempSensorsSelfTestState; ///< TemperatureSensor self test state +static TEMPSENSORS_EXEC_STATES_T tempSensorsExecState; ///< TemperatureSensor exec state +static U32 sampleCount; ///< Initial ADC read index until the array if filled up for the first time +static U32 rawADCReads [ NUM_OF_TEMPERATURE_SENSORS ] ///< Raw ADC reads array + [ MAX_NUM_OF_RAW_ADC_SAMPLES ]; +static U32 runningSumAndIndex [ NUM_OF_TEMPERATURE_SENSORS ] ///< Running sum and next ADC index array + [ NUM_OF_RUNNING_SUM_AND_INDEX_ARRAY_COLUMNS ]; +static U32 tempSensorsConstants [ NUM_OF_TEMPERATURE_SENSORS ] ///< Temperature sensors constants + [ NUM_OF_TEMP_SENSORS_CONSTANTS_ARRAY_COLUMNS ]; +static F32 avgADCReads [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors averaged ADC values +static FPGA_READ_AND_ERROR_COUNTS_T FPGAReadAndErrorCounts; -static U32 runningSumAndIndex [ NUM_OF_TEMPERATURE_SENSORS ] [ 2 ]; -static U32 tempSensorsConstants [ NUM_OF_TEMPERATURE_SENSORS ] [ 3 ]; -static F32 avgADCReads [ NUM_OF_TEMPERATURE_SENSORS ]; ///< Temperature sensors averaged ADC values - - -// Samples array -// constants array -// running sum and index array -static U32 sampleCount = 0; ///< Initial ADC read index until the array if filled up for the first time - // Private functions prototypes static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestStart ( void ); @@ -125,57 +140,37 @@ tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; sampleCount = 0; - - // Initializing the tempSensorADCReads with the reference values - for ( i = 0; i < 2; i++ ) + // Initialize TPi and TPo constants + for ( i = TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR; i < TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR; i++ ) { tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; } - for ( i = 2; i < 4; i++ ) + // Initialize TD1 and TD2 constants + for ( i = TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR; i < TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i++ ) { tempSensorsConstants [ i ] [ ADC_READ_GAIN_INDEX ] = COND_SENSORS_TEMP_SENSOR_GAIN; tempSensorsConstants [ i ] [ ADC_READ_REF_RESISTANCE_INDEX ] = COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE; tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE; } - for ( i = 4; i < 6; i++ ) + // Initialize TRo and TDi constants + for ( i = TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR; i < TEMPSENSORS_PRIMARY_HEATER_INTERNAL_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; tempSensorsConstants [ i ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; } - /*tempSensorsADCReads [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsADCReads [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsADCReads [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensorsADCReads [ OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsADCReads [ OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsADCReads [ OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - - tempSensorsADCReads [ CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsADCReads [ CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsADCReads [ CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - - tempSensorsADCReads [ CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsADCReads [ CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsADCReads [ CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - - tempSensorsRawADCReads [ OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsRawADCReads [ OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsRawADCReads [ OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - - tempSensorsRawADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN; - tempSensorsRawADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE; - tempSensorsRawADCReads [ INPUT_DIALYSATE_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE; - - tempSensorsRawADCReads [ PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsRawADCReads [ PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsRawADCReads [ PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0; - - tempSensorsRawADCReads [ TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_GAIN_INDEX ] = 0; - tempSensorsRawADCReads [ TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_REF_RESISTANCE_INDEX ] = 0; - tempSensorsRawADCReads [ TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] = 0;*/ + // 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; + // 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; } /************************************************************************* * @brief execTemperatureSensorsSelfTest @@ -218,6 +213,7 @@ tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_COMPLETE; break; } + return tempSensorsSelfTestResult; } /************************************************************************* @@ -253,13 +249,85 @@ break; } } - -F32 getTPiTemperatureValue ( void ) +/************************************************************************* + * @brief getTemperatureValue + * The getTemperatureValue function gets the enum of the requested + * temperature sensor, converts the ADC of it to temperature in degree C + * and returns the temperature + * @details + * Inputs : TEMPERATURE_SENSORS_T (sensor) + * Outputs : F32 (temperature in deg C) + * @param none + * @return F32 (temperature in deg C) + *************************************************************************/ +F32 getTemperatureValue ( TEMPERATURE_SENSORS_T sensor ) { - F32 adc = avgADCReads [ INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX ]; - F32 temperature = getADC2TempConversion ( adc, PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN, - PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, - PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE ); + F32 temperature; + switch ( sensor ) + { + case TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR: + + temperature = getADC2TempConversion ( avgADCReads [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ], + tempSensorsConstants [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + break; + + case TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR: + + temperature = getADC2TempConversion ( avgADCReads [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ], + tempSensorsConstants [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + break; + + case TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR: + + temperature = getADC2TempConversion ( avgADCReads [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + break; + + case TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR: + + temperature = getADC2TempConversion ( avgADCReads [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + break; + + case TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR: + + temperature = getADC2TempConversion ( avgADCReads [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ], + tempSensorsConstants [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + break; + + case TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR: + + temperature = getADC2TempConversion ( avgADCReads [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ], + tempSensorsConstants [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ] [ ADC_READ_GAIN_INDEX ], + tempSensorsConstants [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ] [ ADC_READ_REF_RESISTANCE_INDEX ], + tempSensorsConstants [ TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); + break; + + case TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR: + + temperature = avgADCReads [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ] * PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_CONVERSION_COEFF; + break; + + case TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR: + + temperature = avgADCReads [ TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ] * TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_CONVERSION_COEFF; + break; + + default: + // ToDo: Warning? + break; + } + return temperature; } @@ -279,8 +347,8 @@ { //R(RTD) = R(ref) * (adc – 2^N-1) / (G *2^N-1); F32 resistance = (refResistance * (avgADC - pow(2,(TEMP_SENSORS_ADC_BITS - 1)))) / (gain * pow(2,(TEMP_SENSORS_ADC_BITS - 1))); - // For testing in a separate workspace, loop through and do the equation, disable Irq and Fiq and enable Irq and - // get the mstimer() + // TODO For testing in a separate workspace, loop through and do the equation, disable Irq and dont disable Fiq and enable Irq and get the mstimer() + // comment you initiProcessor in main. //T=(-A+√(A^2-4B(1-R_T/R_0 )))/2B F32 secondSqrtPart = 4 * TEMP_EQUATION_COEFF_B * (1 - (resistance / zeroDegResistance)); F32 temperature = (-TEMP_EQUATION_COEFF_A + sqrt(pow(TEMP_EQUATION_COEFF_A, 2) - secondSqrtPart)) / (2 * TEMP_EQUATION_COEFF_B); @@ -300,16 +368,19 @@ *************************************************************************/ static void processADCRead ( U32 sensorIndex, U32 adc ) { + // Update the values in the folders U32 index = runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ]; U32 runningSum = runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ]; U32 indexValue = rawADCReads [ sensorIndex ] [ index ]; U32 nextIndex = INC_WRAP( index, ADC_READ_FIRST_READ_INDEX, MAX_NUM_OF_RAW_ADC_SAMPLES - 1 ); - runningSum = runningSum - indexValue + adc; + runningSum = runningSum - indexValue + adc; rawADCReads [ sensorIndex ] [ index ] = adc; runningSumAndIndex [ sensorIndex ] [ ADC_READ_NEXT_INDEX_INDEX ] = nextIndex; runningSumAndIndex [ sensorIndex ] [ ADC_READ_RUNNING_SUM_INDEX ] = runningSum; + // If the buffer array is being filled for the first time, the number of samples + // are changing. When the array is filled up completely, max number of samples are used if ( sampleCount < MAX_NUM_OF_RAW_ADC_SAMPLES ) { sampleCount++; @@ -318,9 +389,7 @@ { sampleCount = MAX_NUM_OF_RAW_ADC_SAMPLES; } - // TODO Remove this code FOR TESTING - F32 test = runningSum / sampleCount; - // TODO Remove this code FOR TESTING + // Calculate average avgADCReads [ sensorIndex ] = runningSum / sampleCount; } /************************************************************************* @@ -335,7 +404,7 @@ *************************************************************************/ static TEMPSENSORS_SELF_TEST_STATES_T handleSelfTestStart ( void ) { - return TEMPSENSORS_SELF_TEST_START; + return TEMPSENSORS_SELF_TEST_ADC_CHECK; } /************************************************************************* * @brief handleSelfTestADCCheck @@ -359,7 +428,7 @@ if ( avgADC > TEMP_SENSORS_ADC_MAX_COUNT ) { - //TODO error for ADC out of range + SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_OUT_OF_RANGE, TEMPSENSORS_SELF_TEST_ADC_CHECK ); } } @@ -385,16 +454,17 @@ F32 tempBuffer [ NUM_OF_TEMPERATURE_SENSORS ]; F32 temperature; - for ( k = 0; k < sizeof(tempBuffer); k++) + // Convert the ADCs to temperature for this test + for ( k = 0; k < sizeof(tempBuffer); k++ ) { temperature = getADC2TempConversion ( avgADCReads [ k ], tempSensorsConstants [ k ] [ ADC_READ_GAIN_INDEX ], tempSensorsConstants [ k ] [ ADC_READ_REF_RESISTANCE_INDEX ], tempSensorsConstants [ k ] [ ADC_READ_0_DEG_RESISTANCE_INDEX ] ); tempBuffer [ k ] = temperature; } - - + // Check if all the sensors are within a certain degree c + // from each other for ( i = 0; i < sizeof(tempBuffer); i++ ) { for ( j = 0; j < sizeof(tempBuffer); j++ ) @@ -405,7 +475,7 @@ } if ( largestDelta > MAX_ALLOWED_TEMP_DELTA_BETWEEN_SENSORS ) { - // TODO Error + SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT, TEMPSENSORS_SELF_TEST_CONSISTENCY_CHECK ); } } } @@ -423,23 +493,7 @@ *************************************************************************/ static TEMPSENSORS_EXEC_STATES_T handleExecStart ( void ) { - TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; - - // TODO FOR TESTING, REMOVE THIS CODE - /*if ( tempSensorsSelfTestState == TEMPSENSORS_SELF_TEST_COMPLETE ) - { - U32 testADC = 16327313; - - //F32 temp = getADC2TempConversion ( testADC, TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN, TRIMMER_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, - // TRIMMER_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE); - - F32 temp = getADC2TempConversion ( testADC, PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN, PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, - PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE); - - state = TEMPSENSORS_EXEC_STATE_READ_SENSORS; - }*/ - // TODO REMOVE THE ABOVE CODE - return state; + return TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; } /************************************************************************* * @brief handleExecGetADCValues @@ -458,28 +512,53 @@ // Need to remember the fpga counter and if it has not changed increment another counter and // zero it if it changed. if it is above a certain number throw fault // error counter from fpga same as above remember, if it is incremented: - // // 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( INPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX, getFPGATPiTemp() ); - processADCRead( OUTPUT_PRIMARY_HEATER_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); - // TODO Updated the get functions from FPGA - processADCRead( CONDUCTIVITY_SENSOR_1_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); - processADCRead( CONDUCTIVITY_SENSOR_2_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); - processADCRead( OUTPUT_REDUNDANCY_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); - processADCRead( INPUT_DIALYSATE_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); - processADCRead( PRIMARY_HEATER_INTERNAL_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); - processADCRead( TRIMMER_HEATER_INTERNAL_TEMP_SENSOR_INDEX, getFPGATPoTemp() ); + /*processADCRead( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp() ); + processADCRead( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPoTemp() ); + processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR, getFPGACD1Temp() ); + processADCRead( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR, getFPGACD2Temp() ); + processADCRead( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR, getFPGATHDoTemp() ); + processADCRead( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR, getFPGATDiTemp() ); + processADCRead( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, getFPGAPrimaryHeaterTemp() ); + processADCRead( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, getFPGATrimmerHeaterTemp() );*/ // TODO REMOVE THIS CODE. FOR TESTING ONLY + /*U32 i; + U32 adc = 16327313; + U32 size = 800; + F32 testTemperature[800]; + _disable_IRQ(); + U32 testTimer = getMSTimerCount(); + + for ( i = 0; i < size; i++ ) + { + testTemperature[i] = getADC2TempConversion (adc, PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN, + PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE, + PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE); + adc = adc + 150; + } + U32 elapsedTime = calcTimeSince( testTimer ); + _enable_IRQ();*/ + + + U08 dara; U32 test [20] = {16327313, 16330313, 16333313, 16336313, 16339313, 16342313, 16345313, 16348313, 16351313, 16354313, 16357313, 16360313, 16363313, 16366313, 16369313, 16372313, 16375313, 16378313, 16381313, 16384313}; - U08 i; - for ( i = 0; i