Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rb00abccd173d0c989ab8d352366dba108f5e8827 -r801cb7a69212006b2572a91456b6b36ac3232392 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision b00abccd173d0c989ab8d352366dba108f5e8827) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 801cb7a69212006b2572a91456b6b36ac3232392) @@ -416,14 +416,18 @@ static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestStart ( void ) { // Code temporarily disabled since POST is not tested yet + // TODO once POST is tested and implemented, remove #ifndef +#ifndef _VECTORCAST_ heatersSelfTestResult = SELF_TEST_STATUS_PASSED; return HEATERS_SELF_TEST_COMPLETE; - /*heatersSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; +#else + heatersSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; setSmallPrimaryHeaterPWM ( SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE ); setTrimmerHeaterPWM ( TRIMMER_HEATER_MAX_DUTY_CYCLE ); selfTestElapsedTime = getMSTimerCount(); - return HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS;*/ + return HEATERS_SELF_TEST_SMALL_PRIMARY_AND_TRIMMER_HEATERS; +#endif } /*********************************************************************//** @@ -851,8 +855,6 @@ getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION_TEMP_SENSOR ), getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR), getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE_TEMP_SENSOR));*/ - - sprintf( debugTempStr, "TPo: %6.2f, PriCJ: %6.2f, PriTC: %6.2f, TpriInt: %6.2f, TRo: %6.2f, TriCJ: %6.2f, TriTC: %6.2f, TtriInt: %6.2f\r\n", getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ), getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION_TEMP_SENSOR ), Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -rb00abccd173d0c989ab8d352366dba108f5e8827 -r801cb7a69212006b2572a91456b6b36ac3232392 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision b00abccd173d0c989ab8d352366dba108f5e8827) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 801cb7a69212006b2572a91456b6b36ac3232392) @@ -21,6 +21,8 @@ #include "Timers.h" #include "TaskPriority.h" +#include "FPGA.h" + /** * @addtogroup TemperatureSensors * @{ @@ -46,7 +48,7 @@ #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 32U ///< Number of ADC reads for moving average calculations #define ADC_READ_FIRST_READ_INDEX 0U ///< ADC array first ADC read index @@ -87,6 +89,9 @@ #define K_THERMOCOUPLE_TEMP_2_MILLI_VOLT_CONVERSION_COEFF 0.041276 ///< K thermocouple temperature to millivolt conversion coefficient +#define SHIFT_BITS_BY_5_FOR_AVERAGING 5U ///< Shift the ADCs of the temperature sensors by 5 to average them +#define SIZE_OF_THERMOCOUPLE_COEFFICIENTS 10U ///< Size of the thermocouple coefficients + #define THERMOCOUPLE_POSITIVE_TEMP_C_0 (-0.176004136860 * pow(10,-1)) ///< K TC positive temperature C0 coefficient #define THERMOCOUPLE_POSITIVE_TEMP_C_1 (0.389212049750 * pow(10,-1)) ///< K TC positive temperature C1 coefficient #define THERMOCOUPLE_POSITIVE_TEMP_C_2 (0.185587700320 * pow(10,-4)) ///< K TC positive temperature C2 coefficient @@ -136,7 +141,6 @@ 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 S32 rawADCReads [ NUM_OF_TEMPERATURE_SENSORS ] [ MAX_NUM_OF_RAW_ADC_SAMPLES ]; ///< Raw ADC reads array static S32 runningSumAndIndex [ NUM_OF_TEMPERATURE_SENSORS ] @@ -157,13 +161,15 @@ static const F32 positiveTCExpA1 = -0.118343200000E-3; ///< K TC positive temperature exponent coefficient A1 static const F32 positiveTCExpA2 = 0.126968600000E3; ///< K TC positive temperature exponent coefficient A2 -static const F32 positiveTCCoeffs [10] = { -0.176004136860E-1, 0.389212049750E-1, +static const F32 positiveTCCoeffs [ SIZE_OF_THERMOCOUPLE_COEFFICIENTS ] = { + -0.176004136860E-1, 0.389212049750E-1, 0.185587700320E-4, -0.994575928740E-7, 0.318409457190E-9, -0.560728448890E-12, - 0.560750590590E-15, -0.320207200030E-18, - 0.971511471520E-22, -0.121047212750E-25 }; ///< Thermocouple correction coefficients for positive cold junction temperature + 0.560750590590E-15,-0.320207200030E-18, + 0.971511471520E-22,-0.121047212750E-25 }; ///< Thermocouple correction coefficients for positive cold junction temperature -static const F32 positiveTCInverserCoeffs [10] = { 0.0, 2.508355E1, 7.860106E-2, -2.503131E-1, 8.315270E-2, +static const F32 positiveTCInverserCoeffs [ SIZE_OF_THERMOCOUPLE_COEFFICIENTS ] = { + 0.0, 2.508355E1, 7.860106E-2, -2.503131E-1, 8.315270E-2, -1.228034E-2, 9.804036E-4, -4.413030E-5, 1.057734E-6, -1.052755E-8 }; ///< Thermcouple inverse coefficient for positive cold junction temperature @@ -203,7 +209,6 @@ U08 i; tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; - sampleCount = 0; elapsedTime = 0; internalHeatersConversionTimer = 0; dataPublicationTimerCounter = 0; @@ -407,60 +412,33 @@ *************************************************************************/ static void getHeaterInternalTemp ( U32 TCIndex, U32 CJIndex ) { - U08 i; - F32 temperature; - F32 equiVoltage; - F32 correctedVoltage; + F32 temperature = 0.0; + F32 equiVoltage = 0.0; + F32 correctedVoltage = 0.0; 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; + U08 i; if ( CJTemp > 0 ) { - for ( i = 0; i < 10; i++ ) + for ( i = 0; i < SIZE_OF_THERMOCOUPLE_COEFFICIENTS; i++ ) { equiVoltage = equiVoltage + ( positiveTCCoeffs [ i ] * pow(CJTemp, i) ); } - equiVoltage = equiVoltage + ( positiveTCExpA0 * ( exp(positiveTCExpA1 * pow((CJTemp - positiveTCExpA2), i)) ) ); + equiVoltage = equiVoltage + ( positiveTCExpA0 * ( exp(positiveTCExpA1 * pow((CJTemp - positiveTCExpA2), 2)) ) ); correctedVoltage = rawVoltage + equiVoltage; - for ( i = 0; i < 10; i++ ) + for ( i = 0; i < SIZE_OF_THERMOCOUPLE_COEFFICIENTS; i++ ) { temperature = temperature + ( positiveTCInverserCoeffs [ i ] * pow(correctedVoltage, i) ); } } - // 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_THERMO_COUPLE_TEMP_SENSOR ) { temperatureValues [ TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP ].data = temperature; @@ -551,7 +529,9 @@ static BOOL isADCReadValid ( U32 sensorIndex, U32 fpgaError, U32 fpgaCount ) { BOOL isADCValid = FALSE; +#ifndef _VECTORCAST_ isADCValid = TRUE; // TODO remove this line. Temporary set to true until FPGA error count is fixed +#endif U32 previousReadCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ]; if ( fpgaError != 0 ) @@ -610,18 +590,8 @@ 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++; - } - else - { - sampleCount = MAX_NUM_OF_RAW_ADC_SAMPLES; - } - // Calculate average - F32 avgADCReads = runningSum / sampleCount; + // Calculate the average + F32 avgADCReads = runningSum >> SHIFT_BITS_BY_5_FOR_AVERAGING; F32 temperature = getADC2TempConversion ( avgADCReads, (U32)tempSensorsConstants [ sensorIndex ] [ ADC_READ_GAIN_INDEX ], @@ -791,6 +761,7 @@ SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE, inletTemperature ); } } + // Check if time has elapsed to calculate the internal temperature of the heaters if ( internalHeatersConversionTimer >= HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL ) { getHeaterInternalTemp ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE_TEMP_SENSOR, Index: firmware/App/Services/FPGA.h =================================================================== diff -u -re071a6ac6e8fe7a729730b90334af153afe97817 -r801cb7a69212006b2572a91456b6b36ac3232392 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision e071a6ac6e8fe7a729730b90334af153afe97817) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 801cb7a69212006b2572a91456b6b36ac3232392) @@ -75,4 +75,5 @@ U16 getFPGAPRimaryColdJunctionTemp ( void ); U16 getFPGATrimmerColdJunctionTemp ( void ); + #endif