Es un backup para las pruebas de firmware y hardware de un ventilador

Dependencies:   mbed QEI FastPWM

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?

UserRevisionLine numberNew 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