pachas

Dependencies:   mbed QEI FastPWM

pressure_sensors.cpp

Committer:
miguelangel_2511
Date:
2020-04-26
Revision:
9:95fdcdc0977e
Parent:
8:208d965a3bd2
Child:
11:5cb7ae8bd831

File content as of revision 9:95fdcdc0977e:


#include "mbed.h"
#include "stdint.h"
#include "math.h"
#include "project_defines.h"
#include "pressure_sensors.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 */
int16_t pressure_01_bin, pressure_02_bin;
float pressure_01_psi, pressure_02_psi;
float flow_lpm, volume_ml;
float lpf_01_prev_out, lpf_02_prev_out;

//float diff_pressure_psi;

char sensor_read_data_buffer[2];

/* Function definition */

void Pressure_Sensors_Initialize(void){
    
    int16_t sensor_01_aux, sensor_02_aux;
    
    pressure_sensor_01.frequency(PRESSURE_SENSOR_I2C_CLK_HZ ); 
    pressure_sensor_02.frequency(PRESSURE_SENSOR_I2C_CLK_HZ );
    
    /* Perform an initial measurement */

    pressure_sensor_01.read(PRESSURE_SENSOR_01_SRA, sensor_read_data_buffer, 2);
    sensor_01_aux = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
    
    if(sensor_01_aux < PRESSURE_SENSOR_OUTPUT_MIN){
        sensor_01_aux = PRESSURE_SENSOR_OUTPUT_MIN;
    }    
    
    pressure_sensor_02.read(PRESSURE_SENSOR_02_SRA, sensor_read_data_buffer, 2);
    sensor_02_aux = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;

    if(sensor_02_aux < PRESSURE_SENSOR_OUTPUT_MIN){
        sensor_02_aux = PRESSURE_SENSOR_OUTPUT_MIN;
    }    
        
    lpf_01_prev_out = (float)sensor_01_aux;
    lpf_02_prev_out = (float)sensor_02_aux;

}


void Pressure_Sensors_Read(void){
    
    int16_t raw_pressure_01_bin, raw_pressure_02_bin;
    
    /* Read binary values */
    pressure_sensor_01.read(PRESSURE_SENSOR_01_SRA, sensor_read_data_buffer, 2);
    raw_pressure_01_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
    
    if(raw_pressure_01_bin < PRESSURE_SENSOR_OUTPUT_MIN){
        raw_pressure_01_bin = PRESSURE_SENSOR_OUTPUT_MIN;
    }

    pressure_sensor_02.read(PRESSURE_SENSOR_02_SRA, sensor_read_data_buffer, 2);
    raw_pressure_02_bin = ((sensor_read_data_buffer[0] << 8) | sensor_read_data_buffer[1]) & 0x3FFF;
    
    if(raw_pressure_02_bin < PRESSURE_SENSOR_OUTPUT_MIN){
        raw_pressure_02_bin = PRESSURE_SENSOR_OUTPUT_MIN;
    }    
    
    /* Filter binary values */
    pressure_01_bin = Low_Pass_Filter_01(raw_pressure_01_bin);
    pressure_02_bin = Low_Pass_Filter_02(raw_pressure_02_bin);
    
    /* 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_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_OFFSET_PSI;
} 



void Calculate_Flow_From_Pressure(void){
    
    float diff_pressure_psi;
    
    diff_pressure_psi = pressure_02_psi - pressure_01_psi;
    
    if(diff_pressure_psi < 0){
        flow_lpm = -SPIROMETER_SENSOR_CONSTANT * sqrt(-diff_pressure_psi);    
    }else{
        flow_lpm = SPIROMETER_SENSOR_CONSTANT * sqrt(diff_pressure_psi);  
    }    
}

void Calculate_Volume_From_Flow(void){
    
    static float previous_flow_lpm = 0.0;
    float delta_volume_ml;
    
    delta_volume_ml = (PRESSURE_SENSOR_READ_PERIOD_MS * (flow_lpm + previous_flow_lpm)) / 60.0;
    
    volume_ml = volume_ml + delta_volume_ml;
    
    previous_flow_lpm = flow_lpm;
    
}

int16_t Low_Pass_Filter_01(int16_t raw_value){
    
    float lpf_out, sample_period_sec, div;
    
    sample_period_sec = 0.001 * ((float)PRESSURE_SENSOR_READ_PERIOD_MS);
    div = sample_period_sec + LPF_RC_CONSTANT_SEC;
    
    lpf_out = (((float)raw_value) * (sample_period_sec / div)) +  (lpf_01_prev_out * (LPF_RC_CONSTANT_SEC / div));
    lpf_01_prev_out = lpf_out;
    
    return ((int16_t)lpf_out);

}


int16_t Low_Pass_Filter_02(int16_t raw_value){

    float lpf_out, sample_period_sec, div;
    
    sample_period_sec = 0.001 * ((float)PRESSURE_SENSOR_READ_PERIOD_MS);
    div = sample_period_sec + LPF_RC_CONSTANT_SEC;
    
    lpf_out = (((float)raw_value) * (sample_period_sec / div)) +  (lpf_02_prev_out * (LPF_RC_CONSTANT_SEC / div));
    lpf_02_prev_out = lpf_out;
    
    return ((int16_t)lpf_out);
}