Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -rcc4f8440e8ad7fa8f2ced2467d922be7422c344c -rba4b62be88b1a12ff5cd9cc68624302fe4f608a4 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision cc4f8440e8ad7fa8f2ced2467d922be7422c344c) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision ba4b62be88b1a12ff5cd9cc68624302fe4f608a4) @@ -7,8 +7,8 @@ * * @file Fans.c * -* @author (last) Dara Navaei -* @date (last) 03-Mar-2022 +* @author (last) Darren Cox +* @date (last) 10-Mar-2022 * * @author (original) Dara Navaei * @date (original) 04-Aug-2021 @@ -33,28 +33,28 @@ // ********** private definitions ********** -#define FANS_MIN_DUTY_CYCLE 0.1 ///< Fans min PWM. -#define FANS_MAX_DUTY_CYCLE 0.95 ///< Fans max PWM. +#define FANS_MIN_DUTY_CYCLE 0.1F ///< Fans min PWM. +#define FANS_MAX_DUTY_CYCLE 0.95F ///< Fans max PWM. #define MIN_ALLOWED_AMBIENT_TEMPERATURE 20 ///< Min allowed ambient temperature. #define MAX_ALLOWED_AMBINET_TEMPERATURE 70 ///< Max allowed ambient temperature. -#define FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE 0.3 ///< Fans max allowed ramp up PWM change. -#define FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE 0.005 ///< Fans min allowed ramp down PWM change. +#define FANS_MAX_ALLOWED_RAMP_UP_DELTA_DUTY_CYCLE 0.3F ///< Fans max allowed ramp up PWM change. +#define FANS_MAX_ALLOWED_RAMP_DOWN_DELTA_DUTY_CYCLE 0.005F ///< Fans min allowed ramp down PWM change. -#define TOGGLE_PERIOD_RESOLUTION_SECONDS 0.0000025 ///< FPGA fans toggle period resolution in micro seconds. +#define TOGGLE_PERIOD_RESOLUTION_SECONDS 0.0000025F ///< FPGA fans toggle period resolution in micro seconds. #define ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION 4 ///< FPGA rotational to toggle period conversion coefficient. #define FANS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Fans publish data time interval in counts. #define FANS_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Fans control time interval in counts. #define FANS_ZERO_RPM_TOGGLE_PERIOD_VALUE 0xFFFF ///< Fans zero RPM toggle period value. #define MIN_TARGET_RPM_IN_SELF_TEST 1000 ///< Fans min target RPM that they should be during POST. #define FANS_SELF_TEST_WAIT_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Fans self test wait time for the fans to get to RPM. -#define FANS_SELF_TEST_TARGET_PWM 0.5 ///< Fans self test target PWM for testing the fans are running. +#define FANS_SELF_TEST_TARGET_PWM 0.5F ///< Fans self test target PWM for testing the fans are running. #define FANS_MAX_ALLOWED_RPM_OUT_OF_RANGE_INTERVAL ( 3 * MS_PER_SECOND ) ///< Fans max allowed RPM out of range time interval. #define FANS_MAX_ALLOWED_RPM 5500 ///< Fans max allowed RPM value. #define FANS_MIN_ALLOWED_RPM 150 ///< Fans max allowed RPM value. -#define FANS_MIN_RPM_OUT_OF_RANGE_TOL 0.25 ///< Fans min RPM out of range tolerance. -#define FANS_MAX_RPM_OUT_OF_RANGE_TOL 0.5 ///< Fans max RPM out of range tolerance. -#define DATA_PUBLISH_COUNTER_START_COUNT 15 ///< Data publish counter start count. +#define FANS_MIN_RPM_OUT_OF_RANGE_TOL 0.25F ///< Fans min RPM out of range tolerance. +#define FANS_MAX_RPM_OUT_OF_RANGE_TOL 0.5F ///< Fans max RPM out of range tolerance. +#define DATA_PUBLISH_COUNTER_START_COUNT 17 ///< Data publish counter start count. /// Fans exec states typedef enum fans_Exec_States @@ -78,8 +78,8 @@ static U32 fansPublishCounter; ///< Fans data publish interval counter. static BOOL isPOSTComplete; ///< Flag that indicates whether POST is complete or not. static BOOL hasAlarmBeenRaised; ///< Flag that indicates whether RPM out of range alarm has been raised once. -static OVERRIDE_U32_T rpmAlarmStartTimeOffset = { 0, 0, 0, 0}; ///< RPM out of range alarm start time offset. -static U32 rpmAlarmStartTime; ///< RPM alarm start time. +static U32 rpmAlarmStartTimeOffset; ///< RPM out of range alarm start time offset. +static S32 rpmAlarmStartTime; ///< RPM alarm start time. /// Temperature to duty cycle conversion slope (duty cycle not in percent) static const F32 SLOPE = ( FANS_MAX_DUTY_CYCLE - FANS_MIN_DUTY_CYCLE ) / ( MAX_ALLOWED_AMBINET_TEMPERATURE - MIN_ALLOWED_AMBIENT_TEMPERATURE ); @@ -98,7 +98,6 @@ static void convertTogglePeriod2RPM( void ); static void monitorFans( void ); static U32 getPublishFansDataInterval( void ); -static U32 getRPMAlarmStartTimeOffset( void ); static void publishFansData( void ); /*********************************************************************//** @@ -115,21 +114,18 @@ FAN_NAMES_T fan; // Initialize the variables - fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; - fansControlCounter = 0; - fansPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; - isPOSTComplete = FALSE; - hasAlarmBeenRaised = FALSE; - rpmAlarmStartTime = 0; - rpmAlarmStartTimeOffset.data = 0; - rpmAlarmStartTimeOffset.ovData = 0; - rpmAlarmStartTimeOffset.ovInitData = 0; - rpmAlarmStartTimeOffset.override = 0; - fansStatus.dutyCycle.data = 0.0; - fansStatus.dutyCycle.ovInitData = 0.0; - fansStatus.dutyCycle.ovData = 0.0; - fansStatus.dutyCycle.override = OVERRIDE_RESET; - fansStatus.targetRPM = 0.0; + fansExecState = FANS_EXEC_STATE_WAIT_FOR_POST_STATE; + fansControlCounter = 0; + fansPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; + isPOSTComplete = FALSE; + hasAlarmBeenRaised = FALSE; + rpmAlarmStartTime = 0; + rpmAlarmStartTimeOffset = 0; + fansStatus.dutyCycle.data = 0.0; + fansStatus.dutyCycle.ovInitData = 0.0; + fansStatus.dutyCycle.ovData = 0.0; + fansStatus.dutyCycle.override = OVERRIDE_RESET; + fansStatus.targetRPM = 0.0; // Initialize the fans for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) @@ -342,7 +338,7 @@ *************************************************************************/ static void setInletFansDutyCycle( F32 pwm ) { - etpwmSetCmpA( etpwmREG7, (U32)( (S32)( ( pwm * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); + etpwmSetCmpA( etpwmREG7, (U32)( (S32)( ( pwm * (F32)(etpwmREG7->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } /*********************************************************************//** @@ -409,7 +405,7 @@ /*********************************************************************//** * @brief * The monitorFans function monitors the fans for RPM. - * @details Inputs: rpmAlarmStartTimer, hasAlarmBeenRaised + * @details Inputs: rpmAlarmStartTime, hasAlarmBeenRaised * @details Outputs: hasAlarmBeenRaised, rpmAlarmStartTimer * @return none *************************************************************************/ @@ -460,43 +456,18 @@ // and remain silent for a defined period of time. else { - // Get the offset time since the last alarm. If the offset time has been overridden, then do not include the time that the alarm was raised first. - // Overrides are used to verify the code so what is sent to the firmware from override is intended to be the actual time so check whether the alarm is - // raised properly or not. Adding the start time of the alarm might cause inaccuracy in the verification process. - // For instance, if 86390 seconds is overridden to make sure the alarm is not raise before 24 hours or 86400, if the rpmAlarmStartTime is added to it - // it might make the time to be greater than 86400 seconds and therefore the alarm is raised again while it is not expected. - U32 offsetTime = getRPMAlarmStartTimeOffset(); - U32 elapsedTime = ( OVERRIDE_KEY == rpmAlarmStartTimeOffset.override ? offsetTime : calcTimeSince( rpmAlarmStartTime ) + offsetTime ); + S32 timeDiff = rpmAlarmStartTime - rpmAlarmStartTimeOffset; - if ( elapsedTime >= SECONDS_IN_A_DAY * MS_PER_SECOND ) + if ( calcTimeSince( timeDiff ) >= SECONDS_IN_A_DAY * MS_PER_SECOND ) { - hasAlarmBeenRaised = FALSE; - rpmAlarmStartTime = 0; + hasAlarmBeenRaised = FALSE; + rpmAlarmStartTime = 0; } } } /*********************************************************************//** * @brief - * The getRPMAlarmStartTimeOffset function gets the RPM alarm start time offset in MS. - * @details Inputs: rpmAlarmStartTimeOffset - * @details Outputs: none - * @return the RPM alarm start time offset - *************************************************************************/ -static U32 getRPMAlarmStartTimeOffset( void ) -{ - U32 startTime = rpmAlarmStartTimeOffset.data; - - if ( OVERRIDE_KEY == rpmAlarmStartTimeOffset.override ) - { - startTime = rpmAlarmStartTimeOffset.ovData; - } - - return startTime; -} - -/*********************************************************************//** - * @brief * The getPublishFansDataInterval function gets the fans data publish interval. * @details Inputs: fansPublishInterval * @details Outputs: none @@ -531,7 +502,7 @@ data.fansDutyCycle = ( OVERRIDE_RESET == fansStatus.dutyCycle.override ? fansStatus.dutyCycle.data : fansStatus.dutyCycle.ovData ) * FRACTION_TO_PERCENT_FACTOR; data.fansTargetRPM = fansStatus.targetRPM; data.fanInlet1RPM = getMeasuredFanRPM( FAN_INLET_1 ); - data.rpmAlarmTimeOffset = getRPMAlarmStartTimeOffset(); + data.rpmAlarmTimeOffset = calcTimeSince( rpmAlarmStartTime - rpmAlarmStartTimeOffset ); broadcastData( MSG_ID_HD_FANS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( FANS_DATA_T ) ); @@ -645,54 +616,27 @@ /*********************************************************************//** * @brief - * The testSetFanRPMAlarmStartTimeOffsetOverride function overrides the RPM alarm - * start time offset. + * The testSetFanRPMAlarmStartTimeOffset function set the fan RPM alarm start + * time offset. * @details Inputs: none * @details Outputs: rpmAlarmStartTimeOffset - * @param seconds seconds to override + * @param milliSeconds the milliSeconds the time to be offset * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetFanRPMAlarmStartTimeOffsetOverride( U32 seconds ) +BOOL testSetFanRPMAlarmStartTimeOffset( U32 milliSeconds ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { - rpmAlarmStartTimeOffset.ovData = seconds * MS_PER_SECOND; - rpmAlarmStartTimeOffset.override = OVERRIDE_KEY; - - result = TRUE; + rpmAlarmStartTimeOffset = milliSeconds; } return result; } /*********************************************************************//** * @brief - * The testResetFanRPMAlarmStartTimeOffsetOverride function resets the RPM alarm - * start time offset override. - * @details Inputs: none - * @details Outputs: rpmAlarmStartTimeOffset - * @return TRUE if override successful, FALSE if not - *************************************************************************/ -BOOL testResetFanRPMAlarmStartTimeOffsetOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - rpmAlarmStartTimeOffset.override = OVERRIDE_RESET; - rpmAlarmStartTimeOffset.ovData = 0; - rpmAlarmStartTimeOffset.data = 0; - - result = TRUE; - } - - return result; -} - -/*********************************************************************//** - * @brief * The testSetFansDutyCycleOverride function overrides fans duty cycle * @details Inputs: none * @details Outputs: fansStatus