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

Dependencies:   mbed QEI FastPWM

Committer:
miguelangel_2511
Date:
Thu May 07 03:52:31 2020 +0000
Revision:
11:5cb7ae8bd831
Parent:
9:95fdcdc0977e
Child:
12:3bc2465b034a
Se implemento un filtro IIIR tipo Chebyshev 2 Pasa-bajos de 30 Hz para cada sensor de presion.  Asimismo, se implemento un filtro IIR Chebyshev 2 Pasa-altos de 0.01 Hz y un filtro FIR pasa-bajos de 40 Hz para la senial de flujo.

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 11:5cb7ae8bd831 20
miguelangel_2511 7:f4e248182d31 21 /* Function definition */
miguelangel_2511 7:f4e248182d31 22
miguelangel_2511 7:f4e248182d31 23 void Pressure_Sensors_Initialize(void){
miguelangel_2511 9:95fdcdc0977e 24
miguelangel_2511 11:5cb7ae8bd831 25 pressure_sensor_01.frequency(PRESSURE_SENSOR_I2C_CLK_HZ);
miguelangel_2511 11:5cb7ae8bd831 26 pressure_sensor_02.frequency(PRESSURE_SENSOR_I2C_CLK_HZ);
miguelangel_2511 9:95fdcdc0977e 27
miguelangel_2511 11:5cb7ae8bd831 28 /* Initialize filters */
miguelangel_2511 11:5cb7ae8bd831 29 Pressure_01_Cheby2_LPF(0, 1);
miguelangel_2511 11:5cb7ae8bd831 30 Pressure_02_Cheby2_LPF(0, 1);
miguelangel_2511 11:5cb7ae8bd831 31 Flow_Cheby2_HPF(0, 1);
miguelangel_2511 11:5cb7ae8bd831 32 Flow_FIR_LPF(0,1);
miguelangel_2511 7:f4e248182d31 33 }
miguelangel_2511 7:f4e248182d31 34
miguelangel_2511 7:f4e248182d31 35
miguelangel_2511 7:f4e248182d31 36 void Pressure_Sensors_Read(void){
miguelangel_2511 7:f4e248182d31 37
miguelangel_2511 11:5cb7ae8bd831 38 int16_t pressure_01_bin;
miguelangel_2511 11:5cb7ae8bd831 39 int16_t pressure_02_bin;
miguelangel_2511 9:95fdcdc0977e 40
miguelangel_2511 11:5cb7ae8bd831 41 /* Read pressure 1 (differential) binary value */
miguelangel_2511 11:5cb7ae8bd831 42
miguelangel_2511 11:5cb7ae8bd831 43 sensor_read_data_buffer[0] = 0;
miguelangel_2511 11:5cb7ae8bd831 44 sensor_read_data_buffer[1] = 0;
miguelangel_2511 9:95fdcdc0977e 45
miguelangel_2511 11:5cb7ae8bd831 46 pressure_sensor_01.read(PRESSURE_SENSOR_01_SRA, sensor_read_data_buffer, 2);
miguelangel_2511 11:5cb7ae8bd831 47 pressure_01_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
miguelangel_2511 11:5cb7ae8bd831 48 if(pressure_01_bin < PRESSURE_SENSOR_OUTPUT_MIN){
miguelangel_2511 11:5cb7ae8bd831 49 pressure_01_bin = PRESSURE_SENSOR_OUTPUT_MIN;
miguelangel_2511 11:5cb7ae8bd831 50 }
miguelangel_2511 11:5cb7ae8bd831 51
miguelangel_2511 11:5cb7ae8bd831 52 /* Read pressure 2 binary value */
miguelangel_2511 9:95fdcdc0977e 53
miguelangel_2511 11:5cb7ae8bd831 54 sensor_read_data_buffer[0] = 0;
miguelangel_2511 11:5cb7ae8bd831 55 sensor_read_data_buffer[1] = 0;
miguelangel_2511 9:95fdcdc0977e 56
miguelangel_2511 11:5cb7ae8bd831 57 pressure_sensor_02.read(PRESSURE_SENSOR_02_SRA, sensor_read_data_buffer, 2);
miguelangel_2511 11:5cb7ae8bd831 58 pressure_02_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
miguelangel_2511 11:5cb7ae8bd831 59 if(pressure_02_bin < PRESSURE_SENSOR_OUTPUT_MIN){
miguelangel_2511 11:5cb7ae8bd831 60 pressure_02_bin = PRESSURE_SENSOR_OUTPUT_MIN;
miguelangel_2511 11:5cb7ae8bd831 61 }
miguelangel_2511 7:f4e248182d31 62
miguelangel_2511 7:f4e248182d31 63 /* Calculate pressure values in PSI */
miguelangel_2511 9:95fdcdc0977e 64 pressure_01_psi = (pressure_01_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN);
miguelangel_2511 9:95fdcdc0977e 65 pressure_01_psi = (pressure_01_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN;
miguelangel_2511 11:5cb7ae8bd831 66 pressure_01_psi += PRESSURE_SENSOR_01_OFFSET_PSI;
miguelangel_2511 11:5cb7ae8bd831 67
miguelangel_2511 9:95fdcdc0977e 68 pressure_02_psi = (pressure_02_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN);
miguelangel_2511 9:95fdcdc0977e 69 pressure_02_psi = (pressure_02_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN;
miguelangel_2511 11:5cb7ae8bd831 70 pressure_02_psi += PRESSURE_SENSOR_02_OFFSET_PSI;
miguelangel_2511 11:5cb7ae8bd831 71
miguelangel_2511 11:5cb7ae8bd831 72 /* Filter pressure values */
miguelangel_2511 11:5cb7ae8bd831 73 pressure_01_psi = Pressure_01_Cheby2_LPF(pressure_01_psi, 0);
miguelangel_2511 11:5cb7ae8bd831 74 pressure_02_psi = Pressure_02_Cheby2_LPF(pressure_02_psi, 0);
miguelangel_2511 11:5cb7ae8bd831 75
miguelangel_2511 9:95fdcdc0977e 76 }
miguelangel_2511 8:208d965a3bd2 77
miguelangel_2511 9:95fdcdc0977e 78
miguelangel_2511 8:208d965a3bd2 79 void Calculate_Flow_From_Pressure(void){
miguelangel_2511 8:208d965a3bd2 80
miguelangel_2511 8:208d965a3bd2 81 float diff_pressure_psi;
miguelangel_2511 8:208d965a3bd2 82
miguelangel_2511 11:5cb7ae8bd831 83 diff_pressure_psi = pressure_02_psi - pressure_01_psi;
miguelangel_2511 8:208d965a3bd2 84
miguelangel_2511 8:208d965a3bd2 85 if(diff_pressure_psi < 0){
miguelangel_2511 11:5cb7ae8bd831 86 flow_lpm = -SPIROMETER_SENSOR_CONSTANT_OXYGEN * sqrt(-diff_pressure_psi);
miguelangel_2511 8:208d965a3bd2 87 }else{
miguelangel_2511 11:5cb7ae8bd831 88 flow_lpm = SPIROMETER_SENSOR_CONSTANT_OXYGEN * sqrt(diff_pressure_psi);
miguelangel_2511 8:208d965a3bd2 89 }
miguelangel_2511 8:208d965a3bd2 90
miguelangel_2511 11:5cb7ae8bd831 91 /* Filter flow value */
miguelangel_2511 11:5cb7ae8bd831 92 flow_lpm = Flow_FIR_LPF(flow_lpm, 0);
miguelangel_2511 11:5cb7ae8bd831 93 flow_lpm = Flow_Cheby2_HPF(flow_lpm, 0);
miguelangel_2511 8:208d965a3bd2 94
miguelangel_2511 8:208d965a3bd2 95 }
miguelangel_2511 8:208d965a3bd2 96
miguelangel_2511 11:5cb7ae8bd831 97
miguelangel_2511 11:5cb7ae8bd831 98 /* Simpson's integration */
miguelangel_2511 11:5cb7ae8bd831 99
miguelangel_2511 11:5cb7ae8bd831 100 void Calculate_Volume_From_Flow(void){
miguelangel_2511 11:5cb7ae8bd831 101
miguelangel_2511 11:5cb7ae8bd831 102 static uint8_t integral_count = 0;
miguelangel_2511 11:5cb7ae8bd831 103 static float f_x[3] = {0.0, 0.0, 0.0};
miguelangel_2511 11:5cb7ae8bd831 104 float delta_volume_ml;
miguelangel_2511 9:95fdcdc0977e 105
miguelangel_2511 11:5cb7ae8bd831 106 f_x[2] = f_x[1];
miguelangel_2511 11:5cb7ae8bd831 107 f_x[1] = f_x[0];
miguelangel_2511 11:5cb7ae8bd831 108 f_x[0] = flow_lpm;
miguelangel_2511 11:5cb7ae8bd831 109
miguelangel_2511 11:5cb7ae8bd831 110 integral_count++;
miguelangel_2511 9:95fdcdc0977e 111
miguelangel_2511 11:5cb7ae8bd831 112 if(integral_count >= 2){
miguelangel_2511 11:5cb7ae8bd831 113 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 114 volume_ml += delta_volume_ml;
miguelangel_2511 11:5cb7ae8bd831 115 integral_count = 0;
miguelangel_2511 11:5cb7ae8bd831 116 }
miguelangel_2511 9:95fdcdc0977e 117
miguelangel_2511 8:208d965a3bd2 118 }
miguelangel_2511 8:208d965a3bd2 119
miguelangel_2511 8:208d965a3bd2 120