Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r1781335a8c1833fad17b275bf44c7f6675e68423 -r2e89a75592087ba15cae7070a92173e9f1efa8fe --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 2e89a75592087ba15cae7070a92173e9f1efa8fe) @@ -40,23 +40,23 @@ */ // ********** private definitions ********** -#define AC_HEATER_TX_MAX_DUTY_CYCLE 0.50F ///< AC Heater Treatement mode max duty cycle (50% of 1400W : 700W ) or ON state -#define AC_HEATER_HEAT_MAX_DUTY_CYCLE 0.70F ///< AC Heater heat disinfect mode max duty cycle (70% of 1400W : 980W ) or ON state +#define AC_HEATER_TX_MAX_DUTY_CYCLE 0.50F ///< AC Heater treatment mode max duty cycle (50% of 1400W : 700W ) +#define AC_HEATER_HEAT_MAX_DUTY_CYCLE 0.70F ///< AC Heater heat disinfect mode max duty cycle (70% of 1400W : 980W ) #define AC_HEATER_MAX_DUTY_CYCLE 1.0F ///< AC Heater max duty cycle (100.0%) or ON state #define DC_HEATER_MAX_DUTY_CYCLE 1.0F ///< DC Heater max duty cycle (100%) or ON state #define HEATERS_MIN_DUTY_CYCLE 0.0F ///< Heaters minimum duty cycle (0.00%) or OFF state #define HEATERS_DISINFECT_TEMPERATURE_DRIFT_C 3.0F ///< Heaters disinfect temperature drift in C. #define HEATERS_ZERO_DELTA_TEMP_C 0.0F ///< Heaters zero delta temperature in C. #define HEATERS_DUTY_CYCLE_CONVERSION_FACTOR 100.0F ///< Heaters duty cycle 0: OFF, 100: 100% duty cycle. #define HEATERS_ZERO_EFFICIENCY 0.0F ///< Zero heater efficiency -#define HEATER_CNTL_TRANSFER_DELTA_TEMP_C 0.25F ///< AC heater delta temperature to transfer control from open to close loop +#define HEATER_CNTL_TRANSFER_DELTA_TEMP_C 0.50F ///< AC heater delta temperature to transfer control from open to close loop #define D5_HEAT_TX_INIT_FEED_FORWARD 0.0F ///< Initial Feed forward term for heater control //#define D5_HEAT_TX_P_COEFFICIENT 0.050F ///< P Term for AC primary heater control during treatment mode. //#define D5_HEAT_TX_I_COEFFICIENT 0.015F ///< I Term for AC primary heater control during treatment mode. -#define D5_HEAT_TX_P_COEFFICIENT 0.048F ///< P Term for AC primary heater control during treatment mode. -#define D5_HEAT_TX_I_COEFFICIENT 0.012F ///< I Term for AC primary heater control during treatment mode. +#define D5_HEAT_TX_P_COEFFICIENT 0.035F ///< P Term for AC primary heater control during treatment mode. +#define D5_HEAT_TX_I_COEFFICIENT 0.004F ///< I Term for AC primary heater control during treatment mode. #define D45_HEAT_P_COEFFICIENT 0.20F ///< P Term for trimmer heater control. #define D45_HEAT_I_COEFFICIENT 0.05F ///< I Term for trimmer heater control. @@ -560,10 +560,10 @@ if ( DD_MODE_HEAT != opMode ) { - F32 deltaTempC = targetTemperature - measuredTemperature; + F32 deltaTempC = measuredTemperature - targetTemperature; F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); - if ( capDeltaTempC <= HEATER_CNTL_TRANSFER_DELTA_TEMP_C ) + if ( capDeltaTempC >= HEATER_CNTL_TRANSFER_DELTA_TEMP_C ) { // Transfer Control to target when delta temp is minimal. state = HEATER_EXEC_STATE_CONTROL_TO_TARGET; @@ -855,8 +855,8 @@ { HEATERS_DATA_T data; - data.d5_HeaterDC = getHeaterControl( D5_HEAT ); - data.d45_HeaterDC = getHeaterControl( D45_HEAT ); + data.d5_HeaterDC = getHeaterControl( D5_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; + data.d45_HeaterDC = getHeaterControl( D45_HEAT ) * HEATERS_DUTY_CYCLE_CONVERSION_FACTOR; data.d5_HeaterTargetTemp = getHeaterTargetTemperature( D5_HEAT ); data.d45_HeaterTargetTemp = getHeaterTargetTemperature( D45_HEAT ); data.d5_HeaterState = heatersStatus[ D5_HEAT ].state; Index: firmware/App/DDCommon.h =================================================================== diff -u -r0364071db4c8926d495957b04f1693a1f3b4186a -r2e89a75592087ba15cae7070a92173e9f1efa8fe --- firmware/App/DDCommon.h (.../DDCommon.h) (revision 0364071db4c8926d495957b04f1693a1f3b4186a) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision 2e89a75592087ba15cae7070a92173e9f1efa8fe) @@ -33,9 +33,6 @@ #ifndef _VECTORCAST_ // #define TASK_TIMING_OUTPUT_ENABLED 1 // Re-purposes alarm lamp pins for task timing -//flag to check PT100 use in calculations -//#define USE_PT_100 1 - //Uncomment the below line for new dosing pump testing //#define __PUMPTEST__ 1 @@ -46,7 +43,7 @@ //#define __PITEST__ 1 //Uncomment below if diener concentrate pump used -//#define __DIENER_CONC_PUMP__ 1 +#define __DIENER_CONC_PUMP__ 1 //Uncomment below if barometric pressure sensor reading available //#define __BARO_PRES_SENSOR__ 1 Index: firmware/App/Drivers/TemperatureSensors.c =================================================================== diff -u -rf14371c9c14b461a50d7b08336e2e5fbed16f360 -r2e89a75592087ba15cae7070a92173e9f1efa8fe --- firmware/App/Drivers/TemperatureSensors.c (.../TemperatureSensors.c) (revision f14371c9c14b461a50d7b08336e2e5fbed16f360) +++ firmware/App/Drivers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 2e89a75592087ba15cae7070a92173e9f1efa8fe) @@ -38,12 +38,6 @@ #define PRIMARY_HEATER_TEMP_SENSORS_REF_RESISTANCE 20000 ///< Primary heater temperature sensors reference resistance. #define PRIMARY_HEATER_TEMP_SENSORS_0_DEGREE_RESISTANCE 1000U ///< Primary heater temperature sensors zero degree resistance. -#ifdef USE_PT_100 -#define PT100_TEMP_SENSORS_GAIN 8U ///< PT100 temperature sensors gain. -#define PT100_TEMP_SENSORS_REF_RESISTANCE 4700 ///< PT100 temperature sensors reference resistance. -#define PT100_TEMP_SENSORS_0_DEGREE_RESISTANCE 100U ///< PT100 temperature sensors zero degree resistance. -#endif - #define TEMP_SENSORS_ADC_BITS 24U ///< External temperature sensors ADC bits. #define MAX_NUM_OF_RAW_ADC_SAMPLES 4U ///< Number of ADC reads for moving average calculations. #define SHIFT_BITS_BY_2 2U ///< Shift bits by 2 to create a 4 for averaging 4 samples. @@ -155,28 +149,6 @@ // Initialize TH1 (primary heater), TH2(outlet Heat Exchanger), TAUX ( Inlet Heat exchanger), // TH3 ( Trim Heater) constants. - // Based on the PT100/PT1000,define the constants for all temperature sensors -#ifdef USE_PT_100 - tempSensors[ D1_TEMP ].gain = PT100_TEMP_SENSORS_GAIN; - tempSensors[ D1_TEMP ].refResistance = PT100_TEMP_SENSORS_REF_RESISTANCE; - tempSensors[ D1_TEMP ].zeroDegreeResistance = PT100_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ D1_TEMP ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; - - tempSensors[ X6_TEMP ].gain = PT100_TEMP_SENSORS_GAIN; - tempSensors[ X6_TEMP ].refResistance = PT100_TEMP_SENSORS_REF_RESISTANCE; - tempSensors[ X6_TEMP ].zeroDegreeResistance = PT100_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ X6_TEMP ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; - - tempSensors[ D4_TEMP ].gain = PT100_TEMP_SENSORS_GAIN; - tempSensors[ D4_TEMP ].refResistance = PT100_TEMP_SENSORS_REF_RESISTANCE; - tempSensors[ D4_TEMP ].zeroDegreeResistance = PT100_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ D4_TEMP ].maxAllowedTemp = HEATERS_INTERNAL_TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; - - tempSensors[ D50_TEMP ].gain = PT100_TEMP_SENSORS_GAIN; - tempSensors[ D50_TEMP ].refResistance = PT100_TEMP_SENSORS_REF_RESISTANCE; - tempSensors[ D50_TEMP ].zeroDegreeResistance = PT100_TEMP_SENSORS_0_DEGREE_RESISTANCE; - tempSensors[ D50_TEMP ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; -#else tempSensors[ D1_TEMP ].gain = PRIMARY_HEATER_TEMP_SENSORS_GAIN; tempSensors[ D1_TEMP ].refResistance = PRIMARY_HEATER_TEMP_SENSORS_REF_RESISTANCE; tempSensors[ D1_TEMP ].zeroDegreeResistance = PRIMARY_HEATER_TEMP_SENSORS_0_DEGREE_RESISTANCE; @@ -196,7 +168,6 @@ tempSensors[ D50_TEMP ].refResistance = PRIMARY_HEATER_TEMP_SENSORS_REF_RESISTANCE; tempSensors[ D50_TEMP ].zeroDegreeResistance = PRIMARY_HEATER_TEMP_SENSORS_0_DEGREE_RESISTANCE; tempSensors[ D50_TEMP ].maxAllowedTemp = TEMP_SENSORS_MAX_ALLOWED_DEGREE_C; -#endif // Board temperature sensors conversion coefficient tempSensors[ BRD_TEMP ].conversionCoeff = conversionCoeff; Index: firmware/App/Monitors/Temperature.c =================================================================== diff -u -r1781335a8c1833fad17b275bf44c7f6675e68423 -r2e89a75592087ba15cae7070a92173e9f1efa8fe --- firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 1781335a8c1833fad17b275bf44c7f6675e68423) +++ firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 2e89a75592087ba15cae7070a92173e9f1efa8fe) @@ -47,7 +47,7 @@ #define D28_D30_TEMP_SENSORS_MAX_DEVIATION_IN_HEAT_DIS_C 5.0F ///< Dialysate temperature sensors maximum allowed deviation in heat disinfect in C. /// Dialysate temperature sensors enums -typedef enum Dial_Temps_Sensors +typedef enum dial_Temps_Sensors { DIAL_TEMP_D28 = 0, ///< Dialysate temperature D28. DIAL_TEMP_FIRST = DIAL_TEMP_D28, ///< Dialysate temperature first. @@ -86,8 +86,8 @@ static F32 d4TempSamplesC[ D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ]; ///< D4 temperature samples array in C. static U32 d4TempSamplesNextIndex; ///< D4 temperature sample next index number. static U32 d4TempCount; ///< D4 Number of samples in average buffer. -static U32 tempDataColStartTimeMS; ///< Temperature data collection start time in milliseconds. static U32 tempDataColTimeInterval; ///< Temperature data collection time interval in milliseconds. +static U32 d4TempSampleIntervalCounter; ///< D4 temperature sensor sample collection timer counter. static F32 d50TempAvgC; ///< D50 temperature average in C. static F32 d50TempRunningSumC; ///< D50 temperature running sum in C. @@ -117,8 +117,6 @@ *************************************************************************/ void initTemperature( void ) { - DIAL_TEMPERATURE_SENSORS_T j; - startTime = 0; tempSensorsExecState = TEMPSENSORS_EXEC_STATE_START; dataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; @@ -130,21 +128,13 @@ d50TempAvgC = 0.0F; d50TempSamplesNextIndex = 0; d50TempCount = 0; - tempDataColStartTimeMS = 0; + d4TempSampleIntervalCounter = 0; tempDataColTimeInterval = 0; tempDriftEventCheck = FALSE; - for ( j = DIAL_TEMP_FIRST; j < NUM_OF_DIAL_TEMPS; j++ ) - { - dialTempMovingAvgData[ j ].dialTempAvgC = 0.0F; - dialTempMovingAvgData[ j ].dialTempColHasTimerBeenSet = FALSE; - dialTempMovingAvgData[ j ].dialTempRunningSumC = 0.0F; - dialTempMovingAvgData[ j ].dialTempSamplesNextIndex = 0; - dialTempMovingAvgData[ j ].dialTempDataColStartTimeMS = getMSTimerCount(); + dialTempMovingAvgData[ DIAL_TEMP_D28 ].dialTempColHasTimerBeenSet = FALSE; + dialTempMovingAvgData[ DIAL_TEMP_D30 ].dialTempColHasTimerBeenSet = FALSE; - memset( dialTempMovingAvgData[ j ].dialTempSamplesC, 0.0F, sizeof( F32 ) * DIAL_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); - } - // Initialize the temperature sensors initTemperatureSensors(); @@ -286,31 +276,29 @@ static void filterTemperatureReadings( void ) { // Moving average sample collection interval varies based on the dialysate flow rate - if ( 0 == tempDataColStartTimeMS ) + if ( ++d4TempSampleIntervalCounter >= tempDataColTimeInterval ) { - tempDataColStartTimeMS = getMSTimerCount(); - } - else if ( TRUE == didTimeout( tempDataColStartTimeMS , tempDataColTimeInterval ) ) - { // Filter D4 Temperature for AC heater if ( d4TempCount >= D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) { d4TempRunningSumC -= d4TempSamplesC[ d4TempSamplesNextIndex ]; } + F32 d4Temp = getTemperatureValue( D4_TEMP ); d4TempSamplesC[ d4TempSamplesNextIndex ] = d4Temp; d4TempRunningSumC += d4Temp; d4TempSamplesNextIndex = INC_WRAP( d4TempSamplesNextIndex, 0, D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES - 1 ); d4TempCount = INC_CAP( d4TempCount, D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ); d4TempAvgC = d4TempRunningSumC / (F32)d4TempCount; - tempDataColStartTimeMS = getMSTimerCount(); + d4TempSampleIntervalCounter = 0; } // Filter D50 Temperature ( 250 ms filter ) for trimmer heater if ( d50TempCount >= D50_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) { d50TempRunningSumC -= d50TempSamplesC[ d50TempSamplesNextIndex ]; } + F32 d50Temp = getTemperatureValue( D50_TEMP ); d50TempSamplesC[ d50TempSamplesNextIndex ] = d50Temp; d50TempRunningSumC += d50Temp; @@ -427,13 +415,15 @@ * to find the average value. * @details \b Inputs: dialysate flow rate * @details \b Outputs: none - * @return the temperature interval for sample collection + * @return the temperature interval for sample collection in task interval *************************************************************************/ static void getTempMovingAverageTimeInterval( void ) { F32 period = (F32)SEC_PER_MIN / ( getTDDialysateFlowrate() / BAL_CHAMBER_FILL_VOLUME_ML ) ; - tempDataColTimeInterval = (U32)( ( period / (F32)D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) * MS_PER_SECOND ); + U32 sampleInterval = (U32)( ( period / (F32)D4_TEMP_MOVING_AVG_NUM_OF_SAMPLES ) * MS_PER_SECOND ); + + tempDataColTimeInterval = (U32) ( sampleInterval / TASK_PRIORITY_INTERVAL ); } /*********************************************************************//**