Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r3a371ac06b79d024d7fe1607f003031eb9322ba4 -r4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 3a371ac06b79d024d7fe1607f003031eb9322ba4) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 4b9ae4e44d44ee6577fec4c8b75aa160fea04cc7) @@ -88,7 +88,7 @@ HEATERS_STATE_T state; ///< Heater state. BOOL startHeaterSignal; ///< Heater start indication flag. BOOL isHeaterOn; ///< Heater on/off status flag. - F32 dutyCycle; ///< Heater duty cycle. + OVERRIDE_F32_T dutyCycle; ///< Heater duty cycle. F32 targetFlow; ///< Heater target flow. BOOL hasTargetTempChanged; ///< Heater target temperature change flag indicator. F32 heaterEstGain; ///< Heater estimation gain during the run. @@ -116,6 +116,7 @@ static F32 calculatePrimaryHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); static F32 calculateTrimmerHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); static BOOL haveHeaterControlConditionsChanged( DG_HEATERS_T heater ); +static F32 getHeaterDutyCycle( DG_HEATERS_T heater ); static void setMainPrimaryHeaterPWM( F32 pwm ); static void setSmallPrimaryHeaterPWM( F32 pwm ); @@ -142,7 +143,10 @@ heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; heatersStatus[ heater ].startHeaterSignal = FALSE; heatersStatus[ heater ].isHeaterOn = FALSE; - heatersStatus[ heater ].dutyCycle = 0.0F; + heatersStatus[ heater ].dutyCycle.data = 0.0F; + heatersStatus[ heater ].dutyCycle.ovData = 0.0F; + heatersStatus[ heater ].dutyCycle.ovInitData = 0.0F; + heatersStatus[ heater ].dutyCycle.override = 0; heatersStatus[ heater ].targetFlow = 0.0F; heatersStatus[ heater ].hasTargetTempChanged = FALSE; heatersStatus[ heater ].heaterEstGain = HEATERS_NEUTRAL_EST_GAIN; @@ -413,7 +417,7 @@ #endif { F32 heaterEstGain = heatersStatus[ heater ].heaterEstGain; - F32 heaterDutyCycle = heatersStatus[ heater ].dutyCycle; + F32 heaterDutyCycle = heatersStatus[ heater ].dutyCycle.data; F32 lastFillTemperature = getAvgFillTemperature(); F32 primaryTargetTemperature = heatersStatus[ heater ].targetTemp; BOOL isTempUnderTarget = ( lastFillTemperature < primaryTargetTemperature ? TRUE : FALSE ); @@ -630,7 +634,7 @@ } else { - dutyCycle = heatersStatus[ heater ].dutyCycle; + dutyCycle = heatersStatus[ heater ].dutyCycle.data; } state = HEATER_EXEC_STATE_TRIMMER_CONTROL_TO_TARGET; @@ -702,7 +706,7 @@ F32 targetFlowLPM = heatersStatus[ heater ].targetFlow; F32 dutyCycle = calculateTrimmerHeaterDutyCycle( targetTemperature, outletRedundantTemperature, targetFlowLPM, TRUE ); - tempDutyCycle = heatersStatus[ heater ].dutyCycle + dutyCycle; + tempDutyCycle = heatersStatus[ heater ].dutyCycle.data + dutyCycle; tempDutyCycle = MIN( tempDutyCycle, HEATERS_MAX_DUTY_CYCLE ); tempDutyCycle = MAX( tempDutyCycle, HEATERS_MIN_DUTY_CYCLE ); @@ -725,17 +729,20 @@ { if ( heater < NUM_OF_DG_HEATERS ) { + F32 duty; + + heatersStatus[ heater ].dutyCycle.data = pwm; + duty = getHeaterDutyCycle( heater ); + if ( DG_PRIMARY_HEATER == heater ) { - setMainPrimaryHeaterPWM( pwm ); - setSmallPrimaryHeaterPWM( pwm ); + setMainPrimaryHeaterPWM( duty ); + setSmallPrimaryHeaterPWM( duty ); } else if ( DG_TRIMMER_HEATER == heater ) { - setTrimmerHeaterPWM( pwm ); + setTrimmerHeaterPWM( duty ); } - - heatersStatus[ heater ].dutyCycle = pwm; } else { @@ -831,6 +838,20 @@ /*********************************************************************//** * @brief + * The getHeaterDutyCycle function returns the heater's duty cycle. + * @details Inputs: heaterStatus + * @param heater: The heater Id that its on state is handled + * @return duty cycle + *************************************************************************/ +static F32 getHeaterDutyCycle( DG_HEATERS_T heater ) +{ + F32 duty = getF32OverrideValue( &heatersStatus[ heater ].dutyCycle ); + + return duty; +} + +/*********************************************************************//** + * @brief * The setMainPrimaryHeaterPWM function sets the PWM of the main primary heater. * @details Inputs: none * @details Outputs: Sets the PWM duty cycle for the main primary heater @@ -908,9 +929,9 @@ // The duty cycle of the primary heater is divided into 2 parts and is applied to main // and small primary heaters. So they are always the same. - data.mainPrimayHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; - data.smallPrimaryHeaterDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; - data.trimmerHeaterDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle * FRACTION_TO_PERCENT_FACTOR; + data.mainPrimayHeaterDC = getHeaterDutyCycle( DG_PRIMARY_HEATER ) * FRACTION_TO_PERCENT_FACTOR; + data.smallPrimaryHeaterDC = getHeaterDutyCycle( DG_PRIMARY_HEATER ) * FRACTION_TO_PERCENT_FACTOR; + data.trimmerHeaterDC = getHeaterDutyCycle( DG_TRIMMER_HEATER ) * FRACTION_TO_PERCENT_FACTOR; data.primaryTargetTemp = heatersStatus[ DG_PRIMARY_HEATER ].targetTemp; data.trimmerTargetTemp = heatersStatus[ DG_TRIMMER_HEATER ].targetTemp; data.primaryHeaterState = heatersStatus[ DG_PRIMARY_HEATER ].state; @@ -939,9 +960,9 @@ F32 trimmerVoltage = getMonitoredLineLevel( MONITORED_LINE_24V_GND_TRIM_HTR_V ); // Voltage to PWM is reverse. If PWM = 0 -> V = 24V - F32 mainPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle; - F32 smallPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle; - F32 trimmerDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle; + F32 mainPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data; + F32 smallPriDC = heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data; + F32 trimmerDC = heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data; // The expected voltage is the inverse of the duty cycle F32 mainPriExpectedVoltage = HEATERS_MAX_OPERATING_VOLTAGE_V * ( 1.0F - mainPriDC ); @@ -997,11 +1018,58 @@ /*********************************************************************//** * @brief + * The testSetHeaterDutyCycleOverride function overrides the specified heater's + * duty cycle. + * @details Inputs: heatersStatus + * @details Outputs: heatersStatus + * @return TRUE if the override was successful otherwise FALSE + *************************************************************************/ +BOOL testSetHeaterDutyCycleOverride( U32 heater, F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + if ( ( value >= HEATERS_MIN_DUTY_CYCLE ) && ( value <= HEATERS_MAX_DUTY_CYCLE ) ) + { + result = TRUE; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovData = value; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.override = OVERRIDE_KEY; + } + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetHeaterDutyCycleOverride function resets the heater's + * duty cycle overridden value. + * @details Inputs: heatersStatus + * @details Outputs: heatersStatus + * @return TRUE if the reset was successful otherwise, FALSE + *************************************************************************/ +BOOL testResetHeaterDutyCycleOverride( U32 heater ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.override = OVERRIDE_RESET; + heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovData = heatersStatus[ (DG_HEATERS_T)heater ].dutyCycle.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The testSetHeatersPublishIntervalOverride function overrides the heaters * publish data time interval. * @details Inputs: heatersDataPublishInterval * @details Outputs: heatersDataPublishInterval - * @return result + * @return TRUE if the override was successful otherwise *************************************************************************/ BOOL testSetHeatersPublishIntervalOverride( U32 value ) { @@ -1025,7 +1093,7 @@ * publish time interval to its previous time interval. * @details Inputs: heatersDataPublishInterval * @details Outputs: heatersDataPublishInterval - * @return result + * @return TRUE if the reset was successful otherwise, FALSE *************************************************************************/ BOOL testResetHeatersPublishIntervalOverride( void ) {