Started a gui menuflow

Dependencies:   LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI BSP_DISCO_F429ZI

Committer:
Clancy_SENDSOR
Date:
Tue Jun 09 22:57:20 2020 +0000
Revision:
2:5828e6917e75
added ventilation files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Clancy_SENDSOR 2:5828e6917e75 1 *********************************************************************/
Clancy_SENDSOR 2:5828e6917e75 2
Clancy_SENDSOR 2:5828e6917e75 3 /* Includes ------------------------------------------------------------------*/
Clancy_SENDSOR 2:5828e6917e75 4 #define EXTERN extern
Clancy_SENDSOR 2:5828e6917e75 5 #include "SS.h"
Clancy_SENDSOR 2:5828e6917e75 6 #include "main.h"
Clancy_SENDSOR 2:5828e6917e75 7 #include "_ss_pwm.h"
Clancy_SENDSOR 2:5828e6917e75 8 #include "_SS_I2CX_Drivers.h"
Clancy_SENDSOR 2:5828e6917e75 9 #include "_SS_I2CX_SDP600.h"
Clancy_SENDSOR 2:5828e6917e75 10 #include "_SS_I2CX_X201641.h"
Clancy_SENDSOR 2:5828e6917e75 11 #include "Ventilation.h"
Clancy_SENDSOR 2:5828e6917e75 12 #include "MotorTempTable.h"
Clancy_SENDSOR 2:5828e6917e75 13 #include "_SS_FlowComputer.h"
Clancy_SENDSOR 2:5828e6917e75 14 #include "_SS_TSI_4040.h"
Clancy_SENDSOR 2:5828e6917e75 15 #include "_SS_Data_Logging.h"
Clancy_SENDSOR 2:5828e6917e75 16 #include "_SS_OnOffActioner.h"
Clancy_SENDSOR 2:5828e6917e75 17 #undef EXTERN
Clancy_SENDSOR 2:5828e6917e75 18
Clancy_SENDSOR 2:5828e6917e75 19 #define INIT_VARIABLES
Clancy_SENDSOR 2:5828e6917e75 20 #define EXTERN
Clancy_SENDSOR 2:5828e6917e75 21 #include "Monitoring.h"
Clancy_SENDSOR 2:5828e6917e75 22 #undef EXTERN
Clancy_SENDSOR 2:5828e6917e75 23 #undef INIT_VARIABLES
Clancy_SENDSOR 2:5828e6917e75 24
Clancy_SENDSOR 2:5828e6917e75 25
Clancy_SENDSOR 2:5828e6917e75 26 // *********************** Register locations **********************************
Clancy_SENDSOR 2:5828e6917e75 27 #define DMA_IFCR1 (*(volatile uint32_t *)0x40020004)
Clancy_SENDSOR 2:5828e6917e75 28 #define DMA_CCR1 (*(volatile uint32_t *)0x40020008)
Clancy_SENDSOR 2:5828e6917e75 29 #define DMA_CNTDR1 (*(volatile uint32_t *)0x4002000c)
Clancy_SENDSOR 2:5828e6917e75 30 #define DMA_CPAR1 (*(volatile uint32_t *)0x40020010)
Clancy_SENDSOR 2:5828e6917e75 31 #define DMA_CMAR1 (*(volatile uint32_t *)0x40020014)
Clancy_SENDSOR 2:5828e6917e75 32
Clancy_SENDSOR 2:5828e6917e75 33 #define ADC1_SR (*(volatile uint32_t *)0x40012400)
Clancy_SENDSOR 2:5828e6917e75 34 #define ADC1_SQR1 (*(volatile uint32_t *)0x4001242C)
Clancy_SENDSOR 2:5828e6917e75 35 #define ADC1_SQR2 (*(volatile uint32_t *)0x40012430)
Clancy_SENDSOR 2:5828e6917e75 36 #define ADC1_SQR3 (*(volatile uint32_t *)0x40012434)
Clancy_SENDSOR 2:5828e6917e75 37 #define ADC1_LTR (*(volatile uint32_t *)0x40012428)
Clancy_SENDSOR 2:5828e6917e75 38 #define ADC1_HTR (*(volatile uint32_t *)0x40012424)
Clancy_SENDSOR 2:5828e6917e75 39 #define ADC1_CR1 (*(volatile uint32_t *)0x40012404)
Clancy_SENDSOR 2:5828e6917e75 40 #define ADC1_CR2 (*(volatile uint32_t *)0x40012408)
Clancy_SENDSOR 2:5828e6917e75 41
Clancy_SENDSOR 2:5828e6917e75 42
Clancy_SENDSOR 2:5828e6917e75 43 // ************************* ADC CONFIGURATION CHANNELS ************************
Clancy_SENDSOR 2:5828e6917e75 44 #define FREE_MEAS_CHANNEL 0
Clancy_SENDSOR 2:5828e6917e75 45 #define PPROX_MEAS_CHANNEL 1
Clancy_SENDSOR 2:5828e6917e75 46 #define CURRENT_MEAS_CHANNEL 2
Clancy_SENDSOR 2:5828e6917e75 47 #define ALIM_24V_MEAS_CHANNEL 6
Clancy_SENDSOR 2:5828e6917e75 48 #define TEMP_PHASE_A 5
Clancy_SENDSOR 2:5828e6917e75 49 #define TEMP_PHASE_B 4
Clancy_SENDSOR 2:5828e6917e75 50 #define TEMP_PHASE_C 3
Clancy_SENDSOR 2:5828e6917e75 51
Clancy_SENDSOR 2:5828e6917e75 52 // ********************* 24V ALARM MANAGEMENT **********************************
Clancy_SENDSOR 2:5828e6917e75 53 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 54
Clancy_SENDSOR 2:5828e6917e75 55 #endif
Clancy_SENDSOR 2:5828e6917e75 56
Clancy_SENDSOR 2:5828e6917e75 57
Clancy_SENDSOR 2:5828e6917e75 58
Clancy_SENDSOR 2:5828e6917e75 59 // ************************ I2C SENSORS MANAGEMENT *****************************
Clancy_SENDSOR 2:5828e6917e75 60 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 61 #define READING_NO_SENSOR 0
Clancy_SENDSOR 2:5828e6917e75 62 #define READING_FLOW_SENSORS 1
Clancy_SENDSOR 2:5828e6917e75 63 //#define READING_PRESSURE_SENSORS 2
Clancy_SENDSOR 2:5828e6917e75 64 #define STOP_READING_FLOW_SENSORS 3
Clancy_SENDSOR 2:5828e6917e75 65 #define START_READING_FLOW_SENSORS 4
Clancy_SENDSOR 2:5828e6917e75 66 #define NUMBER_I2C_REBOOT 3
Clancy_SENDSOR 2:5828e6917e75 67
Clancy_SENDSOR 2:5828e6917e75 68 #define FLOW_SENSOR_READING 0
Clancy_SENDSOR 2:5828e6917e75 69 #define FLOW_SENSOR_OK 1
Clancy_SENDSOR 2:5828e6917e75 70 #define FLOW_SENSOR_FAIL 2
Clancy_SENDSOR 2:5828e6917e75 71 static u8 ucStatusSDP600=FLOW_SENSOR_READING;
Clancy_SENDSOR 2:5828e6917e75 72 static u8 ucStatusX201641=FLOW_SENSOR_READING;
Clancy_SENDSOR 2:5828e6917e75 73
Clancy_SENDSOR 2:5828e6917e75 74 static volatile u8 ucReadingFlowSensor=START_READING_FLOW_SENSORS; // I2Cx sensor managment
Clancy_SENDSOR 2:5828e6917e75 75 static u8 ucCounterFlowErrorMeasurement=0;
Clancy_SENDSOR 2:5828e6917e75 76 static u16 uiTotalCounterFlowErrorMeasurement=0;
Clancy_SENDSOR 2:5828e6917e75 77
Clancy_SENDSOR 2:5828e6917e75 78 #if defined(SDP600_USED_I2C1_BUS) || defined(X201641_USED_I2C1_BUS)
Clancy_SENDSOR 2:5828e6917e75 79 #ifdef DISPLAY_AVERAGE_BLOWER_RAW_FLOW
Clancy_SENDSOR 2:5828e6917e75 80 #define SMOOTH_BLOWER_RAW_FLOW_COUNTER 50
Clancy_SENDSOR 2:5828e6917e75 81 static u16 uiBlowerRAWFlowTemp[SMOOTH_BLOWER_RAW_FLOW_COUNTER];
Clancy_SENDSOR 2:5828e6917e75 82 static u8 ucIndexBlowerRAWFlowSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 83
Clancy_SENDSOR 2:5828e6917e75 84 #define BLOWER_RAW_FLOW_SAMPLES_NUMBER 200
Clancy_SENDSOR 2:5828e6917e75 85 static u32 ulSumBlowerFlowRAWMes=0;
Clancy_SENDSOR 2:5828e6917e75 86 static u16 uiBlowerRAWFlowSamplesCounter=BLOWER_RAW_FLOW_SAMPLES_NUMBER;
Clancy_SENDSOR 2:5828e6917e75 87 #endif
Clancy_SENDSOR 2:5828e6917e75 88
Clancy_SENDSOR 2:5828e6917e75 89 #define SMOOTH_BLOWER_FLOW_LARGE_COUNTER 75//100 // MUST BE HIGHER THAN SMOOTH_BLOWER_FLOW_SMALL_COUNTER
Clancy_SENDSOR 2:5828e6917e75 90 #define SMOOTH_BLOWER_FLOW_SMALL_COUNTER 15 // MUST BE LOWER THAN SMOOTH_BLOWER_FLOW_LARGE_COUNTER
Clancy_SENDSOR 2:5828e6917e75 91 static int16_t iTempBlowerFlowForSmallSmooth[SMOOTH_BLOWER_FLOW_SMALL_COUNTER];
Clancy_SENDSOR 2:5828e6917e75 92 static int16_t iTempBlowerFlowForLargeSmooth[SMOOTH_BLOWER_FLOW_LARGE_COUNTER];
Clancy_SENDSOR 2:5828e6917e75 93 static u8 ucIndexSmallBlowerFlowSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 94 static u8 ucIndexLargeBlowerFlowSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 95
Clancy_SENDSOR 2:5828e6917e75 96 static int16_t idConductancedtSmooth[SMOOTH_BLOWER_FLOW_SMALL_COUNTER];
Clancy_SENDSOR 2:5828e6917e75 97 #endif // (SDP600_USED_I2C1_BUS) || (X201641_USED_I2C1_BUS)
Clancy_SENDSOR 2:5828e6917e75 98 #endif // C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 99
Clancy_SENDSOR 2:5828e6917e75 100
Clancy_SENDSOR 2:5828e6917e75 101
Clancy_SENDSOR 2:5828e6917e75 102 // ****************** PROXIMAL PRESSURE SENSOR MANAGEMENT **********************
Clancy_SENDSOR 2:5828e6917e75 103 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 104 #define SMOOTH_PPROX_PRESSURE_COUNTER 40
Clancy_SENDSOR 2:5828e6917e75 105 static u8 ucIndexPproxPressureSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 106 static u16 uiProximalPressureTemp[SMOOTH_PPROX_PRESSURE_COUNTER];
Clancy_SENDSOR 2:5828e6917e75 107 #endif // C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 108
Clancy_SENDSOR 2:5828e6917e75 109
Clancy_SENDSOR 2:5828e6917e75 110
Clancy_SENDSOR 2:5828e6917e75 111 // ********************* MEASURES MANAGEMENT **********************************
Clancy_SENDSOR 2:5828e6917e75 112 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 113 // ---- Current measurement
Clancy_SENDSOR 2:5828e6917e75 114 static u32 ulSumCurrentADCMesFiltered=0;
Clancy_SENDSOR 2:5828e6917e75 115 static u32 ulCounterADC_FilteredBlowerCurrentMes=0;
Clancy_SENDSOR 2:5828e6917e75 116
Clancy_SENDSOR 2:5828e6917e75 117 // ---- Temperature measurement
Clancy_SENDSOR 2:5828e6917e75 118 static u32 ulADCSumBlowerTemperature=0;
Clancy_SENDSOR 2:5828e6917e75 119 static u16 uiTemperatureSamplesCounter=0;
Clancy_SENDSOR 2:5828e6917e75 120
Clancy_SENDSOR 2:5828e6917e75 121 #ifdef TEMPERATURE_TRENDS
Clancy_SENDSOR 2:5828e6917e75 122 #ifdef USE_FLOW_COMPUTER
Clancy_SENDSOR 2:5828e6917e75 123 #define FLOW_COMPUTER_CYCLE_DETECTION_TIMER 10 // 100ms
Clancy_SENDSOR 2:5828e6917e75 124 static u8 ucFlowComputerCycle=EXPIRATION_CYCLE;
Clancy_SENDSOR 2:5828e6917e75 125 static u16 uiFlowComputerCycleModificationTimer=FLOW_COMPUTER_CYCLE_DETECTION_TIMER;
Clancy_SENDSOR 2:5828e6917e75 126 #else
Clancy_SENDSOR 2:5828e6917e75 127 #define TIME_OUT_TEMPERATURE_MEASUREMENT 6000 // 60s
Clancy_SENDSOR 2:5828e6917e75 128 static u16 uiTimeOutTemperatureMeasurement=0;
Clancy_SENDSOR 2:5828e6917e75 129 #endif // #ifdef USE_FLOW_COMPUTER
Clancy_SENDSOR 2:5828e6917e75 130 static u32 ulADCSumTemperaturePhaseA=0;
Clancy_SENDSOR 2:5828e6917e75 131 static u16 uiADCTemperaturePhaseA;
Clancy_SENDSOR 2:5828e6917e75 132 static u32 ulADCSumTemperaturePhaseB=0;
Clancy_SENDSOR 2:5828e6917e75 133 static u16 uiADCTemperaturePhaseB;
Clancy_SENDSOR 2:5828e6917e75 134 static u32 ulADCSumTemperaturePhaseC=0;
Clancy_SENDSOR 2:5828e6917e75 135 static u16 uiADCTemperaturePhaseC;
Clancy_SENDSOR 2:5828e6917e75 136 #endif
Clancy_SENDSOR 2:5828e6917e75 137
Clancy_SENDSOR 2:5828e6917e75 138 // ---- Blower Speed measurment
Clancy_SENDSOR 2:5828e6917e75 139 static u32 ulSumTachoTicks=0;
Clancy_SENDSOR 2:5828e6917e75 140 static u32 ulCounterAverageMotorSpeed=0;
Clancy_SENDSOR 2:5828e6917e75 141
Clancy_SENDSOR 2:5828e6917e75 142 // --- Blower current Bessel filter
Clancy_SENDSOR 2:5828e6917e75 143 /*static u16 uiCurrentADCMesFilteredPrev2;
Clancy_SENDSOR 2:5828e6917e75 144 static u16 uiCurrentADCMesFilteredPrev1;
Clancy_SENDSOR 2:5828e6917e75 145 static u16 uiCurrentADCMesPrev2;
Clancy_SENDSOR 2:5828e6917e75 146 static u16 uiCurrentADCMesPrev1;
Clancy_SENDSOR 2:5828e6917e75 147 static u16 uiCurrentADCMesFiltered;*/
Clancy_SENDSOR 2:5828e6917e75 148
Clancy_SENDSOR 2:5828e6917e75 149 // --- Motor voltage
Clancy_SENDSOR 2:5828e6917e75 150 static u32 ulSumADC_MotorVoltage;
Clancy_SENDSOR 2:5828e6917e75 151 static u32 ulCounterADC_MotorVoltage;
Clancy_SENDSOR 2:5828e6917e75 152
Clancy_SENDSOR 2:5828e6917e75 153 // --- Temporary measurements
Clancy_SENDSOR 2:5828e6917e75 154 static u16 uiPproxMax;
Clancy_SENDSOR 2:5828e6917e75 155 static u16 uiVtiTemp;
Clancy_SENDSOR 2:5828e6917e75 156 static u16 uiVteTemp;
Clancy_SENDSOR 2:5828e6917e75 157 static u16 uiTiMesTemp;
Clancy_SENDSOR 2:5828e6917e75 158 static u16 uiTeMesTemp;
Clancy_SENDSOR 2:5828e6917e75 159 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 160
Clancy_SENDSOR 2:5828e6917e75 161
Clancy_SENDSOR 2:5828e6917e75 162 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 163 static u8 ucVentilationCycleCopy=INSPIRATION_CYCLE;
Clancy_SENDSOR 2:5828e6917e75 164 static int32_t lSumVti=0;
Clancy_SENDSOR 2:5828e6917e75 165 static int32_t lSumVte=0;
Clancy_SENDSOR 2:5828e6917e75 166 static u8 ucCounterAlarmVteMin=0;
Clancy_SENDSOR 2:5828e6917e75 167 static u8 ucCounterLPAlarm=0;
Clancy_SENDSOR 2:5828e6917e75 168 #endif // C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 169
Clancy_SENDSOR 2:5828e6917e75 170
Clancy_SENDSOR 2:5828e6917e75 171 #define RCC_APB2RSTR (*(volatile uint32_t *)0x4002100c)
Clancy_SENDSOR 2:5828e6917e75 172
Clancy_SENDSOR 2:5828e6917e75 173
Clancy_SENDSOR 2:5828e6917e75 174 // ***************** Functions **********************************************
Clancy_SENDSOR 2:5828e6917e75 175 int16_t ComputeFlowInLitersPerMin(u16 uFlowRAW, bool bPositiveFlow);
Clancy_SENDSOR 2:5828e6917e75 176 void ComputeBlowerPower(void);
Clancy_SENDSOR 2:5828e6917e75 177 u16 ComputeTemperature(u16 uiADCMotorTemp, u16 *puiTempLUT, u16 uiTemperatureGain);
Clancy_SENDSOR 2:5828e6917e75 178
Clancy_SENDSOR 2:5828e6917e75 179
Clancy_SENDSOR 2:5828e6917e75 180 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 181 * Function Name : ADC1_init
Clancy_SENDSOR 2:5828e6917e75 182 * Description : Init ADC1
Clancy_SENDSOR 2:5828e6917e75 183 * Input : None
Clancy_SENDSOR 2:5828e6917e75 184 * Output : None
Clancy_SENDSOR 2:5828e6917e75 185 * Return : None
Clancy_SENDSOR 2:5828e6917e75 186 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 187 void ADC1_init(void)
Clancy_SENDSOR 2:5828e6917e75 188 {
Clancy_SENDSOR 2:5828e6917e75 189 // First perform De_init
Clancy_SENDSOR 2:5828e6917e75 190 DMA_CCR1 &= (uint32_t)(~0x1); // channel 1 disable
Clancy_SENDSOR 2:5828e6917e75 191 DMA_CCR1 = 0; // Reset Channelx control register
Clancy_SENDSOR 2:5828e6917e75 192 DMA_CNTDR1 = 0; // Reset Channelx remaining bytes register
Clancy_SENDSOR 2:5828e6917e75 193 DMA_CPAR1 = 0; // Reset Channelx peripheral address register
Clancy_SENDSOR 2:5828e6917e75 194 DMA_CMAR1 = 0; // Reset Channelx memory address register
Clancy_SENDSOR 2:5828e6917e75 195 DMA_IFCR1 |= DMA_Channel1_IT_Mask; // Reset interrupt pending bits
Clancy_SENDSOR 2:5828e6917e75 196 // end de-init
Clancy_SENDSOR 2:5828e6917e75 197
Clancy_SENDSOR 2:5828e6917e75 198 // Initialise DMA #1
Clancy_SENDSOR 2:5828e6917e75 199 DMA_CPAR1 = (uint32_t)(ADC1_BASE + 0x4c); // base adress of ADC1 ADC_DR register
Clancy_SENDSOR 2:5828e6917e75 200
Clancy_SENDSOR 2:5828e6917e75 201 DMA_CMAR1 = (unsigned long)(&uiADC_Value[0]);
Clancy_SENDSOR 2:5828e6917e75 202 DMA_CNTDR1 = NUMBER_ADC_CONVERSION; // numbers of data to be transfered
Clancy_SENDSOR 2:5828e6917e75 203
Clancy_SENDSOR 2:5828e6917e75 204 DMA_CCR1 = (3<<12) + (1<<10) + (1<<8) + (1<<7) + (1<<5) /*+ (1<<1)*/; // very high priority, mem size 16 bits, periph size 16 bits, mem increase,/* circular enabled*/, /*transfer complete IT*/
Clancy_SENDSOR 2:5828e6917e75 205 DMA_CCR1 |= 1; // channel 1 enable
Clancy_SENDSOR 2:5828e6917e75 206
Clancy_SENDSOR 2:5828e6917e75 207
Clancy_SENDSOR 2:5828e6917e75 208
Clancy_SENDSOR 2:5828e6917e75 209 // De-init of the ADC 1
Clancy_SENDSOR 2:5828e6917e75 210 RCC_APB2RSTR |= RCC_APB2Periph_ADC1; // enable
Clancy_SENDSOR 2:5828e6917e75 211 RCC_APB2RSTR &= ~RCC_APB2Periph_ADC1; // disable
Clancy_SENDSOR 2:5828e6917e75 212 // end De-init of the ADC 1
Clancy_SENDSOR 2:5828e6917e75 213
Clancy_SENDSOR 2:5828e6917e75 214 // Select channels of the regular group
Clancy_SENDSOR 2:5828e6917e75 215 #ifdef TEMPERATURE_TRENDS
Clancy_SENDSOR 2:5828e6917e75 216 ADC1_SQR1 = ((NUMBER_ADC_CONVERSION-1)<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + FREE_MEAS_CHANNEL;
Clancy_SENDSOR 2:5828e6917e75 217 ADC1_SQR2 = (FREE_MEAS_CHANNEL<<25) + (FREE_MEAS_CHANNEL<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + TEMP_PHASE_C;
Clancy_SENDSOR 2:5828e6917e75 218 ADC1_SQR3 = (TEMP_PHASE_B<<25) + (TEMP_PHASE_A<<20) + (FREE_MEAS_CHANNEL<<15) + (CURRENT_MEAS_CHANNEL<<10) + (ALIM_24V_MEAS_CHANNEL<<5) + PPROX_MEAS_CHANNEL;
Clancy_SENDSOR 2:5828e6917e75 219 #else
Clancy_SENDSOR 2:5828e6917e75 220 ADC1_SQR1 = ((NUMBER_ADC_CONVERSION-1)<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + FREE_MEAS_CHANNEL;
Clancy_SENDSOR 2:5828e6917e75 221 ADC1_SQR2 = (FREE_MEAS_CHANNEL<<25) + (FREE_MEAS_CHANNEL<<20) + (FREE_MEAS_CHANNEL<<15) + (FREE_MEAS_CHANNEL<<10) + (FREE_MEAS_CHANNEL<<5) + FREE_MEAS_CHANNEL;
Clancy_SENDSOR 2:5828e6917e75 222 ADC1_SQR3 = (FREE_MEAS_CHANNEL<<25) + (FREE_MEAS_CHANNEL<<20) + (FREE_MEAS_CHANNEL<<15) + (CURRENT_MEAS_CHANNEL<<10) + (ALIM_24V_MEAS_CHANNEL<<5) + PPROX_MEAS_CHANNEL;
Clancy_SENDSOR 2:5828e6917e75 223 #endif
Clancy_SENDSOR 2:5828e6917e75 224
Clancy_SENDSOR 2:5828e6917e75 225 // 21 micros ADC conversion time
Clancy_SENDSOR 2:5828e6917e75 226 ADC1->SMPR2= (7<<27) + (7<<24) + (7<<21) + (7<<18) + (7<<15) + (7<<12) + (7<<9) + (7<<6) + (7<<3) + 7;
Clancy_SENDSOR 2:5828e6917e75 227 ADC1->SMPR1= (7<<21) + (7<<18) + (7<<15) + (7<<12) + (7<<9) + (7<<6) + (7<<3) + 7;
Clancy_SENDSOR 2:5828e6917e75 228
Clancy_SENDSOR 2:5828e6917e75 229 ADC1_CR1 = (1<<8); // Scan mode enabled
Clancy_SENDSOR 2:5828e6917e75 230 ADC1_CR2 = (1<<8); // DMA mode enabled
Clancy_SENDSOR 2:5828e6917e75 231
Clancy_SENDSOR 2:5828e6917e75 232 ADC1_CR2 |= 1; // start ADC1 - power-on
Clancy_SENDSOR 2:5828e6917e75 233
Clancy_SENDSOR 2:5828e6917e75 234 // Delay at least 1uSec for ADC calibration/stabilisation. See ADC documentation
Clancy_SENDSOR 2:5828e6917e75 235 // Stabilization time > 1uS for ADC, between power-on and start of conversion
Clancy_SENDSOR 2:5828e6917e75 236 // Give it 10uSecs just to be sure.
Clancy_SENDSOR 2:5828e6917e75 237 Delay100NS(100);
Clancy_SENDSOR 2:5828e6917e75 238
Clancy_SENDSOR 2:5828e6917e75 239 // Calibration of ADC1
Clancy_SENDSOR 2:5828e6917e75 240 ADC1_CR2 |= (1<<3); // reset calibration registers
Clancy_SENDSOR 2:5828e6917e75 241 ADC1_CR2 |= (1<<2); // Enable calibration
Clancy_SENDSOR 2:5828e6917e75 242 while ((ADC1_CR2 & (1<<2)) == (1<<2)); // Wait end of calibration
Clancy_SENDSOR 2:5828e6917e75 243
Clancy_SENDSOR 2:5828e6917e75 244 ADC1_CR2 |= 1; // start ADC1 - start conversions
Clancy_SENDSOR 2:5828e6917e75 245 }
Clancy_SENDSOR 2:5828e6917e75 246
Clancy_SENDSOR 2:5828e6917e75 247
Clancy_SENDSOR 2:5828e6917e75 248 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 249 * Function Name : CheckAlimMotorVoltage
Clancy_SENDSOR 2:5828e6917e75 250 * Description : Check the voltage range of the 24V power supply
Clancy_SENDSOR 2:5828e6917e75 251 * Input : None
Clancy_SENDSOR 2:5828e6917e75 252 * Output : None
Clancy_SENDSOR 2:5828e6917e75 253 * Return : OPSTATUS_OK or OPSTATUS_FAIL
Clancy_SENDSOR 2:5828e6917e75 254 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 255 opstatus_t CheckAlimMotorVoltage(void)
Clancy_SENDSOR 2:5828e6917e75 256 {
Clancy_SENDSOR 2:5828e6917e75 257 if (uiDCinADCMeas<271 || uiDCinADCMeas>2090)
Clancy_SENDSOR 2:5828e6917e75 258 return(OPSTATUS_FAIL); // <12V or >24V
Clancy_SENDSOR 2:5828e6917e75 259 return(OPSTATUS_OK);
Clancy_SENDSOR 2:5828e6917e75 260 }
Clancy_SENDSOR 2:5828e6917e75 261
Clancy_SENDSOR 2:5828e6917e75 262
Clancy_SENDSOR 2:5828e6917e75 263 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 264 * Function Name : Compute24VMeasure
Clancy_SENDSOR 2:5828e6917e75 265 * Description : Compute the 24V measure
Clancy_SENDSOR 2:5828e6917e75 266 * Input : None
Clancy_SENDSOR 2:5828e6917e75 267 * Output : None
Clancy_SENDSOR 2:5828e6917e75 268 * Return : OPSTATUS_OK or OPSTATUS_FAIL
Clancy_SENDSOR 2:5828e6917e75 269 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 270 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 271 void Compute24VMeasure(void)
Clancy_SENDSOR 2:5828e6917e75 272 {
Clancy_SENDSOR 2:5828e6917e75 273 u32 ulTemp;
Clancy_SENDSOR 2:5828e6917e75 274 u16 uiADC_BlowerVoltage;
Clancy_SENDSOR 2:5828e6917e75 275
Clancy_SENDSOR 2:5828e6917e75 276 if (bMemoStartVentilation==TRUE)
Clancy_SENDSOR 2:5828e6917e75 277 uiADC_BlowerVoltage=uiAverageADC_MotorVoltage;
Clancy_SENDSOR 2:5828e6917e75 278 else
Clancy_SENDSOR 2:5828e6917e75 279 uiADC_BlowerVoltage=uiDCinADCMeas;
Clancy_SENDSOR 2:5828e6917e75 280
Clancy_SENDSOR 2:5828e6917e75 281 ulTemp=((u32)uiADC_BlowerVoltage*100)/1452;
Clancy_SENDSOR 2:5828e6917e75 282 ulTemp+=100;
Clancy_SENDSOR 2:5828e6917e75 283 uiTechnicalDataMes[MOTOR_VOLTAGE_TEC_MES]=(u16)ulTemp;
Clancy_SENDSOR 2:5828e6917e75 284 uiMotorVoltageMes=(u16)ulTemp;
Clancy_SENDSOR 2:5828e6917e75 285 }
Clancy_SENDSOR 2:5828e6917e75 286 #endif
Clancy_SENDSOR 2:5828e6917e75 287
Clancy_SENDSOR 2:5828e6917e75 288 void GetFirstMotorVoltageReading(void)
Clancy_SENDSOR 2:5828e6917e75 289 {
Clancy_SENDSOR 2:5828e6917e75 290 uiAverageADC_MotorVoltage=uiDCinADCMeas;
Clancy_SENDSOR 2:5828e6917e75 291 }
Clancy_SENDSOR 2:5828e6917e75 292 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 293 * Function Name : ComputeBlowerPower
Clancy_SENDSOR 2:5828e6917e75 294 * Description : Compute the power of the blower
Clancy_SENDSOR 2:5828e6917e75 295 * Input : None
Clancy_SENDSOR 2:5828e6917e75 296 * Output : None
Clancy_SENDSOR 2:5828e6917e75 297 * Return : OPSTATUS_OK or OPSTATUS_FAIL
Clancy_SENDSOR 2:5828e6917e75 298 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 299 void ComputeBlowerPower(void)
Clancy_SENDSOR 2:5828e6917e75 300 {
Clancy_SENDSOR 2:5828e6917e75 301 uiTechnicalDataMes[MOTOR_POWER_TEC_MES]=((u32)uiMotorVoltageMes*uiBlowerCurrentMes)/10;
Clancy_SENDSOR 2:5828e6917e75 302 }
Clancy_SENDSOR 2:5828e6917e75 303
Clancy_SENDSOR 2:5828e6917e75 304 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 305 * Function Name : SpeedMeasurement
Clancy_SENDSOR 2:5828e6917e75 306 * Description : Return blower speed
Clancy_SENDSOR 2:5828e6917e75 307 * Input : Tacho counter
Clancy_SENDSOR 2:5828e6917e75 308 * Output : None
Clancy_SENDSOR 2:5828e6917e75 309 * Return : Blower speed in RPM
Clancy_SENDSOR 2:5828e6917e75 310 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 311 u16 SpeedMeasurement(u16 uiTachoCounter)
Clancy_SENDSOR 2:5828e6917e75 312 {
Clancy_SENDSOR 2:5828e6917e75 313 u16 uiSpeedTemp=65500;
Clancy_SENDSOR 2:5828e6917e75 314
Clancy_SENDSOR 2:5828e6917e75 315 if (uiTachoCounter>915)
Clancy_SENDSOR 2:5828e6917e75 316 uiSpeedTemp=(u16)(60000000UL/uiTachoCounter);
Clancy_SENDSOR 2:5828e6917e75 317
Clancy_SENDSOR 2:5828e6917e75 318 return(uiSpeedTemp);
Clancy_SENDSOR 2:5828e6917e75 319 }
Clancy_SENDSOR 2:5828e6917e75 320
Clancy_SENDSOR 2:5828e6917e75 321
Clancy_SENDSOR 2:5828e6917e75 322 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 323 * Function Name : ReadADCInputs
Clancy_SENDSOR 2:5828e6917e75 324 * Description : Read all ADC input (function calls every 1ms)
Clancy_SENDSOR 2:5828e6917e75 325 * Input : None
Clancy_SENDSOR 2:5828e6917e75 326 * Output : None
Clancy_SENDSOR 2:5828e6917e75 327 * Return : None
Clancy_SENDSOR 2:5828e6917e75 328 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 329 void ReadADCInputs(void)
Clancy_SENDSOR 2:5828e6917e75 330 {
Clancy_SENDSOR 2:5828e6917e75 331 //u32 ulTerm1, ulTerm2, ulTerm3, ulTerm4, ulTerm5;
Clancy_SENDSOR 2:5828e6917e75 332
Clancy_SENDSOR 2:5828e6917e75 333 // ADC Pprox measurement
Clancy_SENDSOR 2:5828e6917e75 334 uiProximalPressureADCMes=uiADC_Value[ADC_PPROX_MES];
Clancy_SENDSOR 2:5828e6917e75 335
Clancy_SENDSOR 2:5828e6917e75 336 // ADC DCin measurement
Clancy_SENDSOR 2:5828e6917e75 337 uiDCinADCMeas=uiADC_Value[ADC_DCIN_MES];
Clancy_SENDSOR 2:5828e6917e75 338
Clancy_SENDSOR 2:5828e6917e75 339 // ADC Blower current measurement
Clancy_SENDSOR 2:5828e6917e75 340 ComputeADCBlowerCurrent(FALSE);
Clancy_SENDSOR 2:5828e6917e75 341
Clancy_SENDSOR 2:5828e6917e75 342 // ADC Free measurement
Clancy_SENDSOR 2:5828e6917e75 343 uiADCBlowerTemperatureMeas=uiADC_Value[ADC_FREE_MES];
Clancy_SENDSOR 2:5828e6917e75 344
Clancy_SENDSOR 2:5828e6917e75 345 #ifdef TEMPERATURE_TRENDS
Clancy_SENDSOR 2:5828e6917e75 346 uiADCTemperaturePhaseA=uiADC_Value[ADC_TEMP_PHASE_A];
Clancy_SENDSOR 2:5828e6917e75 347 uiADCTemperaturePhaseB=uiADC_Value[ADC_TEMP_PHASE_B];
Clancy_SENDSOR 2:5828e6917e75 348 uiADCTemperaturePhaseC=uiADC_Value[ADC_TEMP_PHASE_C];
Clancy_SENDSOR 2:5828e6917e75 349 #endif
Clancy_SENDSOR 2:5828e6917e75 350
Clancy_SENDSOR 2:5828e6917e75 351 // 2nd order Bessel Filter (Fcut-out=36Hz, sample rate=1KHz)
Clancy_SENDSOR 2:5828e6917e75 352 /*ulTerm1=(919UL*uiADCBlowerCurrent)>>6;
Clancy_SENDSOR 2:5828e6917e75 353 ulTerm2=(919UL*uiCurrentADCMesPrev1)>>5;
Clancy_SENDSOR 2:5828e6917e75 354 ulTerm3=(919UL*uiCurrentADCMesPrev2)>>6;
Clancy_SENDSOR 2:5828e6917e75 355 ulTerm4=(1427UL*uiCurrentADCMesFilteredPrev1)>>1;
Clancy_SENDSOR 2:5828e6917e75 356 ulTerm5=259UL*uiCurrentADCMesFilteredPrev2;
Clancy_SENDSOR 2:5828e6917e75 357
Clancy_SENDSOR 2:5828e6917e75 358 uiCurrentADCMesFiltered=(ulTerm1+ulTerm2+ulTerm3+ulTerm4-ulTerm5)>>9;
Clancy_SENDSOR 2:5828e6917e75 359 uiCurrentADCMesFilteredPrev2=uiCurrentADCMesFilteredPrev1;
Clancy_SENDSOR 2:5828e6917e75 360 uiCurrentADCMesFilteredPrev1=uiCurrentADCMesFiltered;
Clancy_SENDSOR 2:5828e6917e75 361 uiCurrentADCMesPrev2=uiCurrentADCMesPrev1;
Clancy_SENDSOR 2:5828e6917e75 362 uiCurrentADCMesPrev1=uiADCBlowerCurrent;*/
Clancy_SENDSOR 2:5828e6917e75 363
Clancy_SENDSOR 2:5828e6917e75 364
Clancy_SENDSOR 2:5828e6917e75 365 // 2nd order Bessel Filter (Fcut-out=150Hz, sample rate=1KHz)
Clancy_SENDSOR 2:5828e6917e75 366 /*ulTerm1=(1929UL*uiADCBlowerCurrent)>>1;
Clancy_SENDSOR 2:5828e6917e75 367 ulTerm2=(1929UL*uiCurrentADCMesPrev1);
Clancy_SENDSOR 2:5828e6917e75 368 ulTerm3=(1929UL*uiCurrentADCMesPrev2)>>1;
Clancy_SENDSOR 2:5828e6917e75 369 ulTerm4=(1095UL*uiCurrentADCMesFilteredPrev1)>>1;
Clancy_SENDSOR 2:5828e6917e75 370 ulTerm5=(2479UL*uiCurrentADCMesFilteredPrev2)>>3;
Clancy_SENDSOR 2:5828e6917e75 371
Clancy_SENDSOR 2:5828e6917e75 372 uiCurrentADCMesFiltered=(ulTerm1+ulTerm2+ulTerm3+ulTerm4-ulTerm5)>>12;
Clancy_SENDSOR 2:5828e6917e75 373 uiCurrentADCMesFilteredPrev2=uiCurrentADCMesFilteredPrev1;
Clancy_SENDSOR 2:5828e6917e75 374 uiCurrentADCMesFilteredPrev1=uiCurrentADCMesFiltered;
Clancy_SENDSOR 2:5828e6917e75 375 uiCurrentADCMesPrev2=uiCurrentADCMesPrev1;
Clancy_SENDSOR 2:5828e6917e75 376 uiCurrentADCMesPrev1=uiADCBlowerCurrent;*/
Clancy_SENDSOR 2:5828e6917e75 377
Clancy_SENDSOR 2:5828e6917e75 378 // --- Start new conversions
Clancy_SENDSOR 2:5828e6917e75 379 ADC1->CR2 |= 1;
Clancy_SENDSOR 2:5828e6917e75 380 }
Clancy_SENDSOR 2:5828e6917e75 381
Clancy_SENDSOR 2:5828e6917e75 382 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 383 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 384 * Function Name : ComputeMeasurements
Clancy_SENDSOR 2:5828e6917e75 385 * Description : Compute different measures
Clancy_SENDSOR 2:5828e6917e75 386 * Input : None
Clancy_SENDSOR 2:5828e6917e75 387 * Output : None
Clancy_SENDSOR 2:5828e6917e75 388 * Return : None
Clancy_SENDSOR 2:5828e6917e75 389 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 390 void ComputeMeasurements(void)
Clancy_SENDSOR 2:5828e6917e75 391 {
Clancy_SENDSOR 2:5828e6917e75 392 // ---------------------- Measure Current (A) ----------------------------
Clancy_SENDSOR 2:5828e6917e75 393 uiBlowerCurrentMes=ComputeBlowerCurrentInAmper(uiADCBlowerCurrent);
Clancy_SENDSOR 2:5828e6917e75 394
Clancy_SENDSOR 2:5828e6917e75 395 // -------------------- Compute motor voltage (V) ------------------------
Clancy_SENDSOR 2:5828e6917e75 396 Compute24VMeasure();
Clancy_SENDSOR 2:5828e6917e75 397 ComputeBlowerPower();
Clancy_SENDSOR 2:5828e6917e75 398
Clancy_SENDSOR 2:5828e6917e75 399 // ---------------------- Others measurements ----------------------------
Clancy_SENDSOR 2:5828e6917e75 400 if (bMemoStartVentilation==TRUE)
Clancy_SENDSOR 2:5828e6917e75 401 {
Clancy_SENDSOR 2:5828e6917e75 402 // --- Motor speed (RPM) (every 10ms)
Clancy_SENDSOR 2:5828e6917e75 403 uiBlowerSpeedMes=SpeedMeasurement(uiTachoTimeTicks);
Clancy_SENDSOR 2:5828e6917e75 404 }
Clancy_SENDSOR 2:5828e6917e75 405 }
Clancy_SENDSOR 2:5828e6917e75 406 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 407
Clancy_SENDSOR 2:5828e6917e75 408
Clancy_SENDSOR 2:5828e6917e75 409 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 410 #ifdef TEMPERATURE_TRENDS
Clancy_SENDSOR 2:5828e6917e75 411 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 412 * Function Name : ComputeAverageOnMeasurements
Clancy_SENDSOR 2:5828e6917e75 413 * Description : Average differents mesures : MUST BE CALLED EVERY 10ms
Clancy_SENDSOR 2:5828e6917e75 414 * Input : None
Clancy_SENDSOR 2:5828e6917e75 415 * Output : None
Clancy_SENDSOR 2:5828e6917e75 416 * Return : None
Clancy_SENDSOR 2:5828e6917e75 417 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 418 void ComputeAverageOnMeasurements(void)
Clancy_SENDSOR 2:5828e6917e75 419 {
Clancy_SENDSOR 2:5828e6917e75 420 #ifdef USE_FLOW_COMPUTER
Clancy_SENDSOR 2:5828e6917e75 421 // ----------- USE THE FLOW COMPUTER TO DETECT CYCLE ----------------
Clancy_SENDSOR 2:5828e6917e75 422 u16 uiDummy;
Clancy_SENDSOR 2:5828e6917e75 423 opstatus_t opstatus;
Clancy_SENDSOR 2:5828e6917e75 424
Clancy_SENDSOR 2:5828e6917e75 425 // Read new flow from flow computer every 10ms
Clancy_SENDSOR 2:5828e6917e75 426 opstatus=SS_Xgetw(flc, &uiDummy);
Clancy_SENDSOR 2:5828e6917e75 427 if (opstatus==OPSTATUS_OK)
Clancy_SENDSOR 2:5828e6917e75 428 {
Clancy_SENDSOR 2:5828e6917e75 429 // Update flow/pressure displayed
Clancy_SENDSOR 2:5828e6917e75 430 uiBlowerFlow=iFlowFromFlowComputer*10;
Clancy_SENDSOR 2:5828e6917e75 431 uiPoutPressureMes=uiPressureFromFlowComputer;
Clancy_SENDSOR 2:5828e6917e75 432
Clancy_SENDSOR 2:5828e6917e75 433 // Comm with flow computer OK !!
Clancy_SENDSOR 2:5828e6917e75 434 #ifdef DATA_LOGGING
Clancy_SENDSOR 2:5828e6917e75 435 if (bRecordTemperatureTrendsAllowed==FALSE)
Clancy_SENDSOR 2:5828e6917e75 436 {
Clancy_SENDSOR 2:5828e6917e75 437 bRecordTemperatureTrendsAllowed=TRUE;
Clancy_SENDSOR 2:5828e6917e75 438 uiTrendsSampleTime=RECORD_TRENDS_SAMPLE_TIME;
Clancy_SENDSOR 2:5828e6917e75 439 }
Clancy_SENDSOR 2:5828e6917e75 440 #endif // DATA_LOGGING
Clancy_SENDSOR 2:5828e6917e75 441
Clancy_SENDSOR 2:5828e6917e75 442 // inspiration/expiration cycle detection
Clancy_SENDSOR 2:5828e6917e75 443 if (ucFlowComputerCycle==EXPIRATION_CYCLE)
Clancy_SENDSOR 2:5828e6917e75 444 {
Clancy_SENDSOR 2:5828e6917e75 445 // Inspiration detection
Clancy_SENDSOR 2:5828e6917e75 446 if (iFlowFromFlowComputer>50) // 5l/min
Clancy_SENDSOR 2:5828e6917e75 447 {
Clancy_SENDSOR 2:5828e6917e75 448 uiFlowComputerCycleModificationTimer--;
Clancy_SENDSOR 2:5828e6917e75 449 if (uiFlowComputerCycleModificationTimer==0)
Clancy_SENDSOR 2:5828e6917e75 450 {
Clancy_SENDSOR 2:5828e6917e75 451 ucFlowComputerCycle=INSPIRATION_CYCLE;
Clancy_SENDSOR 2:5828e6917e75 452
Clancy_SENDSOR 2:5828e6917e75 453 // Compute temperature of the previous inspiratory cycle
Clancy_SENDSOR 2:5828e6917e75 454 if (uiTemperatureSamplesCounter!=0)
Clancy_SENDSOR 2:5828e6917e75 455 {
Clancy_SENDSOR 2:5828e6917e75 456 uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(ulADCSumBlowerTemperature/uiTemperatureSamplesCounter);
Clancy_SENDSOR 2:5828e6917e75 457 uiADCAverageTemperaturePhaseA=ulADCSumTemperaturePhaseA/uiTemperatureSamplesCounter;
Clancy_SENDSOR 2:5828e6917e75 458 uiADCAverageTemperaturePhaseB=ulADCSumTemperaturePhaseB/uiTemperatureSamplesCounter;
Clancy_SENDSOR 2:5828e6917e75 459 uiADCAverageTemperaturePhaseC=ulADCSumTemperaturePhaseC/uiTemperatureSamplesCounter;
Clancy_SENDSOR 2:5828e6917e75 460 }
Clancy_SENDSOR 2:5828e6917e75 461 ulADCSumBlowerTemperature=0;
Clancy_SENDSOR 2:5828e6917e75 462 ulADCSumTemperaturePhaseA=0;
Clancy_SENDSOR 2:5828e6917e75 463 ulADCSumTemperaturePhaseB=0;
Clancy_SENDSOR 2:5828e6917e75 464 ulADCSumTemperaturePhaseC=0;
Clancy_SENDSOR 2:5828e6917e75 465 uiTemperatureSamplesCounter=0;
Clancy_SENDSOR 2:5828e6917e75 466 }
Clancy_SENDSOR 2:5828e6917e75 467 }
Clancy_SENDSOR 2:5828e6917e75 468 else
Clancy_SENDSOR 2:5828e6917e75 469 uiFlowComputerCycleModificationTimer=FLOW_COMPUTER_CYCLE_DETECTION_TIMER;
Clancy_SENDSOR 2:5828e6917e75 470 }
Clancy_SENDSOR 2:5828e6917e75 471 else
Clancy_SENDSOR 2:5828e6917e75 472 {
Clancy_SENDSOR 2:5828e6917e75 473 // Record temperature as long as the flow is positive
Clancy_SENDSOR 2:5828e6917e75 474 if (iFlowFromFlowComputer>(-10)) // >-1l/min
Clancy_SENDSOR 2:5828e6917e75 475 {
Clancy_SENDSOR 2:5828e6917e75 476 ulADCSumBlowerTemperature+=uiADCBlowerTemperatureMeas;
Clancy_SENDSOR 2:5828e6917e75 477 ulADCSumTemperaturePhaseA+=uiADCTemperaturePhaseA;
Clancy_SENDSOR 2:5828e6917e75 478 ulADCSumTemperaturePhaseB+=uiADCTemperaturePhaseB;
Clancy_SENDSOR 2:5828e6917e75 479 ulADCSumTemperaturePhaseC+=uiADCTemperaturePhaseC;
Clancy_SENDSOR 2:5828e6917e75 480 uiTemperatureSamplesCounter++;
Clancy_SENDSOR 2:5828e6917e75 481 }
Clancy_SENDSOR 2:5828e6917e75 482
Clancy_SENDSOR 2:5828e6917e75 483 // Expiration detection
Clancy_SENDSOR 2:5828e6917e75 484 if (iFlowFromFlowComputer<(-50)) // <-5l/min
Clancy_SENDSOR 2:5828e6917e75 485 {
Clancy_SENDSOR 2:5828e6917e75 486 uiFlowComputerCycleModificationTimer--;
Clancy_SENDSOR 2:5828e6917e75 487 if (uiFlowComputerCycleModificationTimer==0)
Clancy_SENDSOR 2:5828e6917e75 488 ucFlowComputerCycle=EXPIRATION_CYCLE;
Clancy_SENDSOR 2:5828e6917e75 489 }
Clancy_SENDSOR 2:5828e6917e75 490 else
Clancy_SENDSOR 2:5828e6917e75 491 uiFlowComputerCycleModificationTimer=FLOW_COMPUTER_CYCLE_DETECTION_TIMER;
Clancy_SENDSOR 2:5828e6917e75 492 }
Clancy_SENDSOR 2:5828e6917e75 493 }
Clancy_SENDSOR 2:5828e6917e75 494 else if (opstatus==OPSTATUS_FAIL)
Clancy_SENDSOR 2:5828e6917e75 495 {
Clancy_SENDSOR 2:5828e6917e75 496 // Comm Failure with flow computer => no data recorded
Clancy_SENDSOR 2:5828e6917e75 497 uiBlowerFlow=0;
Clancy_SENDSOR 2:5828e6917e75 498 uiPoutPressureMes=0;
Clancy_SENDSOR 2:5828e6917e75 499
Clancy_SENDSOR 2:5828e6917e75 500 #ifdef DATA_LOGGING
Clancy_SENDSOR 2:5828e6917e75 501 bRecordTemperatureTrendsAllowed=FALSE;
Clancy_SENDSOR 2:5828e6917e75 502 #endif
Clancy_SENDSOR 2:5828e6917e75 503 uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=0;
Clancy_SENDSOR 2:5828e6917e75 504 }
Clancy_SENDSOR 2:5828e6917e75 505 #else
Clancy_SENDSOR 2:5828e6917e75 506 // ----------- USE THE 24V MEASURE TO DETECT CYCLE ----------------
Clancy_SENDSOR 2:5828e6917e75 507 if (uiDCinADCMeas>500)
Clancy_SENDSOR 2:5828e6917e75 508 {
Clancy_SENDSOR 2:5828e6917e75 509 // Inspiration
Clancy_SENDSOR 2:5828e6917e75 510 ulADCSumBlowerTemperature+=uiADCBlowerTemperatureMeas;
Clancy_SENDSOR 2:5828e6917e75 511 ulADCSumTemperaturePhaseA+=uiADCTemperaturePhaseA;
Clancy_SENDSOR 2:5828e6917e75 512 ulADCSumTemperaturePhaseB+=uiADCTemperaturePhaseB;
Clancy_SENDSOR 2:5828e6917e75 513 ulADCSumTemperaturePhaseC+=uiADCTemperaturePhaseC;
Clancy_SENDSOR 2:5828e6917e75 514 uiTemperatureSamplesCounter++;
Clancy_SENDSOR 2:5828e6917e75 515 uiTimeOutTemperatureMeasurement=TIME_OUT_TEMPERATURE_MEASUREMENT;
Clancy_SENDSOR 2:5828e6917e75 516 #ifdef DATA_LOGGING
Clancy_SENDSOR 2:5828e6917e75 517 bRecordTemperatureTrendsAllowed=TRUE;
Clancy_SENDSOR 2:5828e6917e75 518 #endif
Clancy_SENDSOR 2:5828e6917e75 519 }
Clancy_SENDSOR 2:5828e6917e75 520 else if (uiTimeOutTemperatureMeasurement!=0)
Clancy_SENDSOR 2:5828e6917e75 521 {
Clancy_SENDSOR 2:5828e6917e75 522 // Expiration
Clancy_SENDSOR 2:5828e6917e75 523 uiTimeOutTemperatureMeasurement--;
Clancy_SENDSOR 2:5828e6917e75 524 if (uiTemperatureSamplesCounter!=0)
Clancy_SENDSOR 2:5828e6917e75 525 {
Clancy_SENDSOR 2:5828e6917e75 526 uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(ulADCSumBlowerTemperature/uiTemperatureSamplesCounter);
Clancy_SENDSOR 2:5828e6917e75 527 uiADCAverageTemperaturePhaseA=ulADCSumTemperaturePhaseA/uiTemperatureSamplesCounter;
Clancy_SENDSOR 2:5828e6917e75 528 uiADCAverageTemperaturePhaseB=ulADCSumTemperaturePhaseB/uiTemperatureSamplesCounter;
Clancy_SENDSOR 2:5828e6917e75 529 uiADCAverageTemperaturePhaseC=ulADCSumTemperaturePhaseC/uiTemperatureSamplesCounter;
Clancy_SENDSOR 2:5828e6917e75 530 }
Clancy_SENDSOR 2:5828e6917e75 531 ulADCSumBlowerTemperature=0;
Clancy_SENDSOR 2:5828e6917e75 532 ulADCSumTemperaturePhaseA=0;
Clancy_SENDSOR 2:5828e6917e75 533 ulADCSumTemperaturePhaseB=0;
Clancy_SENDSOR 2:5828e6917e75 534 ulADCSumTemperaturePhaseC=0;
Clancy_SENDSOR 2:5828e6917e75 535 uiTemperatureSamplesCounter=0;
Clancy_SENDSOR 2:5828e6917e75 536 }
Clancy_SENDSOR 2:5828e6917e75 537 else
Clancy_SENDSOR 2:5828e6917e75 538 {
Clancy_SENDSOR 2:5828e6917e75 539 uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=0;
Clancy_SENDSOR 2:5828e6917e75 540
Clancy_SENDSOR 2:5828e6917e75 541 ulADCSumBlowerTemperature=0;
Clancy_SENDSOR 2:5828e6917e75 542 ulADCSumTemperaturePhaseA=0;
Clancy_SENDSOR 2:5828e6917e75 543 ulADCSumTemperaturePhaseB=0;
Clancy_SENDSOR 2:5828e6917e75 544 ulADCSumTemperaturePhaseC=0;
Clancy_SENDSOR 2:5828e6917e75 545 uiTemperatureSamplesCounter=0;
Clancy_SENDSOR 2:5828e6917e75 546
Clancy_SENDSOR 2:5828e6917e75 547 #ifdef DATA_LOGGING
Clancy_SENDSOR 2:5828e6917e75 548 bRecordTemperatureTrendsAllowed=FALSE;
Clancy_SENDSOR 2:5828e6917e75 549 #endif
Clancy_SENDSOR 2:5828e6917e75 550 }
Clancy_SENDSOR 2:5828e6917e75 551 #endif // #ifdef USE_FLOW_COMPUTER
Clancy_SENDSOR 2:5828e6917e75 552 }
Clancy_SENDSOR 2:5828e6917e75 553 #endif // #ifdef TEMPERATURE_TRENDS
Clancy_SENDSOR 2:5828e6917e75 554 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 555
Clancy_SENDSOR 2:5828e6917e75 556
Clancy_SENDSOR 2:5828e6917e75 557 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 558 * Function Name : ComputeADCBlowerCurrent
Clancy_SENDSOR 2:5828e6917e75 559 * Description : Compute the average current during a PWM cycle (20micros)
Clancy_SENDSOR 2:5828e6917e75 560 * Input : bRecordCurrentOffset
Clancy_SENDSOR 2:5828e6917e75 561 * Output : None
Clancy_SENDSOR 2:5828e6917e75 562 * Return : None
Clancy_SENDSOR 2:5828e6917e75 563 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 564 void ComputeADCBlowerCurrent(bool bRecordCurrentOffset)
Clancy_SENDSOR 2:5828e6917e75 565 {
Clancy_SENDSOR 2:5828e6917e75 566 if (bRecordCurrentOffset==TRUE)
Clancy_SENDSOR 2:5828e6917e75 567 {
Clancy_SENDSOR 2:5828e6917e75 568 uiADCOffsetBlowerCurrent=uiADCBlowerCurrent=uiADC_Value[ADC_CURRENT_MES];
Clancy_SENDSOR 2:5828e6917e75 569 }
Clancy_SENDSOR 2:5828e6917e75 570 else
Clancy_SENDSOR 2:5828e6917e75 571 {
Clancy_SENDSOR 2:5828e6917e75 572 uiADCBlowerCurrent=uiADC_Value[ADC_CURRENT_MES];
Clancy_SENDSOR 2:5828e6917e75 573 }
Clancy_SENDSOR 2:5828e6917e75 574 }
Clancy_SENDSOR 2:5828e6917e75 575
Clancy_SENDSOR 2:5828e6917e75 576
Clancy_SENDSOR 2:5828e6917e75 577 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 578 * Function Name : ComputeBlowerCurrentInAmper
Clancy_SENDSOR 2:5828e6917e75 579 * Description : Return blower current value in cAmper (ex: 100=1.00A)
Clancy_SENDSOR 2:5828e6917e75 580 * Input : ADC value
Clancy_SENDSOR 2:5828e6917e75 581 * Output : None
Clancy_SENDSOR 2:5828e6917e75 582 * Return : Blower current in cAmper (ex: 100=1.00A)
Clancy_SENDSOR 2:5828e6917e75 583 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 584 int16_t ComputeBlowerCurrentInAmper(u16 uiADCBlowerCurrentLocal)
Clancy_SENDSOR 2:5828e6917e75 585 {
Clancy_SENDSOR 2:5828e6917e75 586 int32_t lTempValue;
Clancy_SENDSOR 2:5828e6917e75 587
Clancy_SENDSOR 2:5828e6917e75 588 // Computation using MOT_CUR_MEAS2
Clancy_SENDSOR 2:5828e6917e75 589 lTempValue=(int32_t)uiADCBlowerCurrentLocal-(int32_t)uiADCOffsetBlowerCurrent;
Clancy_SENDSOR 2:5828e6917e75 590 lTempValue*=1000;
Clancy_SENDSOR 2:5828e6917e75 591 lTempValue/=uiTechnicalDataSet[GAIN_BLOWER_CURRENT_TEC];
Clancy_SENDSOR 2:5828e6917e75 592 return(lTempValue);
Clancy_SENDSOR 2:5828e6917e75 593 }
Clancy_SENDSOR 2:5828e6917e75 594
Clancy_SENDSOR 2:5828e6917e75 595
Clancy_SENDSOR 2:5828e6917e75 596 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 597 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 598 * Function Name : LaunchFlowReadingOnI2CBus
Clancy_SENDSOR 2:5828e6917e75 599 * Description : Open and Read the flow sensor(s) on the I2C bus
Clancy_SENDSOR 2:5828e6917e75 600 * Input : None
Clancy_SENDSOR 2:5828e6917e75 601 * Output : None
Clancy_SENDSOR 2:5828e6917e75 602 * Return : None
Clancy_SENDSOR 2:5828e6917e75 603 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 604 void LaunchFlowReadingOnI2CBus(void)
Clancy_SENDSOR 2:5828e6917e75 605 {
Clancy_SENDSOR 2:5828e6917e75 606 opstatus_t byOpStatus;
Clancy_SENDSOR 2:5828e6917e75 607 u16 uiSensorErr;
Clancy_SENDSOR 2:5828e6917e75 608
Clancy_SENDSOR 2:5828e6917e75 609 if (fOpenI2C1SDP600Sensors==FALSE || fOpenI2C2SDP600Sensors==FALSE ||
Clancy_SENDSOR 2:5828e6917e75 610 fOpenI2C1X201641Sensors==FALSE || fOpenI2C2X201641Sensors==FALSE)
Clancy_SENDSOR 2:5828e6917e75 611 {
Clancy_SENDSOR 2:5828e6917e75 612 byOpStatus=SS_Xopen(I2C_SDP600);
Clancy_SENDSOR 2:5828e6917e75 613 if (byOpStatus==OPSTATUS_FAIL)
Clancy_SENDSOR 2:5828e6917e75 614 uiFlagsAlarm[ALARM_FLAGS2]|=FLOW_SENSOR_FAILURE_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 615
Clancy_SENDSOR 2:5828e6917e75 616 byOpStatus=SS_Xopen(I2C_X201641);
Clancy_SENDSOR 2:5828e6917e75 617 if (byOpStatus==OPSTATUS_FAIL)
Clancy_SENDSOR 2:5828e6917e75 618 uiFlagsAlarm[ALARM_FLAGS2]|=FLOW_SENSOR_FAILURE_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 619
Clancy_SENDSOR 2:5828e6917e75 620 ucReadingFlowSensor=STOP_READING_FLOW_SENSORS;
Clancy_SENDSOR 2:5828e6917e75 621 }
Clancy_SENDSOR 2:5828e6917e75 622 else if (ucReadingFlowSensor==STOP_READING_FLOW_SENSORS)
Clancy_SENDSOR 2:5828e6917e75 623 {
Clancy_SENDSOR 2:5828e6917e75 624 ucReadingFlowSensor=START_READING_FLOW_SENSORS;
Clancy_SENDSOR 2:5828e6917e75 625 }
Clancy_SENDSOR 2:5828e6917e75 626 else if (ucReadingFlowSensor==READING_FLOW_SENSORS)
Clancy_SENDSOR 2:5828e6917e75 627 {
Clancy_SENDSOR 2:5828e6917e75 628 // Reading SDP600 Flow sensors
Clancy_SENDSOR 2:5828e6917e75 629 if (ucStatusSDP600==FLOW_SENSOR_READING)
Clancy_SENDSOR 2:5828e6917e75 630 {
Clancy_SENDSOR 2:5828e6917e75 631 byOpStatus=SS_Xgetw(I2C_SDP600, &uiSensorErr);
Clancy_SENDSOR 2:5828e6917e75 632 if (byOpStatus==OPSTATUS_OK)
Clancy_SENDSOR 2:5828e6917e75 633 ucStatusSDP600=FLOW_SENSOR_OK;
Clancy_SENDSOR 2:5828e6917e75 634 else if (byOpStatus==OPSTATUS_FAIL)
Clancy_SENDSOR 2:5828e6917e75 635 ucStatusSDP600=FLOW_SENSOR_FAIL;
Clancy_SENDSOR 2:5828e6917e75 636 }
Clancy_SENDSOR 2:5828e6917e75 637
Clancy_SENDSOR 2:5828e6917e75 638 // Reading X201641 Flow sensors
Clancy_SENDSOR 2:5828e6917e75 639 if (ucStatusX201641==FLOW_SENSOR_READING)
Clancy_SENDSOR 2:5828e6917e75 640 {
Clancy_SENDSOR 2:5828e6917e75 641 byOpStatus=SS_Xgetw(I2C_X201641, &uiSensorErr);
Clancy_SENDSOR 2:5828e6917e75 642 if (byOpStatus==OPSTATUS_OK)
Clancy_SENDSOR 2:5828e6917e75 643 ucStatusX201641=FLOW_SENSOR_OK;
Clancy_SENDSOR 2:5828e6917e75 644 else if (byOpStatus==OPSTATUS_FAIL)
Clancy_SENDSOR 2:5828e6917e75 645 ucStatusX201641=FLOW_SENSOR_FAIL;
Clancy_SENDSOR 2:5828e6917e75 646 }
Clancy_SENDSOR 2:5828e6917e75 647
Clancy_SENDSOR 2:5828e6917e75 648 // End of flow measurement?
Clancy_SENDSOR 2:5828e6917e75 649 if (ucStatusSDP600!=FLOW_SENSOR_READING && ucStatusX201641!=FLOW_SENSOR_READING)
Clancy_SENDSOR 2:5828e6917e75 650 {
Clancy_SENDSOR 2:5828e6917e75 651 if (ucStatusSDP600==FLOW_SENSOR_OK && ucStatusX201641==FLOW_SENSOR_OK)
Clancy_SENDSOR 2:5828e6917e75 652 {
Clancy_SENDSOR 2:5828e6917e75 653 ucCounterFlowErrorMeasurement=0;
Clancy_SENDSOR 2:5828e6917e75 654 #ifdef TIME_MEASUREMENT
Clancy_SENDSOR 2:5828e6917e75 655 GPIOB->BRR = GPIO_Pin_5;
Clancy_SENDSOR 2:5828e6917e75 656 #endif
Clancy_SENDSOR 2:5828e6917e75 657 }
Clancy_SENDSOR 2:5828e6917e75 658 else
Clancy_SENDSOR 2:5828e6917e75 659 {
Clancy_SENDSOR 2:5828e6917e75 660 // Error counters
Clancy_SENDSOR 2:5828e6917e75 661 uiTotalCounterFlowErrorMeasurement++;
Clancy_SENDSOR 2:5828e6917e75 662 ucCounterFlowErrorMeasurement++;
Clancy_SENDSOR 2:5828e6917e75 663 if (ucCounterFlowErrorMeasurement>=NUMBER_I2C_REBOOT)
Clancy_SENDSOR 2:5828e6917e75 664 {
Clancy_SENDSOR 2:5828e6917e75 665 //ulErrorCounter|=uiSensorErr;
Clancy_SENDSOR 2:5828e6917e75 666 uiFlagsAlarm[ALARM_FLAGS2]|=FLOW_SENSOR_FAILURE_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 667 }
Clancy_SENDSOR 2:5828e6917e75 668 }
Clancy_SENDSOR 2:5828e6917e75 669
Clancy_SENDSOR 2:5828e6917e75 670 // Next Sensors to measure
Clancy_SENDSOR 2:5828e6917e75 671 ucReadingFlowSensor=READING_NO_SENSOR;
Clancy_SENDSOR 2:5828e6917e75 672 ucStatusSDP600=FLOW_SENSOR_READING;
Clancy_SENDSOR 2:5828e6917e75 673 ucStatusX201641=FLOW_SENSOR_READING;
Clancy_SENDSOR 2:5828e6917e75 674 }
Clancy_SENDSOR 2:5828e6917e75 675 }
Clancy_SENDSOR 2:5828e6917e75 676 }
Clancy_SENDSOR 2:5828e6917e75 677 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 678
Clancy_SENDSOR 2:5828e6917e75 679
Clancy_SENDSOR 2:5828e6917e75 680
Clancy_SENDSOR 2:5828e6917e75 681 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 682 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 683 * Function Name : ComputeFlowMeasurement
Clancy_SENDSOR 2:5828e6917e75 684 * Description : Conpute inspiratory and erxpiratory flow measurements
Clancy_SENDSOR 2:5828e6917e75 685 * Input : None
Clancy_SENDSOR 2:5828e6917e75 686 * Output : None
Clancy_SENDSOR 2:5828e6917e75 687 * Return : None
Clancy_SENDSOR 2:5828e6917e75 688 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 689 void ComputeFlowMeasurement(void)
Clancy_SENDSOR 2:5828e6917e75 690 {
Clancy_SENDSOR 2:5828e6917e75 691 #if defined(SDP600_USED_I2C1_BUS) || defined(X201641_USED_I2C1_BUS)
Clancy_SENDSOR 2:5828e6917e75 692 int32_t lValue;
Clancy_SENDSOR 2:5828e6917e75 693 u16 uiValue;
Clancy_SENDSOR 2:5828e6917e75 694 #ifdef DISPLAY_AVERAGE_BLOWER_RAW_FLOW
Clancy_SENDSOR 2:5828e6917e75 695 u32 ulValue;
Clancy_SENDSOR 2:5828e6917e75 696 #endif
Clancy_SENDSOR 2:5828e6917e75 697 #endif
Clancy_SENDSOR 2:5828e6917e75 698
Clancy_SENDSOR 2:5828e6917e75 699 if (ucReadingFlowSensor==START_READING_FLOW_SENSORS)
Clancy_SENDSOR 2:5828e6917e75 700 {
Clancy_SENDSOR 2:5828e6917e75 701 ucReadingFlowSensor=READING_FLOW_SENSORS;
Clancy_SENDSOR 2:5828e6917e75 702 }
Clancy_SENDSOR 2:5828e6917e75 703 else if (ucReadingFlowSensor==READING_NO_SENSOR)
Clancy_SENDSOR 2:5828e6917e75 704 {
Clancy_SENDSOR 2:5828e6917e75 705 ucReadingFlowSensor=READING_FLOW_SENSORS;
Clancy_SENDSOR 2:5828e6917e75 706
Clancy_SENDSOR 2:5828e6917e75 707 // **** Reading of the Inspiratory RAW Flow
Clancy_SENDSOR 2:5828e6917e75 708 #if defined(SDP600_USED_I2C1_BUS) || defined(X201641_USED_I2C1_BUS)
Clancy_SENDSOR 2:5828e6917e75 709 #ifdef SDP600_USED_I2C1_BUS
Clancy_SENDSOR 2:5828e6917e75 710 SDP600_ReadADCFlowValue(I2C1, SDP600_BLOWER_FLOW_SENSOR, &uiValue);
Clancy_SENDSOR 2:5828e6917e75 711 #endif
Clancy_SENDSOR 2:5828e6917e75 712 #ifdef X201641_USED_I2C1_BUS
Clancy_SENDSOR 2:5828e6917e75 713 X201641_ReadADCFlowValue(I2C1, X201641_BLOWER_FLOW_SENSOR, &uiValue);
Clancy_SENDSOR 2:5828e6917e75 714 #endif
Clancy_SENDSOR 2:5828e6917e75 715 if (uiValue==uiTechnicalDataSet[FLOWI_OFFSET_TEC])
Clancy_SENDSOR 2:5828e6917e75 716 {
Clancy_SENDSOR 2:5828e6917e75 717 uiBlowerFlowRAWMes=0;
Clancy_SENDSOR 2:5828e6917e75 718 iBlowerFlowMes=0;
Clancy_SENDSOR 2:5828e6917e75 719 }
Clancy_SENDSOR 2:5828e6917e75 720 else if (uiValue>uiTechnicalDataSet[FLOWI_OFFSET_TEC])
Clancy_SENDSOR 2:5828e6917e75 721 {
Clancy_SENDSOR 2:5828e6917e75 722 uiBlowerFlowRAWMes=uiValue-uiTechnicalDataSet[FLOWI_OFFSET_TEC];
Clancy_SENDSOR 2:5828e6917e75 723 iBlowerFlowMes=ComputeFlowInLitersPerMin(uiBlowerFlowRAWMes, FALSE);
Clancy_SENDSOR 2:5828e6917e75 724 }
Clancy_SENDSOR 2:5828e6917e75 725 else
Clancy_SENDSOR 2:5828e6917e75 726 {
Clancy_SENDSOR 2:5828e6917e75 727 uiBlowerFlowRAWMes=uiTechnicalDataSet[FLOWI_OFFSET_TEC]-uiValue;
Clancy_SENDSOR 2:5828e6917e75 728 iBlowerFlowMes=ComputeFlowInLitersPerMin(uiBlowerFlowRAWMes, TRUE);
Clancy_SENDSOR 2:5828e6917e75 729 }
Clancy_SENDSOR 2:5828e6917e75 730
Clancy_SENDSOR 2:5828e6917e75 731 // Smoothing RWA data signals
Clancy_SENDSOR 2:5828e6917e75 732 #ifdef DISPLAY_AVERAGE_BLOWER_RAW_FLOW
Clancy_SENDSOR 2:5828e6917e75 733 uiBlowerRAWFlowTemp[ucIndexBlowerRAWFlowSmooth]=uiBlowerFlowRAWMes;
Clancy_SENDSOR 2:5828e6917e75 734 ulValue=0;
Clancy_SENDSOR 2:5828e6917e75 735 for (uiValue=0; uiValue<SMOOTH_BLOWER_RAW_FLOW_COUNTER; uiValue++)
Clancy_SENDSOR 2:5828e6917e75 736 ulValue+=uiBlowerRAWFlowTemp[uiValue];
Clancy_SENDSOR 2:5828e6917e75 737 uiBlowerFlowRAWSmoothingMes=ulValue/SMOOTH_BLOWER_RAW_FLOW_COUNTER;
Clancy_SENDSOR 2:5828e6917e75 738 ucIndexBlowerRAWFlowSmooth++;
Clancy_SENDSOR 2:5828e6917e75 739 if (ucIndexBlowerRAWFlowSmooth>=SMOOTH_BLOWER_RAW_FLOW_COUNTER)
Clancy_SENDSOR 2:5828e6917e75 740 ucIndexBlowerRAWFlowSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 741
Clancy_SENDSOR 2:5828e6917e75 742 // Average of the RAW data signal
Clancy_SENDSOR 2:5828e6917e75 743 ulSumBlowerFlowRAWMes+=uiBlowerFlowRAWSmoothingMes;
Clancy_SENDSOR 2:5828e6917e75 744 uiBlowerRAWFlowSamplesCounter--;
Clancy_SENDSOR 2:5828e6917e75 745 if (uiBlowerRAWFlowSamplesCounter==0)
Clancy_SENDSOR 2:5828e6917e75 746 {
Clancy_SENDSOR 2:5828e6917e75 747 uiAverageBlowerFlowRAWMes=ulSumBlowerFlowRAWMes/BLOWER_RAW_FLOW_SAMPLES_NUMBER;
Clancy_SENDSOR 2:5828e6917e75 748 ulSumBlowerFlowRAWMes=0;
Clancy_SENDSOR 2:5828e6917e75 749 uiBlowerRAWFlowSamplesCounter=BLOWER_RAW_FLOW_SAMPLES_NUMBER;
Clancy_SENDSOR 2:5828e6917e75 750 }
Clancy_SENDSOR 2:5828e6917e75 751 #endif // DISPLAY_AVERAGE_BLOWER_RAW_FLOW
Clancy_SENDSOR 2:5828e6917e75 752
Clancy_SENDSOR 2:5828e6917e75 753
Clancy_SENDSOR 2:5828e6917e75 754 // **** Reading of the Inspiratory Flow in l/min
Clancy_SENDSOR 2:5828e6917e75 755 /*#ifdef SDP600_USED_I2C1_BUS
Clancy_SENDSOR 2:5828e6917e75 756 SDP600_CalculFlowValue(I2C1, SDP600_BLOWER_FLOW_SENSOR, &iBlowerFlowMes);
Clancy_SENDSOR 2:5828e6917e75 757 #endif
Clancy_SENDSOR 2:5828e6917e75 758 #ifdef X201641_USED_I2C1_BUS
Clancy_SENDSOR 2:5828e6917e75 759 X201641_CalculFlowValue(I2C1, X201641_BLOWER_FLOW_SENSOR, &iBlowerFlowMes);
Clancy_SENDSOR 2:5828e6917e75 760 #endif*/
Clancy_SENDSOR 2:5828e6917e75 761 iTempBlowerFlowForSmallSmooth[ucIndexSmallBlowerFlowSmooth]=iBlowerFlowMes;
Clancy_SENDSOR 2:5828e6917e75 762 iTempBlowerFlowForLargeSmooth[ucIndexLargeBlowerFlowSmooth]=iBlowerFlowMes;
Clancy_SENDSOR 2:5828e6917e75 763
Clancy_SENDSOR 2:5828e6917e75 764 // Small Smoothing of the inspiratory flow signal
Clancy_SENDSOR 2:5828e6917e75 765 lValue=0;
Clancy_SENDSOR 2:5828e6917e75 766 for (uiValue=0; uiValue<SMOOTH_BLOWER_FLOW_SMALL_COUNTER; uiValue++)
Clancy_SENDSOR 2:5828e6917e75 767 lValue+=iTempBlowerFlowForSmallSmooth[uiValue];
Clancy_SENDSOR 2:5828e6917e75 768 iBlowerFlowSmoothingMes=lValue/(int16_t)SMOOTH_BLOWER_FLOW_SMALL_COUNTER;
Clancy_SENDSOR 2:5828e6917e75 769 ucIndexSmallBlowerFlowSmooth++;
Clancy_SENDSOR 2:5828e6917e75 770 if (ucIndexSmallBlowerFlowSmooth>=SMOOTH_BLOWER_FLOW_SMALL_COUNTER)
Clancy_SENDSOR 2:5828e6917e75 771 ucIndexSmallBlowerFlowSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 772
Clancy_SENDSOR 2:5828e6917e75 773 // Large Smoothing of the inspiratory flow signal
Clancy_SENDSOR 2:5828e6917e75 774 lValue=0;
Clancy_SENDSOR 2:5828e6917e75 775 for (uiValue=0; uiValue<SMOOTH_BLOWER_FLOW_LARGE_COUNTER; uiValue++)
Clancy_SENDSOR 2:5828e6917e75 776 lValue+=iTempBlowerFlowForLargeSmooth[uiValue];
Clancy_SENDSOR 2:5828e6917e75 777 iBlowerFlowSmoothingMesForTrigger=lValue/(int16_t)SMOOTH_BLOWER_FLOW_LARGE_COUNTER;
Clancy_SENDSOR 2:5828e6917e75 778 ucIndexLargeBlowerFlowSmooth++;
Clancy_SENDSOR 2:5828e6917e75 779 if (ucIndexLargeBlowerFlowSmooth>=SMOOTH_BLOWER_FLOW_LARGE_COUNTER)
Clancy_SENDSOR 2:5828e6917e75 780 ucIndexLargeBlowerFlowSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 781
Clancy_SENDSOR 2:5828e6917e75 782 // Flow for Optima Comm
Clancy_SENDSOR 2:5828e6917e75 783 uiBlowerFlow=iBlowerFlowMes;
Clancy_SENDSOR 2:5828e6917e75 784 uiBlowerFlowSmoothingMes=iBlowerFlowSmoothingMes;
Clancy_SENDSOR 2:5828e6917e75 785 uiBlowerFlowTriggerMes=iBlowerFlowSmoothingMesForTrigger;
Clancy_SENDSOR 2:5828e6917e75 786 #endif // (SDP600_USED_I2C1_BUS) || (X201641_USED_I2C1_BUS)
Clancy_SENDSOR 2:5828e6917e75 787 }
Clancy_SENDSOR 2:5828e6917e75 788
Clancy_SENDSOR 2:5828e6917e75 789 }
Clancy_SENDSOR 2:5828e6917e75 790 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 791
Clancy_SENDSOR 2:5828e6917e75 792
Clancy_SENDSOR 2:5828e6917e75 793
Clancy_SENDSOR 2:5828e6917e75 794 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 795 double powApprox(double a, double x)
Clancy_SENDSOR 2:5828e6917e75 796 {
Clancy_SENDSOR 2:5828e6917e75 797 union
Clancy_SENDSOR 2:5828e6917e75 798 {
Clancy_SENDSOR 2:5828e6917e75 799 double d;
Clancy_SENDSOR 2:5828e6917e75 800 int A[2];
Clancy_SENDSOR 2:5828e6917e75 801 } Z = { a };
Clancy_SENDSOR 2:5828e6917e75 802 Z.A[1] = (int)(x * (Z.A[1] - 1072632447) + 1072632447);
Clancy_SENDSOR 2:5828e6917e75 803 Z.A[0] = 0;
Clancy_SENDSOR 2:5828e6917e75 804 return Z.d;
Clancy_SENDSOR 2:5828e6917e75 805 }
Clancy_SENDSOR 2:5828e6917e75 806 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 807 * Function Name : ComputeConductance
Clancy_SENDSOR 2:5828e6917e75 808 * Description : Compute Conductance
Clancy_SENDSOR 2:5828e6917e75 809 * Input : Pressure, Flow
Clancy_SENDSOR 2:5828e6917e75 810 * Output : Conductance
Clancy_SENDSOR 2:5828e6917e75 811 * Return : None
Clancy_SENDSOR 2:5828e6917e75 812 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 813 float prevConductance = 0.0f;
Clancy_SENDSOR 2:5828e6917e75 814 u8 bufferIndex = 0;
Clancy_SENDSOR 2:5828e6917e75 815 bool filled = FALSE;
Clancy_SENDSOR 2:5828e6917e75 816 int16_t littleSum = 0;
Clancy_SENDSOR 2:5828e6917e75 817
Clancy_SENDSOR 2:5828e6917e75 818 void ComputeConductance(void)
Clancy_SENDSOR 2:5828e6917e75 819 {
Clancy_SENDSOR 2:5828e6917e75 820 float pressure = iProximalPressureMes/10.0f;
Clancy_SENDSOR 2:5828e6917e75 821 float flow = iBlowerFlowSmoothingMes/100.0f/60.0f;
Clancy_SENDSOR 2:5828e6917e75 822 float density = 1.225f;
Clancy_SENDSOR 2:5828e6917e75 823 float viscosity = 0.00018f;
Clancy_SENDSOR 2:5828e6917e75 824 float calcConductance = 0.0f;
Clancy_SENDSOR 2:5828e6917e75 825
Clancy_SENDSOR 2:5828e6917e75 826 if(pressure != 0)
Clancy_SENDSOR 2:5828e6917e75 827 {
Clancy_SENDSOR 2:5828e6917e75 828 calcConductance = (100000)*((powApprox((flow*0.001f),1.75)*powApprox(density,0.75)*powApprox(viscosity,0.25)/(pressure / 10.0f)* 98.0638f));
Clancy_SENDSOR 2:5828e6917e75 829 calcConductance = calcConductance * 1000.0f;
Clancy_SENDSOR 2:5828e6917e75 830 if(calcConductance < 60000 && calcConductance > -60000)
Clancy_SENDSOR 2:5828e6917e75 831 {
Clancy_SENDSOR 2:5828e6917e75 832 uiConductanceCalc = (int16_t)calcConductance;
Clancy_SENDSOR 2:5828e6917e75 833 }
Clancy_SENDSOR 2:5828e6917e75 834 }
Clancy_SENDSOR 2:5828e6917e75 835 // int16_t tempValue = idConductancedtSmooth[bufferIndex];
Clancy_SENDSOR 2:5828e6917e75 836 // idConductancedtSmooth[bufferIndex]= (int16_t)(calcConductance - prevConductance);//1000;
Clancy_SENDSOR 2:5828e6917e75 837 // littleSum += idConductancedtSmooth[bufferIndex];
Clancy_SENDSOR 2:5828e6917e75 838 // bufferIndex++;
Clancy_SENDSOR 2:5828e6917e75 839 // if(bufferIndex > SMOOTH_BLOWER_FLOW_LARGE_COUNTER)
Clancy_SENDSOR 2:5828e6917e75 840 // {
Clancy_SENDSOR 2:5828e6917e75 841 // bufferIndex = 0;
Clancy_SENDSOR 2:5828e6917e75 842 // if(!filled)
Clancy_SENDSOR 2:5828e6917e75 843 // {
Clancy_SENDSOR 2:5828e6917e75 844 // filled = TRUE;
Clancy_SENDSOR 2:5828e6917e75 845 // }
Clancy_SENDSOR 2:5828e6917e75 846 // }
Clancy_SENDSOR 2:5828e6917e75 847 //
Clancy_SENDSOR 2:5828e6917e75 848 // if(filled)
Clancy_SENDSOR 2:5828e6917e75 849 // {
Clancy_SENDSOR 2:5828e6917e75 850 // littleSum -= tempValue;
Clancy_SENDSOR 2:5828e6917e75 851 // uidConductanceCalcdt = littleSum/SMOOTH_BLOWER_FLOW_LARGE_COUNTER;
Clancy_SENDSOR 2:5828e6917e75 852 // }
Clancy_SENDSOR 2:5828e6917e75 853 uidConductanceCalcdt = (int16_t)(calcConductance - prevConductance);
Clancy_SENDSOR 2:5828e6917e75 854 prevConductance = calcConductance;
Clancy_SENDSOR 2:5828e6917e75 855 }
Clancy_SENDSOR 2:5828e6917e75 856 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 857 * Function Name : ComputeProximalPressureMeasurements
Clancy_SENDSOR 2:5828e6917e75 858 * Description : Compute Proximal pressure measurements
Clancy_SENDSOR 2:5828e6917e75 859 * Input : None
Clancy_SENDSOR 2:5828e6917e75 860 * Output : None
Clancy_SENDSOR 2:5828e6917e75 861 * Return : None
Clancy_SENDSOR 2:5828e6917e75 862 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 863 void ComputeProximalPressureMeasurements(void)
Clancy_SENDSOR 2:5828e6917e75 864 {
Clancy_SENDSOR 2:5828e6917e75 865 u32 ulValue;
Clancy_SENDSOR 2:5828e6917e75 866 u16 uiValue;
Clancy_SENDSOR 2:5828e6917e75 867
Clancy_SENDSOR 2:5828e6917e75 868 iProximalPressureMes=((100L*((int16_t)uiProximalPressureADCMes-(int16_t)uiTechnicalDataSet[PPROX_OFFSET_TEC]))/(int16_t)uiTechnicalDataSet[PPROX_GAIN_TEC]);
Clancy_SENDSOR 2:5828e6917e75 869 if (iProximalPressureMes>0)
Clancy_SENDSOR 2:5828e6917e75 870 uiProximalPressureMes=(u16)iProximalPressureMes;
Clancy_SENDSOR 2:5828e6917e75 871 else
Clancy_SENDSOR 2:5828e6917e75 872 uiProximalPressureMes=0;
Clancy_SENDSOR 2:5828e6917e75 873 uiNegativeProximalPressureMes=iProximalPressureMes;
Clancy_SENDSOR 2:5828e6917e75 874
Clancy_SENDSOR 2:5828e6917e75 875 // Smoothing proximal pressure
Clancy_SENDSOR 2:5828e6917e75 876 uiProximalPressureTemp[ucIndexPproxPressureSmooth]=uiProximalPressureMes;
Clancy_SENDSOR 2:5828e6917e75 877 ulValue=0;
Clancy_SENDSOR 2:5828e6917e75 878 for (uiValue=0; uiValue<SMOOTH_PPROX_PRESSURE_COUNTER; uiValue++)
Clancy_SENDSOR 2:5828e6917e75 879 ulValue+=uiProximalPressureTemp[uiValue];
Clancy_SENDSOR 2:5828e6917e75 880 uiProximalPressureSmoothingMes=ulValue/SMOOTH_PPROX_PRESSURE_COUNTER;
Clancy_SENDSOR 2:5828e6917e75 881
Clancy_SENDSOR 2:5828e6917e75 882 ucIndexPproxPressureSmooth++;
Clancy_SENDSOR 2:5828e6917e75 883 if (ucIndexPproxPressureSmooth>=SMOOTH_PPROX_PRESSURE_COUNTER)
Clancy_SENDSOR 2:5828e6917e75 884 ucIndexPproxPressureSmooth=0;
Clancy_SENDSOR 2:5828e6917e75 885 }
Clancy_SENDSOR 2:5828e6917e75 886 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 887
Clancy_SENDSOR 2:5828e6917e75 888
Clancy_SENDSOR 2:5828e6917e75 889 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 890 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 891 * Function Name : ComputeOffsetProximalPressureSensor
Clancy_SENDSOR 2:5828e6917e75 892 * Description : Compute offset of the proximal pressure sensor
Clancy_SENDSOR 2:5828e6917e75 893 * Input : None
Clancy_SENDSOR 2:5828e6917e75 894 * Output : None
Clancy_SENDSOR 2:5828e6917e75 895 * Return : None
Clancy_SENDSOR 2:5828e6917e75 896 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 897 void ComputeOffsetProximalPressureSensor(void)
Clancy_SENDSOR 2:5828e6917e75 898 {
Clancy_SENDSOR 2:5828e6917e75 899 u32 ulOffsetSum=0;
Clancy_SENDSOR 2:5828e6917e75 900 u16 i;
Clancy_SENDSOR 2:5828e6917e75 901
Clancy_SENDSOR 2:5828e6917e75 902 for (i=0; i<64; i++)
Clancy_SENDSOR 2:5828e6917e75 903 {
Clancy_SENDSOR 2:5828e6917e75 904 ulOffsetSum+=uiADC_Value[ADC_PPROX_MES];
Clancy_SENDSOR 2:5828e6917e75 905 uiTempoSysTick=5;
Clancy_SENDSOR 2:5828e6917e75 906 while (uiTempoSysTick!=0){}
Clancy_SENDSOR 2:5828e6917e75 907 }
Clancy_SENDSOR 2:5828e6917e75 908 uiTechnicalDataSet[PPROX_OFFSET_TEC]=ulOffsetSum>>6;
Clancy_SENDSOR 2:5828e6917e75 909 }
Clancy_SENDSOR 2:5828e6917e75 910 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 911
Clancy_SENDSOR 2:5828e6917e75 912
Clancy_SENDSOR 2:5828e6917e75 913
Clancy_SENDSOR 2:5828e6917e75 914 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 915 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 916 * Function Name : VentilationMonitoringAndAlarms
Clancy_SENDSOR 2:5828e6917e75 917 * Description : Compute measurements and alarms during ventilation
Clancy_SENDSOR 2:5828e6917e75 918 * Input : None
Clancy_SENDSOR 2:5828e6917e75 919 * Output : None
Clancy_SENDSOR 2:5828e6917e75 920 * Return : None
Clancy_SENDSOR 2:5828e6917e75 921 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 922 void VentilationMonitoringAndAlarms(void)
Clancy_SENDSOR 2:5828e6917e75 923 {
Clancy_SENDSOR 2:5828e6917e75 924 u16 uiTotalTimeMes;
Clancy_SENDSOR 2:5828e6917e75 925
Clancy_SENDSOR 2:5828e6917e75 926 if (bMemoStartVentilation==TRUE && uiTechnicalDataSet[DEVICE_MODE_TEC]==VENTILATION_MODE)
Clancy_SENDSOR 2:5828e6917e75 927 {
Clancy_SENDSOR 2:5828e6917e75 928 if (ucVentilationCycle==INSPIRATION_CYCLE)
Clancy_SENDSOR 2:5828e6917e75 929 {
Clancy_SENDSOR 2:5828e6917e75 930 // ***************** INSPIRATION ******************
Clancy_SENDSOR 2:5828e6917e75 931 if (ucVentilationCycleCopy==EXPIRATION_CYCLE)
Clancy_SENDSOR 2:5828e6917e75 932 {
Clancy_SENDSOR 2:5828e6917e75 933 // --- Beginning of inspiration
Clancy_SENDSOR 2:5828e6917e75 934 ucVentilationCycleCopy=INSPIRATION_CYCLE;
Clancy_SENDSOR 2:5828e6917e75 935 SS_Xputdw(act, EV_CTL|FLAG_ACTIONER_ON);
Clancy_SENDSOR 2:5828e6917e75 936
Clancy_SENDSOR 2:5828e6917e75 937 // Update Vte measurement
Clancy_SENDSOR 2:5828e6917e75 938 uiVentilationMeasures[VTE_MES]=uiVteTemp;
Clancy_SENDSOR 2:5828e6917e75 939
Clancy_SENDSOR 2:5828e6917e75 940 // Update Te measurement
Clancy_SENDSOR 2:5828e6917e75 941 uiVentilationMeasures[TE_MES]=uiTeMesTemp;
Clancy_SENDSOR 2:5828e6917e75 942
Clancy_SENDSOR 2:5828e6917e75 943 // Update Average ADC Motor Voltage
Clancy_SENDSOR 2:5828e6917e75 944 if (ulCounterADC_MotorVoltage!=0)
Clancy_SENDSOR 2:5828e6917e75 945 uiAverageADC_MotorVoltage=ulSumADC_MotorVoltage/ulCounterADC_MotorVoltage;
Clancy_SENDSOR 2:5828e6917e75 946
Clancy_SENDSOR 2:5828e6917e75 947 // Update Current measurement
Clancy_SENDSOR 2:5828e6917e75 948 if (ulCounterADC_FilteredBlowerCurrentMes!=0)
Clancy_SENDSOR 2:5828e6917e75 949 uiBreathBlowerCurrentMes=ComputeBlowerCurrentInAmper(ulSumCurrentADCMesFiltered/ulCounterADC_FilteredBlowerCurrentMes);
Clancy_SENDSOR 2:5828e6917e75 950 ulSumCurrentADCMesFiltered=0; ulCounterADC_FilteredBlowerCurrentMes=0;
Clancy_SENDSOR 2:5828e6917e75 951
Clancy_SENDSOR 2:5828e6917e75 952 // Update average blower speed
Clancy_SENDSOR 2:5828e6917e75 953 if (ulCounterAverageMotorSpeed!=0)
Clancy_SENDSOR 2:5828e6917e75 954 uiAverageBlowerSpeedMes=SpeedMeasurement(ulSumTachoTicks/ulCounterAverageMotorSpeed);
Clancy_SENDSOR 2:5828e6917e75 955 ulSumTachoTicks=0;
Clancy_SENDSOR 2:5828e6917e75 956 ulCounterAverageMotorSpeed=0;
Clancy_SENDSOR 2:5828e6917e75 957
Clancy_SENDSOR 2:5828e6917e75 958 // Update average motor temperature during inspiration
Clancy_SENDSOR 2:5828e6917e75 959 if (uiTemperatureSamplesCounter!=0)
Clancy_SENDSOR 2:5828e6917e75 960 {
Clancy_SENDSOR 2:5828e6917e75 961 uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(ulADCSumBlowerTemperature/uiTemperatureSamplesCounter);
Clancy_SENDSOR 2:5828e6917e75 962 if (uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]>890)
Clancy_SENDSOR 2:5828e6917e75 963 uiFlagsAlarm[ALARM_FLAGS2]|=MOTOR_TEMPERATURE_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 964 else if (uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]<810)
Clancy_SENDSOR 2:5828e6917e75 965 uiFlagsAlarm[ALARM_FLAGS2]&=(~MOTOR_TEMPERATURE_ALARM_MASK);
Clancy_SENDSOR 2:5828e6917e75 966 }
Clancy_SENDSOR 2:5828e6917e75 967 ulADCSumBlowerTemperature=0; uiTemperatureSamplesCounter=0;
Clancy_SENDSOR 2:5828e6917e75 968
Clancy_SENDSOR 2:5828e6917e75 969 // --- Pmax=0
Clancy_SENDSOR 2:5828e6917e75 970 uiPproxMax=0;
Clancy_SENDSOR 2:5828e6917e75 971
Clancy_SENDSOR 2:5828e6917e75 972 // --- Vti=0
Clancy_SENDSOR 2:5828e6917e75 973 lSumVti=0;
Clancy_SENDSOR 2:5828e6917e75 974 uiRecordVtiMes=uiVentilationMeasures[VTI_MES];
Clancy_SENDSOR 2:5828e6917e75 975
Clancy_SENDSOR 2:5828e6917e75 976 // --- Dislay Breath rate
Clancy_SENDSOR 2:5828e6917e75 977 uiTotalTimeMes=uiVentilationMeasures[TI_MES]+uiVentilationMeasures[TE_MES];
Clancy_SENDSOR 2:5828e6917e75 978 if (uiTotalTimeMes>0)
Clancy_SENDSOR 2:5828e6917e75 979 uiVentilationMeasures[BREATH_RATE_MES]=600000/uiTotalTimeMes;
Clancy_SENDSOR 2:5828e6917e75 980
Clancy_SENDSOR 2:5828e6917e75 981 // --- Ti=0
Clancy_SENDSOR 2:5828e6917e75 982 uiTiMesTemp=0;
Clancy_SENDSOR 2:5828e6917e75 983
Clancy_SENDSOR 2:5828e6917e75 984 // --- Max flow
Clancy_SENDSOR 2:5828e6917e75 985 iBlowerFlowSmoothingMaxMes=0;
Clancy_SENDSOR 2:5828e6917e75 986
Clancy_SENDSOR 2:5828e6917e75 987 // --- Alarm Vte Min
Clancy_SENDSOR 2:5828e6917e75 988 if (uiVentilationMeasures[VTE_MES]<uiVentilationSet[VTE_MIN_ALARM_SET] && enVentilationMode!=CPAP_MODE)
Clancy_SENDSOR 2:5828e6917e75 989 {
Clancy_SENDSOR 2:5828e6917e75 990 ucCounterAlarmVteMin++;
Clancy_SENDSOR 2:5828e6917e75 991 if (ucCounterAlarmVteMin>=5)
Clancy_SENDSOR 2:5828e6917e75 992 {
Clancy_SENDSOR 2:5828e6917e75 993 ucCounterAlarmVteMin=5;
Clancy_SENDSOR 2:5828e6917e75 994 uiFlagsAlarm[ALARM_FLAGS1]|=LOW_VTE_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 995 }
Clancy_SENDSOR 2:5828e6917e75 996 }
Clancy_SENDSOR 2:5828e6917e75 997 else
Clancy_SENDSOR 2:5828e6917e75 998 {
Clancy_SENDSOR 2:5828e6917e75 999 ucCounterAlarmVteMin=0;
Clancy_SENDSOR 2:5828e6917e75 1000 uiFlagsAlarm[ALARM_FLAGS1]&=(~LOW_VTE_ALARM_MASK);
Clancy_SENDSOR 2:5828e6917e75 1001 }
Clancy_SENDSOR 2:5828e6917e75 1002 }
Clancy_SENDSOR 2:5828e6917e75 1003 else //if (ucVentilationCycle==EXPIRATION_CYCLE)
Clancy_SENDSOR 2:5828e6917e75 1004 {
Clancy_SENDSOR 2:5828e6917e75 1005 // --- During inspiration
Clancy_SENDSOR 2:5828e6917e75 1006
Clancy_SENDSOR 2:5828e6917e75 1007 // --- Motor Speed
Clancy_SENDSOR 2:5828e6917e75 1008 ulSumTachoTicks+=uiTachoTimeTicks;
Clancy_SENDSOR 2:5828e6917e75 1009 ulCounterAverageMotorSpeed++;
Clancy_SENDSOR 2:5828e6917e75 1010
Clancy_SENDSOR 2:5828e6917e75 1011 // --- Blower Current
Clancy_SENDSOR 2:5828e6917e75 1012 ulSumCurrentADCMesFiltered+=uiADCBlowerCurrent;
Clancy_SENDSOR 2:5828e6917e75 1013 ulCounterADC_FilteredBlowerCurrentMes++;
Clancy_SENDSOR 2:5828e6917e75 1014
Clancy_SENDSOR 2:5828e6917e75 1015 // --- Inc Pmax
Clancy_SENDSOR 2:5828e6917e75 1016 if (uiProximalPressureMes>uiPproxMax)
Clancy_SENDSOR 2:5828e6917e75 1017 uiPproxMax=uiProximalPressureMes;
Clancy_SENDSOR 2:5828e6917e75 1018
Clancy_SENDSOR 2:5828e6917e75 1019 // --- Inc max flow
Clancy_SENDSOR 2:5828e6917e75 1020 if (iBlowerFlowSmoothingMes>iBlowerFlowSmoothingMaxMes)
Clancy_SENDSOR 2:5828e6917e75 1021 iBlowerFlowSmoothingMaxMes=iBlowerFlowSmoothingMes;
Clancy_SENDSOR 2:5828e6917e75 1022
Clancy_SENDSOR 2:5828e6917e75 1023 // --- Inc Vti
Clancy_SENDSOR 2:5828e6917e75 1024 if (iBlowerFlowMes>30)
Clancy_SENDSOR 2:5828e6917e75 1025 lSumVti+=iBlowerFlowMes;
Clancy_SENDSOR 2:5828e6917e75 1026 uiVtiTemp=(u32)lSumVti/6000;
Clancy_SENDSOR 2:5828e6917e75 1027
Clancy_SENDSOR 2:5828e6917e75 1028 // --- Inc Ti
Clancy_SENDSOR 2:5828e6917e75 1029 uiTiMesTemp++;
Clancy_SENDSOR 2:5828e6917e75 1030
Clancy_SENDSOR 2:5828e6917e75 1031 // --- Motor temperature
Clancy_SENDSOR 2:5828e6917e75 1032 ulADCSumBlowerTemperature+=uiADCBlowerTemperatureMeas;
Clancy_SENDSOR 2:5828e6917e75 1033 uiTemperatureSamplesCounter++;
Clancy_SENDSOR 2:5828e6917e75 1034
Clancy_SENDSOR 2:5828e6917e75 1035 // --- Alarm Pmax
Clancy_SENDSOR 2:5828e6917e75 1036 if (uiProximalPressureMes>uiVentilationSet[HIGH_PRESSURE_ALARM_SET] && enVentilationMode!=CPAP_MODE)
Clancy_SENDSOR 2:5828e6917e75 1037 {
Clancy_SENDSOR 2:5828e6917e75 1038 uiFlagsAlarm[ALARM_FLAGS1]|=HIGH_PRESSURE_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 1039 fAlarmPmax=TRUE;
Clancy_SENDSOR 2:5828e6917e75 1040 }
Clancy_SENDSOR 2:5828e6917e75 1041
Clancy_SENDSOR 2:5828e6917e75 1042 // --- Alarm Vti Max
Clancy_SENDSOR 2:5828e6917e75 1043 if ((uiVtiTemp>uiVentilationSet[VTI_MAX_ALARM_SET] && enVentilationMode==PS_MODE) ||
Clancy_SENDSOR 2:5828e6917e75 1044 (uiVtiTemp>uiVentilationSet[VTI_MAX_ALARM_SET] && enVentilationMode==APCV_MODE))
Clancy_SENDSOR 2:5828e6917e75 1045 {
Clancy_SENDSOR 2:5828e6917e75 1046 uiFlagsAlarm[ALARM_FLAGS1]|=HIGH_VTI_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 1047 fAlarmVtiMax=TRUE;
Clancy_SENDSOR 2:5828e6917e75 1048 }
Clancy_SENDSOR 2:5828e6917e75 1049 }
Clancy_SENDSOR 2:5828e6917e75 1050 }
Clancy_SENDSOR 2:5828e6917e75 1051 else
Clancy_SENDSOR 2:5828e6917e75 1052 {
Clancy_SENDSOR 2:5828e6917e75 1053 // ***************** EXPIRATION ******************
Clancy_SENDSOR 2:5828e6917e75 1054 if (ucVentilationCycleCopy==INSPIRATION_CYCLE)
Clancy_SENDSOR 2:5828e6917e75 1055 {
Clancy_SENDSOR 2:5828e6917e75 1056 // --- Beginning of Expiration
Clancy_SENDSOR 2:5828e6917e75 1057 ucVentilationCycleCopy=EXPIRATION_CYCLE;
Clancy_SENDSOR 2:5828e6917e75 1058 SS_Xputdw(act, EV_CTL|FLAG_ACTIONER_OFF);
Clancy_SENDSOR 2:5828e6917e75 1059
Clancy_SENDSOR 2:5828e6917e75 1060 // Update Pprox max measurement
Clancy_SENDSOR 2:5828e6917e75 1061 uiVentilationMeasures[PPROX_MAX_MES]=uiPproxMax;
Clancy_SENDSOR 2:5828e6917e75 1062
Clancy_SENDSOR 2:5828e6917e75 1063 // Update Vti measurement
Clancy_SENDSOR 2:5828e6917e75 1064 uiVentilationMeasures[VTI_MES]=uiVtiTemp;
Clancy_SENDSOR 2:5828e6917e75 1065
Clancy_SENDSOR 2:5828e6917e75 1066 // Update Ti measurement
Clancy_SENDSOR 2:5828e6917e75 1067 uiVentilationMeasures[TI_MES]=uiTiMesTemp;
Clancy_SENDSOR 2:5828e6917e75 1068
Clancy_SENDSOR 2:5828e6917e75 1069 // --- Motor Speed
Clancy_SENDSOR 2:5828e6917e75 1070 ulSumTachoTicks+=uiTachoTimeTicks;
Clancy_SENDSOR 2:5828e6917e75 1071 ulCounterAverageMotorSpeed++;
Clancy_SENDSOR 2:5828e6917e75 1072
Clancy_SENDSOR 2:5828e6917e75 1073 // --- Blower Current
Clancy_SENDSOR 2:5828e6917e75 1074 ulSumCurrentADCMesFiltered+=uiADCBlowerCurrent;
Clancy_SENDSOR 2:5828e6917e75 1075 ulCounterADC_FilteredBlowerCurrentMes++;
Clancy_SENDSOR 2:5828e6917e75 1076
Clancy_SENDSOR 2:5828e6917e75 1077 // --- Vte=0
Clancy_SENDSOR 2:5828e6917e75 1078 lSumVte=0;
Clancy_SENDSOR 2:5828e6917e75 1079
Clancy_SENDSOR 2:5828e6917e75 1080 // --- Te=0
Clancy_SENDSOR 2:5828e6917e75 1081 uiTeMesTemp=0;
Clancy_SENDSOR 2:5828e6917e75 1082
Clancy_SENDSOR 2:5828e6917e75 1083 // --- Alarm Low Pressure
Clancy_SENDSOR 2:5828e6917e75 1084 if ((uiVentilationMeasures[PPROX_MAX_MES]<(uiVentilationSet[PS_SET]-5) && enVentilationMode==PS_MODE) ||
Clancy_SENDSOR 2:5828e6917e75 1085 (uiVentilationMeasures[PPROX_MAX_MES]<(uiVentilationSet[PI_SET]-5) && enVentilationMode==APCV_MODE) ||
Clancy_SENDSOR 2:5828e6917e75 1086 (uiVentilationMeasures[PPROX_MAX_MES]<uiVentilationSet[LOW_PRESSURE_ALARM_SET] && enVentilationMode==AVC_MODE))
Clancy_SENDSOR 2:5828e6917e75 1087 {
Clancy_SENDSOR 2:5828e6917e75 1088 ucCounterLPAlarm++;
Clancy_SENDSOR 2:5828e6917e75 1089 if (ucCounterLPAlarm>=4)
Clancy_SENDSOR 2:5828e6917e75 1090 {
Clancy_SENDSOR 2:5828e6917e75 1091 ucCounterLPAlarm=4;
Clancy_SENDSOR 2:5828e6917e75 1092 uiFlagsAlarm[ALARM_FLAGS1]|=LOW_PRESSURE_ALARM_MASK;
Clancy_SENDSOR 2:5828e6917e75 1093 }
Clancy_SENDSOR 2:5828e6917e75 1094 }
Clancy_SENDSOR 2:5828e6917e75 1095 else
Clancy_SENDSOR 2:5828e6917e75 1096 {
Clancy_SENDSOR 2:5828e6917e75 1097 ucCounterLPAlarm=0;
Clancy_SENDSOR 2:5828e6917e75 1098 uiFlagsAlarm[ALARM_FLAGS1]&=(~LOW_PRESSURE_ALARM_MASK);
Clancy_SENDSOR 2:5828e6917e75 1099 }
Clancy_SENDSOR 2:5828e6917e75 1100
Clancy_SENDSOR 2:5828e6917e75 1101 // --- Clear Alarm High pressure
Clancy_SENDSOR 2:5828e6917e75 1102 if (fAlarmPmax==FALSE)
Clancy_SENDSOR 2:5828e6917e75 1103 uiFlagsAlarm[ALARM_FLAGS1]&=(~HIGH_PRESSURE_ALARM_MASK);
Clancy_SENDSOR 2:5828e6917e75 1104 fAlarmPmax=FALSE;
Clancy_SENDSOR 2:5828e6917e75 1105
Clancy_SENDSOR 2:5828e6917e75 1106 // --- Clear Alarm Vti Max
Clancy_SENDSOR 2:5828e6917e75 1107 if (fAlarmVtiMax==FALSE)
Clancy_SENDSOR 2:5828e6917e75 1108 uiFlagsAlarm[ALARM_FLAGS1]&=(~HIGH_VTI_ALARM_MASK);
Clancy_SENDSOR 2:5828e6917e75 1109 fAlarmVtiMax=FALSE;
Clancy_SENDSOR 2:5828e6917e75 1110 }
Clancy_SENDSOR 2:5828e6917e75 1111 else
Clancy_SENDSOR 2:5828e6917e75 1112 {
Clancy_SENDSOR 2:5828e6917e75 1113 // --- During Expiration
Clancy_SENDSOR 2:5828e6917e75 1114
Clancy_SENDSOR 2:5828e6917e75 1115 // --- Motor Speed
Clancy_SENDSOR 2:5828e6917e75 1116 ulSumTachoTicks+=uiTachoTimeTicks;
Clancy_SENDSOR 2:5828e6917e75 1117 ulCounterAverageMotorSpeed++;
Clancy_SENDSOR 2:5828e6917e75 1118
Clancy_SENDSOR 2:5828e6917e75 1119 // --- Blower Current
Clancy_SENDSOR 2:5828e6917e75 1120 ulSumCurrentADCMesFiltered+=uiADCBlowerCurrent;
Clancy_SENDSOR 2:5828e6917e75 1121 ulCounterADC_FilteredBlowerCurrentMes++;
Clancy_SENDSOR 2:5828e6917e75 1122
Clancy_SENDSOR 2:5828e6917e75 1123 // --- Inc Vte
Clancy_SENDSOR 2:5828e6917e75 1124 if (iBlowerFlowMes<(-30))
Clancy_SENDSOR 2:5828e6917e75 1125 lSumVte+=iBlowerFlowMes;
Clancy_SENDSOR 2:5828e6917e75 1126 if (lSumVte<0)
Clancy_SENDSOR 2:5828e6917e75 1127 uiVteTemp=(u32)(lSumVte/(-6000));
Clancy_SENDSOR 2:5828e6917e75 1128 else
Clancy_SENDSOR 2:5828e6917e75 1129 uiVteTemp=0;
Clancy_SENDSOR 2:5828e6917e75 1130
Clancy_SENDSOR 2:5828e6917e75 1131 // --- Inc Te
Clancy_SENDSOR 2:5828e6917e75 1132 uiTeMesTemp++;
Clancy_SENDSOR 2:5828e6917e75 1133 if (uiTeMesTemp>60000) uiTeMesTemp=60000;
Clancy_SENDSOR 2:5828e6917e75 1134
Clancy_SENDSOR 2:5828e6917e75 1135 // --- Average motor voltage
Clancy_SENDSOR 2:5828e6917e75 1136 if (uiTeMesTemp==100)
Clancy_SENDSOR 2:5828e6917e75 1137 {
Clancy_SENDSOR 2:5828e6917e75 1138 ulSumADC_MotorVoltage=0;
Clancy_SENDSOR 2:5828e6917e75 1139 ulCounterADC_MotorVoltage=0;
Clancy_SENDSOR 2:5828e6917e75 1140 }
Clancy_SENDSOR 2:5828e6917e75 1141 else if (uiTeMesTemp>100)
Clancy_SENDSOR 2:5828e6917e75 1142 {
Clancy_SENDSOR 2:5828e6917e75 1143 ulSumADC_MotorVoltage+=uiDCinADCMeas;
Clancy_SENDSOR 2:5828e6917e75 1144 ulCounterADC_MotorVoltage++;
Clancy_SENDSOR 2:5828e6917e75 1145 }
Clancy_SENDSOR 2:5828e6917e75 1146 }
Clancy_SENDSOR 2:5828e6917e75 1147 }
Clancy_SENDSOR 2:5828e6917e75 1148 }
Clancy_SENDSOR 2:5828e6917e75 1149 else // if (bMemoStartVentilation==TRUE && uiTechnicalDataSet[DEVICE_MODE_TEC]==VENTILATION_MODE)
Clancy_SENDSOR 2:5828e6917e75 1150 {
Clancy_SENDSOR 2:5828e6917e75 1151 #ifndef TEMPERATURE_TRENDS
Clancy_SENDSOR 2:5828e6917e75 1152 uiTechnicalDataMes[MOTOR_TEMPERATURE_TEC_MES]=ComputeMotorTemperature(uiADCBlowerTemperatureMeas);
Clancy_SENDSOR 2:5828e6917e75 1153 #endif
Clancy_SENDSOR 2:5828e6917e75 1154 }
Clancy_SENDSOR 2:5828e6917e75 1155 }
Clancy_SENDSOR 2:5828e6917e75 1156 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 1157
Clancy_SENDSOR 2:5828e6917e75 1158
Clancy_SENDSOR 2:5828e6917e75 1159 #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 1160 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 1161 * Function Name : ClearVentilationAlarm
Clancy_SENDSOR 2:5828e6917e75 1162 * Description : Clear all ventilation Alarms
Clancy_SENDSOR 2:5828e6917e75 1163 * Input : None
Clancy_SENDSOR 2:5828e6917e75 1164 * Output : None
Clancy_SENDSOR 2:5828e6917e75 1165 * Return : None
Clancy_SENDSOR 2:5828e6917e75 1166 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 1167 void ClearAllVentilationAlarms(void)
Clancy_SENDSOR 2:5828e6917e75 1168 {
Clancy_SENDSOR 2:5828e6917e75 1169 u8 i;
Clancy_SENDSOR 2:5828e6917e75 1170 u8 ucAlarmFlag;
Clancy_SENDSOR 2:5828e6917e75 1171
Clancy_SENDSOR 2:5828e6917e75 1172 for (i=0; i<SIZE_BLOWER_ALARM; i++)
Clancy_SENDSOR 2:5828e6917e75 1173 {
Clancy_SENDSOR 2:5828e6917e75 1174 ucAlarmFlag=stBlowerAlarmStatus[i].ucAlarmFlag;
Clancy_SENDSOR 2:5828e6917e75 1175 if (stBlowerAlarmStatus[i].bVentilationAlarm==TRUE && (ucAlarmFlag==ALARM_FLAGS1 || ucAlarmFlag==ALARM_FLAGS2))
Clancy_SENDSOR 2:5828e6917e75 1176 uiFlagsAlarm[ucAlarmFlag]&=(~stBlowerAlarmStatus[i].uiAlarmMask);
Clancy_SENDSOR 2:5828e6917e75 1177 }
Clancy_SENDSOR 2:5828e6917e75 1178 }
Clancy_SENDSOR 2:5828e6917e75 1179
Clancy_SENDSOR 2:5828e6917e75 1180
Clancy_SENDSOR 2:5828e6917e75 1181 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 1182 * Function Name : ClearAlarm
Clancy_SENDSOR 2:5828e6917e75 1183 * Description : Clear a specific alarm
Clancy_SENDSOR 2:5828e6917e75 1184 * Input : Mask of the alarm
Clancy_SENDSOR 2:5828e6917e75 1185 * Output : None
Clancy_SENDSOR 2:5828e6917e75 1186 * Return : None
Clancy_SENDSOR 2:5828e6917e75 1187 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 1188 void ClearAlarm(u8 ucAlarmFlag, u16 uiMask)
Clancy_SENDSOR 2:5828e6917e75 1189 {
Clancy_SENDSOR 2:5828e6917e75 1190 uiFlagsAlarm[ucAlarmFlag]&=(~uiMask);
Clancy_SENDSOR 2:5828e6917e75 1191 }
Clancy_SENDSOR 2:5828e6917e75 1192
Clancy_SENDSOR 2:5828e6917e75 1193
Clancy_SENDSOR 2:5828e6917e75 1194 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 1195 * Function Name : ClearAllMeasures
Clancy_SENDSOR 2:5828e6917e75 1196 * Description : Clear all ventilation measures
Clancy_SENDSOR 2:5828e6917e75 1197 * Input : None
Clancy_SENDSOR 2:5828e6917e75 1198 * Output : None
Clancy_SENDSOR 2:5828e6917e75 1199 * Return : None
Clancy_SENDSOR 2:5828e6917e75 1200 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 1201 void ClearAllMeasures(void)
Clancy_SENDSOR 2:5828e6917e75 1202 {
Clancy_SENDSOR 2:5828e6917e75 1203 u8 i;
Clancy_SENDSOR 2:5828e6917e75 1204
Clancy_SENDSOR 2:5828e6917e75 1205 // Reset measures except alarms
Clancy_SENDSOR 2:5828e6917e75 1206 for (i=0; i<SIZE_LRM_GROUP; i++)
Clancy_SENDSOR 2:5828e6917e75 1207 {
Clancy_SENDSOR 2:5828e6917e75 1208 if (i!=ALARM_ID1_MES && i!=ALARM_ID2_MES)// && i!=ALARM_ID3_MES && i!=ALARM_ID4_MES)
Clancy_SENDSOR 2:5828e6917e75 1209 uiVentilationMeasures[i]=0;
Clancy_SENDSOR 2:5828e6917e75 1210 }
Clancy_SENDSOR 2:5828e6917e75 1211
Clancy_SENDSOR 2:5828e6917e75 1212 // Reset others measures
Clancy_SENDSOR 2:5828e6917e75 1213 uiBlowerSpeedMes=0; uiAverageBlowerSpeedMes=0; // Speed=0 RPM
Clancy_SENDSOR 2:5828e6917e75 1214 ulSumTachoTicks=0; ulCounterAverageMotorSpeed=0;
Clancy_SENDSOR 2:5828e6917e75 1215 uiBreathBlowerCurrentMes=0; // Blower current=0 A
Clancy_SENDSOR 2:5828e6917e75 1216 ulSumCurrentADCMesFiltered=0; ulCounterADC_FilteredBlowerCurrentMes=0;
Clancy_SENDSOR 2:5828e6917e75 1217 bDisplayInspiratoryTrigger=FALSE;
Clancy_SENDSOR 2:5828e6917e75 1218 #ifdef MOTOR_LIFE_TESTING
Clancy_SENDSOR 2:5828e6917e75 1219 uiAverateMotorTempMes=0;
Clancy_SENDSOR 2:5828e6917e75 1220 #endif // #ifdef MOTOR_LIFE_TESTING
Clancy_SENDSOR 2:5828e6917e75 1221
Clancy_SENDSOR 2:5828e6917e75 1222 // Init temporary variables
Clancy_SENDSOR 2:5828e6917e75 1223 ucVentilationCycleCopy=INSPIRATION_CYCLE;
Clancy_SENDSOR 2:5828e6917e75 1224 uiPproxMax=0;
Clancy_SENDSOR 2:5828e6917e75 1225 uiVtiTemp=0;
Clancy_SENDSOR 2:5828e6917e75 1226 uiTiMesTemp=0;
Clancy_SENDSOR 2:5828e6917e75 1227 ucCounterLPAlarm=0;
Clancy_SENDSOR 2:5828e6917e75 1228 fAlarmPmax=FALSE;
Clancy_SENDSOR 2:5828e6917e75 1229 fAlarmVtiMax=FALSE;
Clancy_SENDSOR 2:5828e6917e75 1230 ucCounterAlarmVteMin=0;
Clancy_SENDSOR 2:5828e6917e75 1231 }
Clancy_SENDSOR 2:5828e6917e75 1232
Clancy_SENDSOR 2:5828e6917e75 1233
Clancy_SENDSOR 2:5828e6917e75 1234 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 1235 * Function Name : ReadStopVentilationAlarmNumber
Clancy_SENDSOR 2:5828e6917e75 1236 * Description : Read the alarm number which stops the ventilation
Clancy_SENDSOR 2:5828e6917e75 1237 * Input : None
Clancy_SENDSOR 2:5828e6917e75 1238 * Output : None
Clancy_SENDSOR 2:5828e6917e75 1239 * Return : alarm number
Clancy_SENDSOR 2:5828e6917e75 1240 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 1241 u8 ReadStopVentilationAlarmNumber(void)
Clancy_SENDSOR 2:5828e6917e75 1242 {
Clancy_SENDSOR 2:5828e6917e75 1243 u16 uiMask;
Clancy_SENDSOR 2:5828e6917e75 1244 u8 i;
Clancy_SENDSOR 2:5828e6917e75 1245 u8 ucAlarmNumber=SIZE_BLOWER_ALARM;
Clancy_SENDSOR 2:5828e6917e75 1246
Clancy_SENDSOR 2:5828e6917e75 1247 // Check Alarm which stops ventilation
Clancy_SENDSOR 2:5828e6917e75 1248 if (uiFlagsAlarm[ALARM_FLAGS1]!=0 ||
Clancy_SENDSOR 2:5828e6917e75 1249 uiFlagsAlarm[ALARM_FLAGS2]!=0)
Clancy_SENDSOR 2:5828e6917e75 1250 /*uiFlagsAlarm[ALARM_FLAGS3]!=0 ||
Clancy_SENDSOR 2:5828e6917e75 1251 uiFlagsAlarm[ALARM_FLAGS4]!=0)*/
Clancy_SENDSOR 2:5828e6917e75 1252 {
Clancy_SENDSOR 2:5828e6917e75 1253 for (i=0; i<SIZE_BLOWER_ALARM; i++)
Clancy_SENDSOR 2:5828e6917e75 1254 {
Clancy_SENDSOR 2:5828e6917e75 1255 if (stBlowerAlarmStatus[i].bForceVentilToStop==TRUE)
Clancy_SENDSOR 2:5828e6917e75 1256 {
Clancy_SENDSOR 2:5828e6917e75 1257 uiMask=stBlowerAlarmStatus[i].uiAlarmMask;
Clancy_SENDSOR 2:5828e6917e75 1258 if ((uiFlagsAlarm[stBlowerAlarmStatus[i].ucAlarmFlag]&uiMask)==uiMask)
Clancy_SENDSOR 2:5828e6917e75 1259 {
Clancy_SENDSOR 2:5828e6917e75 1260 ucAlarmNumber=i;
Clancy_SENDSOR 2:5828e6917e75 1261 break;
Clancy_SENDSOR 2:5828e6917e75 1262 }
Clancy_SENDSOR 2:5828e6917e75 1263 }
Clancy_SENDSOR 2:5828e6917e75 1264 }
Clancy_SENDSOR 2:5828e6917e75 1265 }
Clancy_SENDSOR 2:5828e6917e75 1266 return(ucAlarmNumber);
Clancy_SENDSOR 2:5828e6917e75 1267 }
Clancy_SENDSOR 2:5828e6917e75 1268
Clancy_SENDSOR 2:5828e6917e75 1269
Clancy_SENDSOR 2:5828e6917e75 1270 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 1271 * Function Name : UpdateAlarmsMeasureID
Clancy_SENDSOR 2:5828e6917e75 1272 * Description : Update the alarms ventilation measure variables
Clancy_SENDSOR 2:5828e6917e75 1273 * Input : None
Clancy_SENDSOR 2:5828e6917e75 1274 * Output : None
Clancy_SENDSOR 2:5828e6917e75 1275 * Return : alarm number
Clancy_SENDSOR 2:5828e6917e75 1276 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 1277 #ifdef USE_OPTIMACOMM
Clancy_SENDSOR 2:5828e6917e75 1278 void UpdateAlarmsMeasureID(void)
Clancy_SENDSOR 2:5828e6917e75 1279 {
Clancy_SENDSOR 2:5828e6917e75 1280 uiVentilationMeasures[ALARM_ID1_MES]=uiFlagsAlarm[ALARM_FLAGS1];
Clancy_SENDSOR 2:5828e6917e75 1281 uiVentilationMeasures[ALARM_ID2_MES]=uiFlagsAlarm[ALARM_FLAGS2];
Clancy_SENDSOR 2:5828e6917e75 1282 }
Clancy_SENDSOR 2:5828e6917e75 1283 #endif // #ifdef USE_OPTIMACOMM
Clancy_SENDSOR 2:5828e6917e75 1284 #endif // #ifndef C_M3_DEVICETEST_TARGET
Clancy_SENDSOR 2:5828e6917e75 1285
Clancy_SENDSOR 2:5828e6917e75 1286
Clancy_SENDSOR 2:5828e6917e75 1287 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 1288 * Function Name : ComputeMotorTemperature
Clancy_SENDSOR 2:5828e6917e75 1289 * Description : Return temperature (in degres C)
Clancy_SENDSOR 2:5828e6917e75 1290 * Input : uiADCMotorTemp : ADC value
Clancy_SENDSOR 2:5828e6917e75 1291 * Output : None
Clancy_SENDSOR 2:5828e6917e75 1292 * Return : None
Clancy_SENDSOR 2:5828e6917e75 1293 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 1294 u16 ComputeMotorTemperature(u16 uiADCMotorTemp)
Clancy_SENDSOR 2:5828e6917e75 1295 {
Clancy_SENDSOR 2:5828e6917e75 1296 u16 uiTemp, uiTempDec;
Clancy_SENDSOR 2:5828e6917e75 1297 u32 ulTemp;
Clancy_SENDSOR 2:5828e6917e75 1298
Clancy_SENDSOR 2:5828e6917e75 1299 for (uiTemp=0; uiTemp<121; uiTemp++)
Clancy_SENDSOR 2:5828e6917e75 1300 {
Clancy_SENDSOR 2:5828e6917e75 1301 if (uiADCMotorTemp>=uiADCMotorTempTable[uiTemp])
Clancy_SENDSOR 2:5828e6917e75 1302 break;
Clancy_SENDSOR 2:5828e6917e75 1303 }
Clancy_SENDSOR 2:5828e6917e75 1304
Clancy_SENDSOR 2:5828e6917e75 1305 if (uiADCMotorTemp<uiADCMotorTempTable[120])
Clancy_SENDSOR 2:5828e6917e75 1306 return(1200);
Clancy_SENDSOR 2:5828e6917e75 1307 else if (uiADCMotorTemp>=uiADCMotorTempTable[0])
Clancy_SENDSOR 2:5828e6917e75 1308 return(0);
Clancy_SENDSOR 2:5828e6917e75 1309 else if (uiADCMotorTemp==uiADCMotorTempTable[uiTemp])
Clancy_SENDSOR 2:5828e6917e75 1310 ulTemp=uiTemp*10;
Clancy_SENDSOR 2:5828e6917e75 1311 else
Clancy_SENDSOR 2:5828e6917e75 1312 {
Clancy_SENDSOR 2:5828e6917e75 1313 uiTempDec=((uiADCMotorTempTable[uiTemp-1]-uiADCMotorTemp)*10)/(uiADCMotorTempTable[uiTemp-1]-uiADCMotorTempTable[uiTemp]);
Clancy_SENDSOR 2:5828e6917e75 1314 ulTemp=((uiTemp-1)*10)+uiTempDec;
Clancy_SENDSOR 2:5828e6917e75 1315 }
Clancy_SENDSOR 2:5828e6917e75 1316
Clancy_SENDSOR 2:5828e6917e75 1317 ulTemp*=1000;
Clancy_SENDSOR 2:5828e6917e75 1318 ulTemp/=uiTechnicalDataSet[GAIN_BLOWER_TEMP_TEC];
Clancy_SENDSOR 2:5828e6917e75 1319 return((u16)ulTemp);
Clancy_SENDSOR 2:5828e6917e75 1320 }
Clancy_SENDSOR 2:5828e6917e75 1321
Clancy_SENDSOR 2:5828e6917e75 1322
Clancy_SENDSOR 2:5828e6917e75 1323 /*******************************************************************************
Clancy_SENDSOR 2:5828e6917e75 1324 * Function Name : ComputeFlowInLitersPerMin
Clancy_SENDSOR 2:5828e6917e75 1325 * Description : Compute the flow in l/min
Clancy_SENDSOR 2:5828e6917e75 1326 * Input : uFlowRAW : flow digital value, bPositiveFlow= TRUE if positive flow
Clancy_SENDSOR 2:5828e6917e75 1327 * Output : None
Clancy_SENDSOR 2:5828e6917e75 1328 * Return : signed Flow in l/min
Clancy_SENDSOR 2:5828e6917e75 1329 *******************************************************************************/
Clancy_SENDSOR 2:5828e6917e75 1330 int16_t ComputeFlowInLitersPerMin(u16 uiFlowRAW, bool bPositiveFlow)
Clancy_SENDSOR 2:5828e6917e75 1331 {
Clancy_SENDSOR 2:5828e6917e75 1332 u16 uiIndex;
Clancy_SENDSOR 2:5828e6917e75 1333 int16_t iFlow;
Clancy_SENDSOR 2:5828e6917e75 1334 u32 a;
Clancy_SENDSOR 2:5828e6917e75 1335 int32_t b;
Clancy_SENDSOR 2:5828e6917e75 1336 int32_t y;
Clancy_SENDSOR 2:5828e6917e75 1337
Clancy_SENDSOR 2:5828e6917e75 1338 for (uiIndex=0; uiIndex<stLUTFlowSensor.uiLUT_TableSize; uiIndex++)
Clancy_SENDSOR 2:5828e6917e75 1339 {
Clancy_SENDSOR 2:5828e6917e75 1340 if (uiFlowRAW==stLUTFlowSensor.uiFlowSensorTicks[uiIndex])
Clancy_SENDSOR 2:5828e6917e75 1341 {
Clancy_SENDSOR 2:5828e6917e75 1342 iFlow=(int16_t)stLUTFlowSensor.uiFlowValue[uiIndex];
Clancy_SENDSOR 2:5828e6917e75 1343 break;
Clancy_SENDSOR 2:5828e6917e75 1344 }
Clancy_SENDSOR 2:5828e6917e75 1345 else if (uiFlowRAW<stLUTFlowSensor.uiFlowSensorTicks[uiIndex])
Clancy_SENDSOR 2:5828e6917e75 1346 {
Clancy_SENDSOR 2:5828e6917e75 1347 if (uiIndex==0)
Clancy_SENDSOR 2:5828e6917e75 1348 {
Clancy_SENDSOR 2:5828e6917e75 1349 iFlow=(int16_t)(((u32)uiFlowRAW*stLUTFlowSensor.uiFlowValue[uiIndex])/stLUTFlowSensor.uiFlowSensorTicks[uiIndex]);
Clancy_SENDSOR 2:5828e6917e75 1350 }
Clancy_SENDSOR 2:5828e6917e75 1351 else
Clancy_SENDSOR 2:5828e6917e75 1352 {
Clancy_SENDSOR 2:5828e6917e75 1353 a=(100UL*(stLUTFlowSensor.uiFlowValue[uiIndex]-stLUTFlowSensor.uiFlowValue[uiIndex-1]))/(stLUTFlowSensor.uiFlowSensorTicks[uiIndex]-stLUTFlowSensor.uiFlowSensorTicks[uiIndex-1]);
Clancy_SENDSOR 2:5828e6917e75 1354 b=((int32_t)stLUTFlowSensor.uiFlowValue[uiIndex-1]*100)-((int32_t)stLUTFlowSensor.uiFlowSensorTicks[uiIndex-1]*a);
Clancy_SENDSOR 2:5828e6917e75 1355 y=((int32_t)a*(int32_t)uiFlowRAW)+b;
Clancy_SENDSOR 2:5828e6917e75 1356 iFlow=(int16_t)(y/100);
Clancy_SENDSOR 2:5828e6917e75 1357 }
Clancy_SENDSOR 2:5828e6917e75 1358 break;
Clancy_SENDSOR 2:5828e6917e75 1359 }
Clancy_SENDSOR 2:5828e6917e75 1360 else
Clancy_SENDSOR 2:5828e6917e75 1361 {
Clancy_SENDSOR 2:5828e6917e75 1362 iFlow=(int16_t)stLUTFlowSensor.uiFlowValue[uiIndex];
Clancy_SENDSOR 2:5828e6917e75 1363 }
Clancy_SENDSOR 2:5828e6917e75 1364 }
Clancy_SENDSOR 2:5828e6917e75 1365
Clancy_SENDSOR 2:5828e6917e75 1366 if (bPositiveFlow==FALSE)
Clancy_SENDSOR 2:5828e6917e75 1367 iFlow*=(-1);
Clancy_SENDSOR 2:5828e6917e75 1368
Clancy_SENDSOR 2:5828e6917e75 1369 return(iFlow);
Clancy_SENDSOR 2:5828e6917e75 1370 }
Clancy_SENDSOR 2:5828e6917e75 1371
Clancy_SENDSOR 2:5828e6917e75 1372 /******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
Clancy_SENDSOR 2:5828e6917e75 1373
Clancy_SENDSOR 2:5828e6917e75 1374
Clancy_SENDSOR 2:5828e6917e75 1375