pachas
Dependencies: mbed QEI FastPWM
pressure_sensors.cpp
- Committer:
- miguelangel_2511
- Date:
- 2020-05-15
- Revision:
- 12:3bc2465b034a
- Parent:
- 11:5cb7ae8bd831
File content as of revision 12:3bc2465b034a:
/* File inclusion */ #include "mbed.h" #include "stdint.h" #include "math.h" #include "project_defines.h" #include "pressure_sensors.h" #include "filters.h" /* Object definition */ I2C pressure_sensor_01(PRESSURE_SENSOR_01_SDA_PIN, PRESSURE_SENSOR_01_SCL_PIN); I2C pressure_sensor_02(PRESSURE_SENSOR_02_SDA_PIN, PRESSURE_SENSOR_02_SCL_PIN); /* Global variable definition */ float pressure_01_psi, pressure_02_psi; float flow_lpm, volume_ml; char sensor_read_data_buffer[2]; volatile uint8_t peak_volume_flag = 0; /* Function definition */ void Pressure_Sensors_Initialize(void){ pressure_sensor_01.frequency(PRESSURE_SENSOR_I2C_CLK_HZ); pressure_sensor_02.frequency(PRESSURE_SENSOR_I2C_CLK_HZ); /* Initialize filters */ Pressure_01_Cheby2_LPF(0, 1); Pressure_02_Cheby2_LPF(0, 1); Flow_Cheby2_HPF(0, 1); Flow_FIR_LPF(0,1); } void Pressure_Sensors_Read(void){ int16_t pressure_01_bin; int16_t pressure_02_bin; /* Read pressure 1 (differential) binary value */ sensor_read_data_buffer[0] = 0; sensor_read_data_buffer[1] = 0; pressure_sensor_01.read(PRESSURE_SENSOR_01_SRA, sensor_read_data_buffer, 2); pressure_01_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF; if(pressure_01_bin < PRESSURE_SENSOR_OUTPUT_MIN){ pressure_01_bin = PRESSURE_SENSOR_OUTPUT_MIN; } /* Read pressure 2 binary value */ sensor_read_data_buffer[0] = 0; sensor_read_data_buffer[1] = 0; pressure_sensor_02.read(PRESSURE_SENSOR_02_SRA, sensor_read_data_buffer, 2); pressure_02_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF; if(pressure_02_bin < PRESSURE_SENSOR_OUTPUT_MIN){ pressure_02_bin = PRESSURE_SENSOR_OUTPUT_MIN; } /* Calculate pressure values in PSI */ pressure_01_psi = (pressure_01_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN); pressure_01_psi = (pressure_01_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN; pressure_01_psi += PRESSURE_SENSOR_01_OFFSET_PSI; pressure_02_psi = (pressure_02_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN); pressure_02_psi = (pressure_02_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN; pressure_02_psi += PRESSURE_SENSOR_02_OFFSET_PSI; /* Filter pressure values */ pressure_01_psi = Pressure_01_Cheby2_LPF(pressure_01_psi, 0); pressure_02_psi = Pressure_02_Cheby2_LPF(pressure_02_psi, 0); } void Calculate_Flow_From_Pressure(void){ float diff_pressure_psi; static float prev_flow_lpm = 0; diff_pressure_psi = pressure_02_psi - pressure_01_psi; if(diff_pressure_psi < 0){ flow_lpm = -SPIROMETER_SENSOR_CONSTANT_OXYGEN * sqrt(-diff_pressure_psi); }else{ flow_lpm = SPIROMETER_SENSOR_CONSTANT_OXYGEN * sqrt(diff_pressure_psi); } /* Filter flow value */ flow_lpm = Flow_FIR_LPF(flow_lpm, 0); flow_lpm = Flow_Cheby2_HPF(flow_lpm, 0); if((prev_flow_lpm > 0) && (flow_lpm <= 0)){ peak_volume_flag = 1; } prev_flow_lpm = flow_lpm; } /* Simpson's integration */ void Calculate_Volume_From_Flow(void){ static uint8_t integral_count = 0; static float f_x[3] = {0.0, 0.0, 0.0}; float delta_volume_ml; f_x[2] = f_x[1]; f_x[1] = f_x[0]; f_x[0] = flow_lpm; integral_count++; if(integral_count >= 2){ delta_volume_ml = ((float)PRESSURE_SENSOR_READ_PERIOD_MS / 180.0) * (f_x[2] + (4 * f_x[1]) + f_x[0]); volume_ml += delta_volume_ml; integral_count = 0; } }