Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r31b53220d894e272a8f9a8a49d3c9110150489db -r5206a101e662f660baaf6dc919441916c4a4c966 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 31b53220d894e272a8f9a8a49d3c9110150489db) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 5206a101e662f660baaf6dc919441916c4a4c966) @@ -24,22 +24,26 @@ #include "Common.h" #include "Heaters.h" #include "TemperatureSensors.h" +#include "SystemCommMessages.h" #include "PIControllers.h" #define MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE 0.89 ///< Main primary heater (heater A) max duty cycle (79.5%) #define SMALL_PRIMAY_HEATER_MAX_DUTY_CYCLE 0.50 ///< Small Primary heater (heater B) max duty cycle (25%) #define TRIMMER_HEATER_MAX_DUTY_CYCLE 0.25 ///< Trimmer heater max duty cycle (25%) #define HEATERS_MIN_DUTY_CYCLE 0.00 ///< Primary and trimmer heaters min duty cycle (0.00%) -#define PRIMARY_HEATERS_P_COEFFICIENT 0.005 +#define PRIMARY_HEATERS_P_COEFFICIENT 0.02 #define PRIMARY_HEATERS_I_COEFFICIENT 0.001 #define TRIMMER_HEATER_P_COEFFICIENT 0.003 #define TRIMMER_HEATER_I_COEFFICIENT 0.001 -#define DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION 0.03 +#define DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION 0.05 #define CONTROLLER_CHECK_INTERVAL_COUNT 10U +#define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count + + typedef enum heaters_self_test_states { HEATERS_SELF_TEST_START = 0, @@ -79,10 +83,11 @@ static F32 primaryHeaterTargetTemperature; static F32 trimmerHeaterTargetTemperature; -static F32 smallPrimaryHeaterPWMDutyCycle; -static F32 mainPrimaryHeaterPWMDutyCycle; -static F32 trimmerHeaterPWMDutyCycle; + +static F32 mainPrimaryHeaterDutyCycle; +static F32 smallPrimaryHeaterDutyCycle; static U32 controllerCheckTimerCounter; +static U32 tempSensorsPublicationTimerCounter; // private functions prototypes @@ -93,12 +98,15 @@ static void setSmallPrimaryHeaterPWM ( F32 pwm ); static void setTrimmerHeaterPWM ( F32 pwm ); static void resetHeaterState ( NAME_OF_HEATER_T heater ); +static void publishTemperatureData ( void ); // TODO: Remove the below code. FOR TESTING ONLY #define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) #define TOGGLEPRIMAYHEATER() (( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0) static void temporaryStartROPump ( void ); static void temporaryStopROPump ( void ); +static void temporaryStartFan ( void ); +static void temporaryStopFan ( void ); //TODO: Remove the above code. FOR TESTING ONLY // Public functions @@ -120,10 +128,8 @@ primaryHeaterTargetTemperature = 0.0; trimmerHeaterTargetTemperature = 0.0; - smallPrimaryHeaterPWMDutyCycle = 0.0; - mainPrimaryHeaterPWMDutyCycle = 0.0; - trimmerHeaterPWMDutyCycle = 0.0; controllerCheckTimerCounter = 0; + tempSensorsPublicationTimerCounter = 0; // initialize the PI controller for the primary heaters initializePIController( PI_CONTROLLER_ID_PRIMARY_HEATER, HEATERS_MIN_DUTY_CYCLE, @@ -171,14 +177,11 @@ BOOL startPrimaryHeater ( void ) { BOOL status = FALSE; - // TODO: remove this code. For testing only - //setMainPrimaryHeaterPWM ( 0.89 ); - //setSmallPrimaryHeaterPWM ( 0.50 ); - // TODO: remove this code. for testing only if ( primaryHeaterTargetTemperature != 0.0 ) { resetHeaterState ( PRIMARY_HEATER ); + setMainPrimaryHeaterPWM ( mainPrimaryHeaterDutyCycle ); primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; status = TRUE; } @@ -357,10 +360,15 @@ state = PRIMARY_HEATERS_EXEC_STATE_OFF; if ( TOGGLEPRIMAYHEATER() ) { - setPrimaryHeaterTargetTemperature ( 32 ); - startPrimaryHeater(); - temporaryStartROPump(); - state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + setPrimaryHeaterTargetTemperature ( 37 ); + if ( getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ) > 0 ) + { + startPrimaryHeater(); + state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; + temporaryStartROPump(); + temporaryStartFan(); + } + //state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; } // TODO remove this code for testing @@ -383,26 +391,31 @@ if ( ++controllerCheckTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { F32 outletTemp = getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ); - F32 newPWM = runPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); + mainPrimaryHeaterDutyCycle = runPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); - if ( newPWM >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) + if ( mainPrimaryHeaterDutyCycle >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) { - setMainPrimaryHeaterPWM ( MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ); - newPWM = newPWM - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; - setSmallPrimaryHeaterPWM ( newPWM ); + smallPrimaryHeaterDutyCycle = mainPrimaryHeaterDutyCycle - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + mainPrimaryHeaterDutyCycle = MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + setMainPrimaryHeaterPWM ( mainPrimaryHeaterDutyCycle ); + setSmallPrimaryHeaterPWM ( smallPrimaryHeaterDutyCycle ); } else { - setMainPrimaryHeaterPWM ( newPWM ); + setMainPrimaryHeaterPWM ( mainPrimaryHeaterDutyCycle ); + smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; + setSmallPrimaryHeaterPWM ( smallPrimaryHeaterDutyCycle ); } controllerCheckTimerCounter = 0; } + publishTemperatureData(); // TODO remove this code if ( !TOGGLEPRIMAYHEATER() ) { stopPrimaryHeater(); - temporaryStopROPump (); + temporaryStopROPump(); + temporaryStopFan(); state = PRIMARY_HEATERS_EXEC_STATE_OFF; } // TODO Remove this code @@ -465,27 +478,74 @@ if ( heater == PRIMARY_HEATER ) { F32 inletTemperatrue = getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ); - F32 initialPWMDutyCycle = fabs(primaryHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; - resetPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, initialPWMDutyCycle ); + mainPrimaryHeaterDutyCycle = fabs(primaryHeaterTargetTemperature - inletTemperatrue) * DELTA_TEMP_TO_PWM_DUTY_CYCLE_CONVERSION; + resetPIController ( PI_CONTROLLER_ID_PRIMARY_HEATER, mainPrimaryHeaterDutyCycle ); } else if ( heater == TRIMMER_HEATER ) { // TODO setup the trimmer heater } } +/************************************************************************* + * @brief publishTemperatureData + * The publishTemperatureData function publishes the temperature sensors + * data into the USB debug port at the defined time interval + * @details + * Inputs : none + * Outputs : none + * @param none + * @return none + *************************************************************************/ +static void publishTemperatureData ( void ) +{ + if ( ++tempSensorsPublicationTimerCounter >= TEMP_SENSORS_INTERVAL_COUNT ) + { +#ifdef DEBUG_ENABLED + { + char debugTempStr[ 256 ]; + sprintf( debugTempStr, "MPDuty: %6.2f, SPDuty: %6.2f, 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\r\n", + mainPrimaryHeaterDutyCycle, smallPrimaryHeaterDutyCycle, + getTemperatureValue ( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_OUTLET_PRIMARY_HEATER_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_1_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_CONDUCTIVITY_SENSOR_2_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_OUTLET_REDUNDANCY_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_INLET_DIALYSATE_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_PRIMARY_HEATER_INTERNAL_TEMP_SENSOR ), + getTemperatureValue ( TEMPSENSORS_TRIMMER_HEATER_INTERNAL_TEMP_SESNOR ), + primaryHeaterTargetTemperature ); + sendDebugData ( (U08*)debugTempStr, strlen(debugTempStr) ); + } +#endif + tempSensorsPublicationTimerCounter = 0; + } +} + // TODO REMOVE THE CODE static void temporaryStartROPump ( void ) { - F32 tempPWM = 0.4; + F32 tempPWM = 0.6; etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( tempPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); } static void temporaryStopROPump ( void ) { etpwmSetCmpB( etpwmREG2, 0 ); } + +static void temporaryStartFan ( void ) +{ + F32 tempPWM = 0.25; + etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( tempPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); + etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( tempPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} +static void temporaryStopFan ( void ) +{ + etpwmSetCmpA( etpwmREG6, 0 ); + etpwmSetCmpB( etpwmREG6, 0 ); +} // TODO REMOVE THE CODE -