Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r1b01b8c723dd1b04943e07eeda9e369b6d8e4afe -r984a7f458ebbd83f565480d2abc7126471d2dde9 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 1b01b8c723dd1b04943e07eeda9e369b6d8e4afe) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 984a7f458ebbd83f565480d2abc7126471d2dde9) @@ -39,9 +39,7 @@ #define TRIMMER_HEATER_P_COEFFICIENT 0.02 ///< Trimmer heater proportional coefficient #define TRIMMER_HEATER_I_COEFFICIENT 0.001 ///< Trimmer heater integral coefficient -#define DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION 0.05 ///< Delta temperature to PWM duty cycle conversion (initial guess) #define CONTROLLER_CHECK_INTERVAL_COUNT 10U ///< Time interval count to check the PI controller - #define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count /// Heaters self test enums @@ -571,14 +569,14 @@ if ( heater == PRIMARY_HEATER ) { F32 inletTemperatrue = getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ); - mainPrimaryHeaterDutyCycle = fabs(primaryHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; - resetPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, mainPrimaryHeaterDutyCycle ); + //mainPrimaryHeaterDutyCycle = fabs(primaryHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; + resetPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ); } else if ( heater == TRIMMER_HEATER ) { F32 inletTemperatrue = getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ); - trimmerHeaterDutyCycle = fabs(trimmerHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; - resetPIController ( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterDutyCycle ); + //trimmerHeaterDutyCycle = fabs(trimmerHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; + resetPIController ( PI_CONTROLLER_ID_TRIMMER_HEATER, SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE ); } } @@ -598,7 +596,6 @@ { #ifdef DEBUG_ENABLED { - F32 flow = (F32)(10909.0909/getFPGAROPumpFlowRate()); 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", Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r1b01b8c723dd1b04943e07eeda9e369b6d8e4afe -r984a7f458ebbd83f565480d2abc7126471d2dde9 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 1b01b8c723dd1b04943e07eeda9e369b6d8e4afe) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 984a7f458ebbd83f565480d2abc7126471d2dde9) @@ -18,10 +18,7 @@ #include "TemperatureSensors.h" #include "FPGA.h" #include "SystemCommMessages.h" - -// TODO: For testing only REMOVE #include "Timers.h" -// TODO: For testing only REMOVE //TODO change the incoming water for ranges @@ -73,7 +70,11 @@ #define EXTERNAL_TEMP_SENSORS_ERROR_VALUE 0x80 ///< External temperature sensors error value #define HEATERS_INTERNAL_TEMP_SENSOR_FAULT 0x01 ///< Heaters internal temperature sensor fault -#define SHIFT_BITS_BY_2 2U ///< Shift bits by 2 TODO add to AE +#define SHIFT_BITS_BY_2 2U ///< Shift bits by 2 TODO add to AE +#define MIN_WATER_INPUT_TEMPERATURE 10U ///< Minimum water input temperature TODO add to AE +#define MAX_WATER_INPUT_TEMPERATURE 40U ///< Maximum water input temperature TODO add to AE +#define ADC_FPGA_READ_DELAY 30U ///< Delay in ms before reading the ADC values from FPGA TODO add to AE +#define INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL 100U ///< Time interval that is used to check the input water TODO add to AE /// Temperature sensor self test states typedef enum tempSensors_Self_Test_States @@ -109,6 +110,7 @@ static F32 temperatureValues [ NUM_OF_TEMPERATURE_SENSORS ]; static U32 readAndErrorCounts [ NUM_OF_TEMPERATURE_SENSORS ] [ NUM_OF_READ_AND_ERROR_ARRAY_COLUMNS ]; +static U32 elapsedTime; ///< Elapsed time // Private functions prototypes @@ -140,6 +142,7 @@ tempSensorsSelfTestState = TEMPSENSORS_SELF_TEST_START; tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; sampleCount = 0; + elapsedTime = 0; // Initialize TPi and TPo constants for ( i = TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR; i < TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR; i++ ) @@ -391,14 +394,8 @@ // It is a heaters temperature sensor else { - //U16 test = (U16)adc; - //test = test << 2; - //S16 temperatureTemp = ( (S16)test ) >> 2; - U16 adcConv = ( (U16)adc ) << SHIFT_BITS_BY_2; convertedADC = ( (S16)adcConv ) >> SHIFT_BITS_BY_2; - - F32 temperatureTemp2 = (F32)convertedADC * HEATERS_INTERNAL_ADC_TO_TEMP_CONVERSION_COEFF; } U32 previousReadCount = readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ]; @@ -411,14 +408,14 @@ } else { - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; + readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = internalErrorCount++; } //isADCValid = FALSE; } else if ( fpgaCount > previousReadCount ) { - readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; + readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_PREV_FPGA_COUNT_INDEX ] = fpgaCount; readAndErrorCounts [ sensorIndex ] [ READ_AND_ERROR_INTERNAL_ERROR_COUNT_INDEX ] = 0; isADCValid = TRUE; } @@ -556,7 +553,19 @@ *************************************************************************/ static TEMPSENSORS_EXEC_STATES_T handleExecStart ( void ) { - return TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; + TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_START; + + if ( elapsedTime == 0 ) + { + elapsedTime = getMSTimerCount(); + } + else if ( didTimeout( elapsedTime, ADC_FPGA_READ_DELAY ) ) + { + elapsedTime = 0; + state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; + } + + return state; } /************************************************************************* * @brief handleExecGetADCValues @@ -571,11 +580,6 @@ { TEMPSENSORS_EXEC_STATES_T state = TEMPSENSORS_EXEC_STATE_GET_ADC_VALUES; - // Check the read count for a change before inserting - // 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( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR, getFPGATPiTemp(), getFPGARTDErrorCount(), getFPGARTDReadCount() ); @@ -587,5 +591,19 @@ processADCRead( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR, getFPGAPrimaryHeaterTemp(), 0, 0 ); processADCRead( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR, getFPGATrimmerHeaterTemp(), 0, 0 ); + if ( elapsedTime == 0 ) + { + elapsedTime = getMSTimerCount(); + } + else if ( didTimeout( elapsedTime, INPUT_WATER_TEMPERATURE_CHECK_TIME_INTERVAL ) ) + { + elapsedTime = 0; + F32 inletTemperature = temperatureValues [ TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ]; + 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 ); + } + } + return state; }