Es un backup para las pruebas de firmware y hardware de un ventilador
Dependencies: mbed QEI FastPWM
pressure_sensors.cpp@12:3bc2465b034a, 2020-05-15 (annotated)
- Committer:
- miguelangel_2511
- Date:
- Fri May 15 20:29:30 2020 +0000
- Revision:
- 12:3bc2465b034a
- Parent:
- 11:5cb7ae8bd831
hola papu
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
miguelangel_2511 | 7:f4e248182d31 | 1 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 2 | /* File inclusion */ |
miguelangel_2511 | 7:f4e248182d31 | 3 | #include "mbed.h" |
miguelangel_2511 | 7:f4e248182d31 | 4 | #include "stdint.h" |
miguelangel_2511 | 8:208d965a3bd2 | 5 | #include "math.h" |
miguelangel_2511 | 7:f4e248182d31 | 6 | #include "project_defines.h" |
miguelangel_2511 | 7:f4e248182d31 | 7 | #include "pressure_sensors.h" |
miguelangel_2511 | 11:5cb7ae8bd831 | 8 | #include "filters.h" |
miguelangel_2511 | 7:f4e248182d31 | 9 | |
miguelangel_2511 | 7:f4e248182d31 | 10 | /* Object definition */ |
miguelangel_2511 | 7:f4e248182d31 | 11 | I2C pressure_sensor_01(PRESSURE_SENSOR_01_SDA_PIN, PRESSURE_SENSOR_01_SCL_PIN); |
miguelangel_2511 | 7:f4e248182d31 | 12 | I2C pressure_sensor_02(PRESSURE_SENSOR_02_SDA_PIN, PRESSURE_SENSOR_02_SCL_PIN); |
miguelangel_2511 | 7:f4e248182d31 | 13 | |
miguelangel_2511 | 7:f4e248182d31 | 14 | /* Global variable definition */ |
miguelangel_2511 | 8:208d965a3bd2 | 15 | float pressure_01_psi, pressure_02_psi; |
miguelangel_2511 | 8:208d965a3bd2 | 16 | float flow_lpm, volume_ml; |
miguelangel_2511 | 7:f4e248182d31 | 17 | |
miguelangel_2511 | 7:f4e248182d31 | 18 | char sensor_read_data_buffer[2]; |
miguelangel_2511 | 7:f4e248182d31 | 19 | |
miguelangel_2511 | 12:3bc2465b034a | 20 | volatile uint8_t peak_volume_flag = 0; |
miguelangel_2511 | 11:5cb7ae8bd831 | 21 | |
miguelangel_2511 | 7:f4e248182d31 | 22 | /* Function definition */ |
miguelangel_2511 | 7:f4e248182d31 | 23 | |
miguelangel_2511 | 7:f4e248182d31 | 24 | void Pressure_Sensors_Initialize(void){ |
miguelangel_2511 | 9:95fdcdc0977e | 25 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 26 | pressure_sensor_01.frequency(PRESSURE_SENSOR_I2C_CLK_HZ); |
miguelangel_2511 | 11:5cb7ae8bd831 | 27 | pressure_sensor_02.frequency(PRESSURE_SENSOR_I2C_CLK_HZ); |
miguelangel_2511 | 9:95fdcdc0977e | 28 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 29 | /* Initialize filters */ |
miguelangel_2511 | 11:5cb7ae8bd831 | 30 | Pressure_01_Cheby2_LPF(0, 1); |
miguelangel_2511 | 11:5cb7ae8bd831 | 31 | Pressure_02_Cheby2_LPF(0, 1); |
miguelangel_2511 | 11:5cb7ae8bd831 | 32 | Flow_Cheby2_HPF(0, 1); |
miguelangel_2511 | 11:5cb7ae8bd831 | 33 | Flow_FIR_LPF(0,1); |
miguelangel_2511 | 7:f4e248182d31 | 34 | } |
miguelangel_2511 | 7:f4e248182d31 | 35 | |
miguelangel_2511 | 7:f4e248182d31 | 36 | |
miguelangel_2511 | 7:f4e248182d31 | 37 | void Pressure_Sensors_Read(void){ |
miguelangel_2511 | 7:f4e248182d31 | 38 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 39 | int16_t pressure_01_bin; |
miguelangel_2511 | 11:5cb7ae8bd831 | 40 | int16_t pressure_02_bin; |
miguelangel_2511 | 9:95fdcdc0977e | 41 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 42 | /* Read pressure 1 (differential) binary value */ |
miguelangel_2511 | 11:5cb7ae8bd831 | 43 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 44 | sensor_read_data_buffer[0] = 0; |
miguelangel_2511 | 11:5cb7ae8bd831 | 45 | sensor_read_data_buffer[1] = 0; |
miguelangel_2511 | 9:95fdcdc0977e | 46 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 47 | pressure_sensor_01.read(PRESSURE_SENSOR_01_SRA, sensor_read_data_buffer, 2); |
miguelangel_2511 | 11:5cb7ae8bd831 | 48 | pressure_01_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF; |
miguelangel_2511 | 11:5cb7ae8bd831 | 49 | if(pressure_01_bin < PRESSURE_SENSOR_OUTPUT_MIN){ |
miguelangel_2511 | 11:5cb7ae8bd831 | 50 | pressure_01_bin = PRESSURE_SENSOR_OUTPUT_MIN; |
miguelangel_2511 | 11:5cb7ae8bd831 | 51 | } |
miguelangel_2511 | 11:5cb7ae8bd831 | 52 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 53 | /* Read pressure 2 binary value */ |
miguelangel_2511 | 9:95fdcdc0977e | 54 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 55 | sensor_read_data_buffer[0] = 0; |
miguelangel_2511 | 11:5cb7ae8bd831 | 56 | sensor_read_data_buffer[1] = 0; |
miguelangel_2511 | 9:95fdcdc0977e | 57 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 58 | pressure_sensor_02.read(PRESSURE_SENSOR_02_SRA, sensor_read_data_buffer, 2); |
miguelangel_2511 | 11:5cb7ae8bd831 | 59 | pressure_02_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF; |
miguelangel_2511 | 11:5cb7ae8bd831 | 60 | if(pressure_02_bin < PRESSURE_SENSOR_OUTPUT_MIN){ |
miguelangel_2511 | 11:5cb7ae8bd831 | 61 | pressure_02_bin = PRESSURE_SENSOR_OUTPUT_MIN; |
miguelangel_2511 | 11:5cb7ae8bd831 | 62 | } |
miguelangel_2511 | 7:f4e248182d31 | 63 | |
miguelangel_2511 | 7:f4e248182d31 | 64 | /* Calculate pressure values in PSI */ |
miguelangel_2511 | 9:95fdcdc0977e | 65 | pressure_01_psi = (pressure_01_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN); |
miguelangel_2511 | 9:95fdcdc0977e | 66 | pressure_01_psi = (pressure_01_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN; |
miguelangel_2511 | 11:5cb7ae8bd831 | 67 | pressure_01_psi += PRESSURE_SENSOR_01_OFFSET_PSI; |
miguelangel_2511 | 11:5cb7ae8bd831 | 68 | |
miguelangel_2511 | 9:95fdcdc0977e | 69 | pressure_02_psi = (pressure_02_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN); |
miguelangel_2511 | 9:95fdcdc0977e | 70 | pressure_02_psi = (pressure_02_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN; |
miguelangel_2511 | 11:5cb7ae8bd831 | 71 | pressure_02_psi += PRESSURE_SENSOR_02_OFFSET_PSI; |
miguelangel_2511 | 11:5cb7ae8bd831 | 72 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 73 | /* Filter pressure values */ |
miguelangel_2511 | 11:5cb7ae8bd831 | 74 | pressure_01_psi = Pressure_01_Cheby2_LPF(pressure_01_psi, 0); |
miguelangel_2511 | 11:5cb7ae8bd831 | 75 | pressure_02_psi = Pressure_02_Cheby2_LPF(pressure_02_psi, 0); |
miguelangel_2511 | 11:5cb7ae8bd831 | 76 | |
miguelangel_2511 | 9:95fdcdc0977e | 77 | } |
miguelangel_2511 | 8:208d965a3bd2 | 78 | |
miguelangel_2511 | 9:95fdcdc0977e | 79 | |
miguelangel_2511 | 8:208d965a3bd2 | 80 | void Calculate_Flow_From_Pressure(void){ |
miguelangel_2511 | 8:208d965a3bd2 | 81 | |
miguelangel_2511 | 8:208d965a3bd2 | 82 | float diff_pressure_psi; |
miguelangel_2511 | 12:3bc2465b034a | 83 | static float prev_flow_lpm = 0; |
miguelangel_2511 | 8:208d965a3bd2 | 84 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 85 | diff_pressure_psi = pressure_02_psi - pressure_01_psi; |
miguelangel_2511 | 8:208d965a3bd2 | 86 | |
miguelangel_2511 | 8:208d965a3bd2 | 87 | if(diff_pressure_psi < 0){ |
miguelangel_2511 | 11:5cb7ae8bd831 | 88 | flow_lpm = -SPIROMETER_SENSOR_CONSTANT_OXYGEN * sqrt(-diff_pressure_psi); |
miguelangel_2511 | 8:208d965a3bd2 | 89 | }else{ |
miguelangel_2511 | 11:5cb7ae8bd831 | 90 | flow_lpm = SPIROMETER_SENSOR_CONSTANT_OXYGEN * sqrt(diff_pressure_psi); |
miguelangel_2511 | 8:208d965a3bd2 | 91 | } |
miguelangel_2511 | 8:208d965a3bd2 | 92 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 93 | /* Filter flow value */ |
miguelangel_2511 | 11:5cb7ae8bd831 | 94 | flow_lpm = Flow_FIR_LPF(flow_lpm, 0); |
miguelangel_2511 | 11:5cb7ae8bd831 | 95 | flow_lpm = Flow_Cheby2_HPF(flow_lpm, 0); |
miguelangel_2511 | 8:208d965a3bd2 | 96 | |
miguelangel_2511 | 12:3bc2465b034a | 97 | if((prev_flow_lpm > 0) && (flow_lpm <= 0)){ |
miguelangel_2511 | 12:3bc2465b034a | 98 | peak_volume_flag = 1; |
miguelangel_2511 | 12:3bc2465b034a | 99 | } |
miguelangel_2511 | 12:3bc2465b034a | 100 | |
miguelangel_2511 | 12:3bc2465b034a | 101 | prev_flow_lpm = flow_lpm; |
miguelangel_2511 | 12:3bc2465b034a | 102 | |
miguelangel_2511 | 8:208d965a3bd2 | 103 | } |
miguelangel_2511 | 8:208d965a3bd2 | 104 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 105 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 106 | /* Simpson's integration */ |
miguelangel_2511 | 11:5cb7ae8bd831 | 107 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 108 | void Calculate_Volume_From_Flow(void){ |
miguelangel_2511 | 11:5cb7ae8bd831 | 109 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 110 | static uint8_t integral_count = 0; |
miguelangel_2511 | 11:5cb7ae8bd831 | 111 | static float f_x[3] = {0.0, 0.0, 0.0}; |
miguelangel_2511 | 11:5cb7ae8bd831 | 112 | float delta_volume_ml; |
miguelangel_2511 | 9:95fdcdc0977e | 113 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 114 | f_x[2] = f_x[1]; |
miguelangel_2511 | 11:5cb7ae8bd831 | 115 | f_x[1] = f_x[0]; |
miguelangel_2511 | 11:5cb7ae8bd831 | 116 | f_x[0] = flow_lpm; |
miguelangel_2511 | 11:5cb7ae8bd831 | 117 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 118 | integral_count++; |
miguelangel_2511 | 9:95fdcdc0977e | 119 | |
miguelangel_2511 | 11:5cb7ae8bd831 | 120 | if(integral_count >= 2){ |
miguelangel_2511 | 11:5cb7ae8bd831 | 121 | delta_volume_ml = ((float)PRESSURE_SENSOR_READ_PERIOD_MS / 180.0) * (f_x[2] + (4 * f_x[1]) + f_x[0]); |
miguelangel_2511 | 11:5cb7ae8bd831 | 122 | volume_ml += delta_volume_ml; |
miguelangel_2511 | 11:5cb7ae8bd831 | 123 | integral_count = 0; |
miguelangel_2511 | 11:5cb7ae8bd831 | 124 | } |
miguelangel_2511 | 9:95fdcdc0977e | 125 | |
miguelangel_2511 | 8:208d965a3bd2 | 126 | } |
miguelangel_2511 | 8:208d965a3bd2 | 127 | |
miguelangel_2511 | 8:208d965a3bd2 | 128 |