Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r3dccbc282c3bcc1303ddb4d2f029ddd61c8e39e4 -r521cd469ec8e35476a27475170848d0f62aa0ec8 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 3dccbc282c3bcc1303ddb4d2f029ddd61c8e39e4) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 521cd469ec8e35476a27475170848d0f62aa0ec8) @@ -78,8 +78,9 @@ #define D5_HEAT_CONTROL_INTERVAL_COUNT ( ( 1 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Primary heater control interval count. #define TX_PRIMARY_HEATER_MAX_PWR_WATTS 700 ///< Estimated power to be supplied to the primary heater during treatement mode #define HEAT_PRIMARY_HEATER_MAX_PWR_WATTS 1000 ///< Estimated power to be supplied to the primary heater during heat disinfect mode -#define MAX_INLET_FLOW_LPM ( 700 / 1000 ) ///< Maximum inlet flow to hydraulics chamber from FP +#define MAX_INLET_FLOW_LPM ( 800 / 1000 ) ///< Maximum inlet flow to hydraulics chamber from FP ( 800 ml/min => 0.8LPM) #define TRIMMER_HEATER_MAX_PWR_WATTS 120 ///< Maximum power supplied to trimmer heater +#define AC_HEATER_PWM_PERIOD 1667 ///< PWM period for 60Hz AC ( in 10us resoultion), 1/60Hz = 16666us/10us = 1667. #define DATA_PUBLISH_COUNTER_START_COUNT 70 ///< Data publish counter start count. @@ -110,6 +111,7 @@ static HEATER_STATUS_T heatersStatus[ NUM_OF_DD_HEATERS ]; ///< Heaters status. static OVERRIDE_F32_T targetTempC[ NUM_OF_DD_HEATERS ]; ///< Heater target temperature. static OVERRIDE_F32_T control[ NUM_OF_DD_HEATERS ]; ///< Heater control ( Primary : On/Off, Trimmer : Dutycycle). +static OVERRIDE_F32_T pwmPeriod[ NUM_OF_DD_HEATERS ]; ///< Total PWM period ( ON state + Off State of PWM) static U32 dataPublicationTimerCounter; ///< Data publication timer counter. static const F32 WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES = 4184 / SEC_PER_MIN; ///< Water specific heat in J/KgC / 60. static OVERRIDE_U32_T heatersDataPublishInterval = { HEATERS_DATA_PUBLISH_INTERVAL, HEATERS_DATA_PUBLISH_INTERVAL, 0, 0 }; ///< Heaters data publish time interval. @@ -139,6 +141,24 @@ DD_HEATERS_T heater; dataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; +#ifndef __ALPHA_AO_VER__ + //Enable PWM based heater control + setFPGAD5HeaterPWMEnableControl( TRUE ); + + // Define PWM period for AC heater + pwmPeriod[ D5_HEAT ].data = AC_HEATER_PWM_PERIOD; + pwmPeriod[ D5_HEAT ].ovData = AC_HEATER_PWM_PERIOD; + pwmPeriod[ D5_HEAT ].ovInitData = AC_HEATER_PWM_PERIOD; + pwmPeriod[ D5_HEAT ].override = OVERRIDE_RESET; + + // TODO : Trimmer heater PWM period + pwmPeriod[ D45_HEAT ].data = 0.0F; + pwmPeriod[ D45_HEAT ].ovData = 0.0F; + pwmPeriod[ D45_HEAT ].ovInitData = 0.0F; + pwmPeriod[ D45_HEAT ].override = OVERRIDE_RESET; + +#endif + for ( heater = DD_HEATERS_FIRST; heater < NUM_OF_DD_HEATERS; heater++ ) { targetTempC[ heater ].data = 0.0F; @@ -232,6 +252,22 @@ /*********************************************************************//** * @brief + * The getHeaterPWMPeriod function returns the given heater PWM + * period. + * @details \b Inputs: none + * @details \b Outputs: pwmPeriod + * @param heater: heater ID to get heater PWM period. + * @return the given heater PWM period. + *************************************************************************/ +F32 getHeaterPWMPeriod( DD_HEATERS_T heater ) +{ + F32 pwmPrd = getF32OverrideValue( &pwmPeriod[ heater ] ); + + return pwmPrd; +} + +/*********************************************************************//** + * @brief * The isHeaterOn function returns the given heater status whether * it is on or off * @details \b Inputs: heaterStatus @@ -449,6 +485,7 @@ if ( DD_MODE_HEAT != opMode ) { #ifndef __ALPHA_AO_VER__ + F32 deltaTempC = targetTemperature - measuredTemperature; F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); F32 dutyCycle = sqrt( ( WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * capDeltaTempC * MAX_INLET_FLOW_LPM ) / TX_PRIMARY_HEATER_MAX_PWR_WATTS ); @@ -457,6 +494,8 @@ dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); control[ heater ].data = dutyCycle; + resetPIController( PI_CONTROLLER_ID_D5_HEAT, dutyCycle ); + #else // Assign initial value control[ heater ].data = D5_HEAT_ON; @@ -479,11 +518,13 @@ F32 deltaTempC = targetTemperature - measuredTemperature; F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); F32 dutyCycle = sqrt( ( WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * capDeltaTempC * MAX_INLET_FLOW_LPM ) / TRIMMER_HEATER_MAX_PWR_WATTS ); + //F32 dutyCycle = ( WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * capDeltaTempC * MAX_INLET_FLOW_LPM ) / TRIMMER_HEATER_MAX_PWR_WATTS ; dutyCycle *= HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; dutyCycle = MIN( dutyCycle, HEATERS_MAX_DUTY_CYCLE ); dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); control[ heater ].data = dutyCycle; + resetPIController( PI_CONTROLLER_ID_D45_HEAT, dutyCycle ); #else // Assign initial value ctrl = ( ( targetTemperature / HEATER_TARGET_TEMPERATURE_MAX ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR ) + FLOAT_TO_INT_ROUNDUP_OFFSET; @@ -614,14 +655,17 @@ { if ( heater < NUM_OF_DD_HEATERS ) { - F32 control; + F32 control = getHeaterControl( heater ); + F32 period = getHeaterPWMPeriod ( heater ); - control = getHeaterControl( heater ); - if ( D5_HEAT == heater ) { #ifndef __ALPHA_AO_VER__ - setFPGAD5HeaterPWMControl( (U08)control ); + //Convert duty cycle into LowState and multiply by period for now + F32 convertDC = ( HEATERS_DUTY_CYCLE_CONVERSION_FACTOR - control ) * period; + + setFPGAD5HeaterPWMPeriod( (U16)period ); + setFPGAD5HeaterPWMLowState( (U16)convertDC ); #else BOOL heaterCntrl = (BOOL)control; setFPGAD5HeaterOnOffControl( heaterCntrl ); @@ -783,6 +827,23 @@ /*********************************************************************//** * @brief + * The testHeaterPWMPeriodOverride function overrides the specified heater's + * PWM period. + * @details \b Inputs: pwmPeriod + * @details \b Outputs: pwmPeriod + * @param message Override message from Dialin which includes an ID of + * the heater to override and the PWM period of the heater. + * @return TRUE if the override was successful otherwise FALSE + *************************************************************************/ +BOOL testHeaterPWMPeriodOverride( MESSAGE_T *message ) +{ + BOOL result = f32ArrayOverride( message, &pwmPeriod[ 0 ], NUM_OF_DD_HEATERS - 1 ); + + return result; +} + +/*********************************************************************//** + * @brief * The testHeaterStartStopOverride function starts/stops a given heater * at mentioned temperature. * @details \b Inputs: tester logged in Index: firmware/App/Services/FpgaDD.c =================================================================== diff -u -r322747d530c1b8205be257557e53dcfe9caad50a -r521cd469ec8e35476a27475170848d0f62aa0ec8 --- firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 322747d530c1b8205be257557e53dcfe9caad50a) +++ firmware/App/Services/FpgaDD.c (.../FpgaDD.c) (revision 521cd469ec8e35476a27475170848d0f62aa0ec8) @@ -90,7 +90,8 @@ #define FPGA_D6_FLOATER_LEVEL_BIT 0x03 ///< Floater level bit mask. -#define FPGA_D5_HEATER_CNTRL_BIT 0x01 ///< FPGA GIO D5 heater control bit mask +#define FPGA_D5_HEATER_CNTRL_BIT 0x01 ///< FPGA GIO D5 heater control bit mask +#define FPGA_D5_HEATER_PWM_ENABLE_BIT 0x02 ///< FPGA D5 PWM based heater control bit mask /// FPGA size of V3 read bytes. #define FPGA_SIZE_OF_V3_READ_BYTES ( FPGA_READ_V3_END_BYTE_NUM - FPGA_READ_V3_START_BYTE_NUM ) @@ -324,6 +325,8 @@ U16 fpgaD10PumpRevCount; ///< Reg 144. Bicarb Concentrate pump revolution count U08 fpgaADCControl; ///< Reg 146. FPGA internal ADC Control register for debugging U08 fpgaGPIOControl; ///< Reg 147. FPGA GPIO control interface + U16 fpgaACRelayPWMLow; ///< Reg 148. Length of time in 10us resoultion that PWM output stays low. + U16 fpgaACRelayPWMPeriod; ///< Reg 150. PWM period for AC relay/heater. } FPGA_ACTUATORS_T; #pragma pack(pop) @@ -1341,6 +1344,55 @@ /*********************************************************************//** * @brief + * The setFPGAD5HeaterPWMEnableControl function sets whether the primary heater + * control based out of On/OFF (0) or PWM based control (1). + * @details \b Inputs: none + * @details \b Outputs: fpgaGPIOControl + * @param enable PWM based heater control when true, otherwise On/Off Control. + * @return none + *************************************************************************/ +void setFPGAD5HeaterPWMEnableControl( BOOL enable ) +{ + if ( TRUE == enable) + { + fpgaActuatorSetPoints.fpgaGPIOControl |= FPGA_D5_HEATER_PWM_ENABLE_BIT; + } + else + { + fpgaActuatorSetPoints.fpgaGPIOControl &= ~FPGA_D5_HEATER_PWM_ENABLE_BIT; + } +} + +/*********************************************************************//** + * @brief + * The setFPGAD5HeaterPWMLowState function sets the PWM low period( Off time) + * for AC heater. + * @details \b Inputs: none + * @details \b Outputs: fpgaACRelayPWMLow + * @param count the number of count that PWM stays low for the AC relay/heater. + * @return none + *************************************************************************/ +void setFPGAD5HeaterPWMLowState( U16 count ) +{ + fpgaActuatorSetPoints.fpgaACRelayPWMLow = count; +} + +/*********************************************************************//** + * @brief + * The setFPGAD5HeaterPWMPeriod function sets the PWM period( On and Off time) + * for AC heater. + * @details \b Inputs: none + * @details \b Outputs: fpgaACRelayPWMPeriod + * @param period the total period of PWM cycle ( On and Off time). + * @return none + *************************************************************************/ +void setFPGAD5HeaterPWMPeriod( U16 period ) +{ + fpgaActuatorSetPoints.fpgaACRelayPWMPeriod = period; +} + +/*********************************************************************//** + * @brief * The getFPGAVersions function gets the FPGA version numbers. * @details \b Inputs: fpgaHeader * @details \b Outputs: none Index: firmware/App/Services/FpgaDD.h =================================================================== diff -u -r322747d530c1b8205be257557e53dcfe9caad50a -r521cd469ec8e35476a27475170848d0f62aa0ec8 --- firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 322747d530c1b8205be257557e53dcfe9caad50a) +++ firmware/App/Services/FpgaDD.h (.../FpgaDD.h) (revision 521cd469ec8e35476a27475170848d0f62aa0ec8) @@ -225,6 +225,9 @@ void setFPGAD5HeaterPWMControl( U08 control ); void setFPGAD45HeaterPWMControl( U08 control ); void setFPGAD5HeaterOnOffControl( BOOL flag ); +void setFPGAD5HeaterPWMEnableControl( BOOL enable ); +void setFPGAD5HeaterPWMLowState( U16 count ); +void setFPGAD5HeaterPWMPeriod( U16 period ); /**@}*/