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

Dependencies:   mbed QEI FastPWM

Committer:
miguelangel_2511
Date:
Sun Apr 26 08:50:12 2020 +0000
Revision:
9:95fdcdc0977e
Parent:
8:208d965a3bd2
Child:
11:5cb7ae8bd831
Prueba del ventilador con las graficas de volumen, flujo y presion. Aun no se ha tomado en cuenta la influencia del tiempo de impresion sobre la frecuencia de muestreo eficaz.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miguelangel_2511 7:f4e248182d31 1
miguelangel_2511 7:f4e248182d31 2 #include "mbed.h"
miguelangel_2511 7:f4e248182d31 3 #include "stdint.h"
miguelangel_2511 8:208d965a3bd2 4 #include "math.h"
miguelangel_2511 7:f4e248182d31 5 #include "project_defines.h"
miguelangel_2511 7:f4e248182d31 6 #include "pressure_sensors.h"
miguelangel_2511 7:f4e248182d31 7
miguelangel_2511 7:f4e248182d31 8
miguelangel_2511 7:f4e248182d31 9 /* Object definition */
miguelangel_2511 7:f4e248182d31 10 I2C pressure_sensor_01(PRESSURE_SENSOR_01_SDA_PIN, PRESSURE_SENSOR_01_SCL_PIN);
miguelangel_2511 7:f4e248182d31 11 I2C pressure_sensor_02(PRESSURE_SENSOR_02_SDA_PIN, PRESSURE_SENSOR_02_SCL_PIN);
miguelangel_2511 7:f4e248182d31 12
miguelangel_2511 7:f4e248182d31 13 /* Global variable definition */
miguelangel_2511 8:208d965a3bd2 14 int16_t pressure_01_bin, pressure_02_bin;
miguelangel_2511 8:208d965a3bd2 15 float pressure_01_psi, pressure_02_psi;
miguelangel_2511 8:208d965a3bd2 16 float flow_lpm, volume_ml;
miguelangel_2511 9:95fdcdc0977e 17 float lpf_01_prev_out, lpf_02_prev_out;
miguelangel_2511 8:208d965a3bd2 18
miguelangel_2511 8:208d965a3bd2 19 //float diff_pressure_psi;
miguelangel_2511 7:f4e248182d31 20
miguelangel_2511 7:f4e248182d31 21 char sensor_read_data_buffer[2];
miguelangel_2511 7:f4e248182d31 22
miguelangel_2511 7:f4e248182d31 23 /* Function definition */
miguelangel_2511 7:f4e248182d31 24
miguelangel_2511 7:f4e248182d31 25 void Pressure_Sensors_Initialize(void){
miguelangel_2511 9:95fdcdc0977e 26
miguelangel_2511 9:95fdcdc0977e 27 int16_t sensor_01_aux, sensor_02_aux;
miguelangel_2511 9:95fdcdc0977e 28
miguelangel_2511 7:f4e248182d31 29 pressure_sensor_01.frequency(PRESSURE_SENSOR_I2C_CLK_HZ );
miguelangel_2511 7:f4e248182d31 30 pressure_sensor_02.frequency(PRESSURE_SENSOR_I2C_CLK_HZ );
miguelangel_2511 9:95fdcdc0977e 31
miguelangel_2511 9:95fdcdc0977e 32 /* Perform an initial measurement */
miguelangel_2511 9:95fdcdc0977e 33
miguelangel_2511 9:95fdcdc0977e 34 pressure_sensor_01.read(PRESSURE_SENSOR_01_SRA, sensor_read_data_buffer, 2);
miguelangel_2511 9:95fdcdc0977e 35 sensor_01_aux = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
miguelangel_2511 9:95fdcdc0977e 36
miguelangel_2511 9:95fdcdc0977e 37 if(sensor_01_aux < PRESSURE_SENSOR_OUTPUT_MIN){
miguelangel_2511 9:95fdcdc0977e 38 sensor_01_aux = PRESSURE_SENSOR_OUTPUT_MIN;
miguelangel_2511 9:95fdcdc0977e 39 }
miguelangel_2511 9:95fdcdc0977e 40
miguelangel_2511 9:95fdcdc0977e 41 pressure_sensor_02.read(PRESSURE_SENSOR_02_SRA, sensor_read_data_buffer, 2);
miguelangel_2511 9:95fdcdc0977e 42 sensor_02_aux = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
miguelangel_2511 9:95fdcdc0977e 43
miguelangel_2511 9:95fdcdc0977e 44 if(sensor_02_aux < PRESSURE_SENSOR_OUTPUT_MIN){
miguelangel_2511 9:95fdcdc0977e 45 sensor_02_aux = PRESSURE_SENSOR_OUTPUT_MIN;
miguelangel_2511 9:95fdcdc0977e 46 }
miguelangel_2511 9:95fdcdc0977e 47
miguelangel_2511 9:95fdcdc0977e 48 lpf_01_prev_out = (float)sensor_01_aux;
miguelangel_2511 9:95fdcdc0977e 49 lpf_02_prev_out = (float)sensor_02_aux;
miguelangel_2511 9:95fdcdc0977e 50
miguelangel_2511 7:f4e248182d31 51 }
miguelangel_2511 7:f4e248182d31 52
miguelangel_2511 7:f4e248182d31 53
miguelangel_2511 7:f4e248182d31 54 void Pressure_Sensors_Read(void){
miguelangel_2511 7:f4e248182d31 55
miguelangel_2511 9:95fdcdc0977e 56 int16_t raw_pressure_01_bin, raw_pressure_02_bin;
miguelangel_2511 9:95fdcdc0977e 57
miguelangel_2511 7:f4e248182d31 58 /* Read binary values */
miguelangel_2511 7:f4e248182d31 59 pressure_sensor_01.read(PRESSURE_SENSOR_01_SRA, sensor_read_data_buffer, 2);
miguelangel_2511 9:95fdcdc0977e 60 raw_pressure_01_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
miguelangel_2511 9:95fdcdc0977e 61
miguelangel_2511 9:95fdcdc0977e 62 if(raw_pressure_01_bin < PRESSURE_SENSOR_OUTPUT_MIN){
miguelangel_2511 9:95fdcdc0977e 63 raw_pressure_01_bin = PRESSURE_SENSOR_OUTPUT_MIN;
miguelangel_2511 9:95fdcdc0977e 64 }
miguelangel_2511 9:95fdcdc0977e 65
miguelangel_2511 7:f4e248182d31 66 pressure_sensor_02.read(PRESSURE_SENSOR_02_SRA, sensor_read_data_buffer, 2);
miguelangel_2511 9:95fdcdc0977e 67 raw_pressure_02_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
miguelangel_2511 9:95fdcdc0977e 68
miguelangel_2511 9:95fdcdc0977e 69 if(raw_pressure_02_bin < PRESSURE_SENSOR_OUTPUT_MIN){
miguelangel_2511 9:95fdcdc0977e 70 raw_pressure_02_bin = PRESSURE_SENSOR_OUTPUT_MIN;
miguelangel_2511 9:95fdcdc0977e 71 }
miguelangel_2511 9:95fdcdc0977e 72
miguelangel_2511 9:95fdcdc0977e 73 /* Filter binary values */
miguelangel_2511 9:95fdcdc0977e 74 pressure_01_bin = Low_Pass_Filter_01(raw_pressure_01_bin);
miguelangel_2511 9:95fdcdc0977e 75 pressure_02_bin = Low_Pass_Filter_02(raw_pressure_02_bin);
miguelangel_2511 7:f4e248182d31 76
miguelangel_2511 7:f4e248182d31 77 /* Calculate pressure values in PSI */
miguelangel_2511 9:95fdcdc0977e 78 pressure_01_psi = (pressure_01_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN);
miguelangel_2511 9:95fdcdc0977e 79 pressure_01_psi = (pressure_01_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN;
miguelangel_2511 9:95fdcdc0977e 80 //pressure_01_psi += PRESSURE_SENSOR_OFFSET_PSI;
miguelangel_2511 9:95fdcdc0977e 81 pressure_02_psi = (pressure_02_bin - PRESSURE_SENSOR_OUTPUT_MIN) * (PRESSURE_SENSOR_PRESSURE_MAX - PRESSURE_SENSOR_PRESSURE_MIN);
miguelangel_2511 9:95fdcdc0977e 82 pressure_02_psi = (pressure_02_psi / (PRESSURE_SENSOR_OUTPUT_MAX - PRESSURE_SENSOR_OUTPUT_MIN)) + PRESSURE_SENSOR_PRESSURE_MIN;
miguelangel_2511 9:95fdcdc0977e 83 //pressure_02_psi += PRESSURE_SENSOR_OFFSET_PSI;
miguelangel_2511 9:95fdcdc0977e 84 }
miguelangel_2511 8:208d965a3bd2 85
miguelangel_2511 9:95fdcdc0977e 86
miguelangel_2511 7:f4e248182d31 87
miguelangel_2511 8:208d965a3bd2 88 void Calculate_Flow_From_Pressure(void){
miguelangel_2511 8:208d965a3bd2 89
miguelangel_2511 8:208d965a3bd2 90 float diff_pressure_psi;
miguelangel_2511 8:208d965a3bd2 91
miguelangel_2511 9:95fdcdc0977e 92 diff_pressure_psi = pressure_02_psi - pressure_01_psi;
miguelangel_2511 8:208d965a3bd2 93
miguelangel_2511 8:208d965a3bd2 94 if(diff_pressure_psi < 0){
miguelangel_2511 8:208d965a3bd2 95 flow_lpm = -SPIROMETER_SENSOR_CONSTANT * sqrt(-diff_pressure_psi);
miguelangel_2511 8:208d965a3bd2 96 }else{
miguelangel_2511 8:208d965a3bd2 97 flow_lpm = SPIROMETER_SENSOR_CONSTANT * sqrt(diff_pressure_psi);
miguelangel_2511 8:208d965a3bd2 98 }
miguelangel_2511 8:208d965a3bd2 99 }
miguelangel_2511 7:f4e248182d31 100
miguelangel_2511 8:208d965a3bd2 101 void Calculate_Volume_From_Flow(void){
miguelangel_2511 8:208d965a3bd2 102
miguelangel_2511 8:208d965a3bd2 103 static float previous_flow_lpm = 0.0;
miguelangel_2511 8:208d965a3bd2 104 float delta_volume_ml;
miguelangel_2511 8:208d965a3bd2 105
miguelangel_2511 8:208d965a3bd2 106 delta_volume_ml = (PRESSURE_SENSOR_READ_PERIOD_MS * (flow_lpm + previous_flow_lpm)) / 60.0;
miguelangel_2511 8:208d965a3bd2 107
miguelangel_2511 8:208d965a3bd2 108 volume_ml = volume_ml + delta_volume_ml;
miguelangel_2511 8:208d965a3bd2 109
miguelangel_2511 8:208d965a3bd2 110 previous_flow_lpm = flow_lpm;
miguelangel_2511 8:208d965a3bd2 111
miguelangel_2511 8:208d965a3bd2 112 }
miguelangel_2511 8:208d965a3bd2 113
miguelangel_2511 9:95fdcdc0977e 114 int16_t Low_Pass_Filter_01(int16_t raw_value){
miguelangel_2511 9:95fdcdc0977e 115
miguelangel_2511 9:95fdcdc0977e 116 float lpf_out, sample_period_sec, div;
miguelangel_2511 9:95fdcdc0977e 117
miguelangel_2511 9:95fdcdc0977e 118 sample_period_sec = 0.001 * ((float)PRESSURE_SENSOR_READ_PERIOD_MS);
miguelangel_2511 9:95fdcdc0977e 119 div = sample_period_sec + LPF_RC_CONSTANT_SEC;
miguelangel_2511 9:95fdcdc0977e 120
miguelangel_2511 9:95fdcdc0977e 121 lpf_out = (((float)raw_value) * (sample_period_sec / div)) + (lpf_01_prev_out * (LPF_RC_CONSTANT_SEC / div));
miguelangel_2511 9:95fdcdc0977e 122 lpf_01_prev_out = lpf_out;
miguelangel_2511 9:95fdcdc0977e 123
miguelangel_2511 9:95fdcdc0977e 124 return ((int16_t)lpf_out);
miguelangel_2511 8:208d965a3bd2 125
miguelangel_2511 8:208d965a3bd2 126 }
miguelangel_2511 8:208d965a3bd2 127
miguelangel_2511 8:208d965a3bd2 128
miguelangel_2511 9:95fdcdc0977e 129 int16_t Low_Pass_Filter_02(int16_t raw_value){
miguelangel_2511 8:208d965a3bd2 130
miguelangel_2511 9:95fdcdc0977e 131 float lpf_out, sample_period_sec, div;
miguelangel_2511 9:95fdcdc0977e 132
miguelangel_2511 9:95fdcdc0977e 133 sample_period_sec = 0.001 * ((float)PRESSURE_SENSOR_READ_PERIOD_MS);
miguelangel_2511 9:95fdcdc0977e 134 div = sample_period_sec + LPF_RC_CONSTANT_SEC;
miguelangel_2511 9:95fdcdc0977e 135
miguelangel_2511 9:95fdcdc0977e 136 lpf_out = (((float)raw_value) * (sample_period_sec / div)) + (lpf_02_prev_out * (LPF_RC_CONSTANT_SEC / div));
miguelangel_2511 9:95fdcdc0977e 137 lpf_02_prev_out = lpf_out;
miguelangel_2511 9:95fdcdc0977e 138
miguelangel_2511 9:95fdcdc0977e 139 return ((int16_t)lpf_out);
miguelangel_2511 8:208d965a3bd2 140 }