Index: firmware/App/Drivers/RotaryValve.c =================================================================== diff -u -r6b96f1a18ab2f93068daddbf24178fbbae7cc570 -r63f70637ccd17ac53cb3664332a670b01f28c744 --- firmware/App/Drivers/RotaryValve.c (.../RotaryValve.c) (revision 6b96f1a18ab2f93068daddbf24178fbbae7cc570) +++ firmware/App/Drivers/RotaryValve.c (.../RotaryValve.c) (revision 63f70637ccd17ac53cb3664332a670b01f28c744) @@ -61,13 +61,12 @@ * @details \b Outputs: Rotary valves driver unit is initialized * @return none *************************************************************************/ -void initRotaryValvesDriver(void) +void initRotaryValvesDriver( void ) { U32 i; for ( i = FIRST_VALVE; i < NUM_OF_VALVES; i++ ) { - valveControl[ i ] = FPGA_PINCH_VALVES_1_8_STEP | FPGA_PINCH_VALVES_NOT_RESET | FPGA_PINCH_VALVES_NOT_SLEEP; // enable valves, configure for 1/8 step control currentValveEncPosition[ i ].data = 0; currentValveEncPosition[ i ].ovData = 0; currentValveEncPosition[ i ].ovInitData = 0; @@ -79,10 +78,6 @@ } commandValvePos[ H1_VALV ] = getH1EncoderPosition(); commandValvePos[ H19_VALV ] = getH19EncoderPosition(); - - // set valve control bits once at startup - setH1Control( valveControl[ H1_VALV ] ); - setH19Control( valveControl[ H19_VALV ] ); } /*********************************************************************//** @@ -138,7 +133,7 @@ { if ( valve < NUM_OF_VALVES ) { - U16 mag8 = ( ( mag % 8 ) < 4 ? ( mag >> 3 ) << 3 : ( ( mag >> 3 ) << 3 ) + 8 ); // round to multiple of 8 to maximize holding torque + U16 mag8 = ( ( mag % ROTARY_VALVE_MICROSTEP_FRACTION ) < 4 ? ( mag >> 3 ) << 3 : ( ( mag >> 3 ) << 3 ) + ROTARY_VALVE_MICROSTEP_FRACTION ); // round to multiple of 8 to maximize holding torque S16 chgSteps = (S16)mag8 * ( MOTOR_DIR_REVERSE == dir ? -1 : 1 ); // convert to signed change in position - negative value indicates reverse direction // log event showing valve position change commanded @@ -218,7 +213,125 @@ return result; } +/*********************************************************************//** + * @brief + * The resetValve function resets the valve. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if invalid valve given. + * @details \b Inputs: none + * @details \b Outputs: none + * @param valve ID of valve to get status for + * @return none + *************************************************************************/ +void resetValve( VALVE_T valve ) +{ + U08 resetValve = FPGA_PINCH_VALVES_1_8_STEP | FPGA_PINCH_VALVES_ENABLE_ENCODER | FPGA_PINCH_VALVES_DISABLE | + FPGA_PINCH_VALVES_RESET | FPGA_PINCH_VALVES_NOT_SLEEP; + switch ( valve ) + { + case H1_VALV: + setH1Control( resetValve ); + break; + + case H19_VALV: + setH19Control( resetValve ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_RESET_REQ, (U32)valve ) + break; + } +} + +/*********************************************************************//** + * @brief + * The resetValveEncoder function resets the valve's encoder. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if invalid valve given. + * @details \b Inputs: none + * @details \b Outputs: none + * @param valve ID of valve to get status for + * @return none + *************************************************************************/ +void resetValveEncoder( VALVE_T valve ) +{ + U08 resetEnc = FPGA_PINCH_VALVES_1_8_STEP | FPGA_PINCH_VALVES_RESET_ENCODER | FPGA_PINCH_VALVES_DISABLE | + FPGA_PINCH_VALVES_RESET | FPGA_PINCH_VALVES_NOT_SLEEP; + + switch ( valve ) + { + case H1_VALV: + setH1Control( resetEnc ); + break; + + case H19_VALV: + setH19Control( resetEnc ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_RESET_ENCODER_REQ, (U32)valve ) + break; + } +} + +/*********************************************************************//** + * @brief + * The enableValve function enables the valve. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if invalid valve given. + * @details \b Inputs: none + * @details \b Outputs: none + * @param valve ID of valve to get status for + * @return none + *************************************************************************/ +void enableValve( VALVE_T valve ) +{ + U08 enableValve = FPGA_PINCH_VALVES_1_8_STEP | FPGA_PINCH_VALVES_ENABLE_ENCODER | FPAG_PINCH_VALVES_ENABLE | + FPGA_PINCH_VALVES_NOT_RESET | FPGA_PINCH_VALVES_NOT_SLEEP; + + switch ( valve ) + { + case H1_VALV: + setH1Control( enableValve ); + break; + + case H19_VALV: + setH19Control( enableValve ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ENABLE_REQ, (U32)valve ) + break; + } +} + +/*********************************************************************//** + * @brief + * The setValveZeroEncoderPosition function zeros the valve's encoders position. + * @details \b Alarm: ALARM_ID_TD_SOFTWARE_FAULT if invalid valve given. + * @details \b Inputs: none + * @details \b Outputs: none + * @param valve ID of valve to get status for + * @return none + *************************************************************************/ +void setValveZeroEncoderPosition( VALVE_T valve ) +{ + // First enable the valve and then set the position to 0 to clear the FPGA command registers + switch ( valve ) + { + case H1_VALV: + setH1Position( 0 ); + break; + + case H19_VALV: + setH19Position( 0 ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_VALVES_INVALID_VALVE_ENCODER_REQ, (U32)valve ) + break; + } +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/