spit out pressure samples and FFT bins

Dependencies:   MS5607 mbed-dsp mbed

main.cpp

Committer:
AlexStokoe
Date:
2018-06-07
Revision:
0:ec4e8ecd0db7

File content as of revision 0:ec4e8ecd0db7:

#include "mbed.h"
#include "MS5607SPI.h"
#include "arm_math.h"

#define N_SAMPLES 1024
#define PEAK_SEARCH_START 1 //first bin to include in peak search
#define PEAK_SEARCH_END 100 //last bin to include in peak search
#define SUM_AROUND_PEAK 2 //+/- this many bins

#define REGRESSION_SLOPE 53.77986f //from Excel fit to test data
#define REGRESSION_INTERCEPT -80.07f

Serial pc(USBTX, USBRX);

DigitalOut myled(LED1);
PwmOut drive(p26);
AnalogIn motorVolt(p19);
AnalogIn motorAmp(p20);
DigitalOut ps(p9);

DigitalOut trig(p21);

Timer sample_timer;
Timer iter_timer;

MS5607SPI pressure_sensor(p5, p6, p7, p8); // mosi, miso, sclk, cs

arm_rfft_fast_instance_f32 rfft;

float p_data[N_SAMPLES];
float p_data_raw[N_SAMPLES];
int p_data_rawi[N_SAMPLES];
int t_data[N_SAMPLES];
float f_data[N_SAMPLES];
float mag_data[N_SAMPLES / 2 + 1];

unsigned int tData[N_SAMPLES];

unsigned int coefficients[7];
char str[32];
float motorDuty;
float motorCurr;
float sample_rate;

float blockMag;

//run flow block functionality and print some of sample out to console for analysis
float flowBlock(float duty, int dataPrint) {
    if (dataPrint){
        pc.printf("STARTING FLOW BLOCK TEST- %3.0f%% Duty Cycle\n", duty*100);
    }
    
    //turn motor on hard and settle to required duty cycle (voltage)
    drive.write(1.0f);
    wait_ms(100);
    drive.write(duty);
    
    int iter_counter = 0; //Iteration counter
    iter_timer.reset();
    iter_timer.start();
    float temperature_raw = pressure_sensor.getRawTemperature();

    int a = 0;
    while (a<2000) {
        pressure_sensor.getRawPressure();
        a++;
    }
    
    sample_timer.reset();
    sample_timer.start();

    //Capture raw pressure samples
    for(int i = 0; i < N_SAMPLES; i++) {
        trig = 1;
        p_data_raw[i] = pressure_sensor.calculatePressure(pressure_sensor.getRawPressure(), temperature_raw);
        trig = 0;
        p_data[i] = p_data_raw[i];
    }
    
    sample_timer.stop();
    motorCurr = 0;
    for(int x=0; x<10; x++){
        motorCurr = motorCurr + motorAmp.read();
    }    
    //turn off motor        
    drive.write(0.0);
    
    
    
    //http://www.keil.com/pack/doc/CMSIS/DSP/html/group__RealFFT.html
    //Compute the RFFT
    //
    //p_data is trashed in the process
    //Result is packaged as [real_0, real_N/2, real_1, imag_1, real_2, imag_2 ... real_N/2-1, imag_N/2-1]
    arm_rfft_fast_init_f32(&rfft, N_SAMPLES);
    arm_rfft_fast_f32(&rfft, p_data, f_data, 0);

    //http://www.keil.com/pack/doc/CMSIS/DSP/html/group__cmplx__mag.html
    //Convert to magntiude, skip over the DC and fundamental terms

    arm_cmplx_mag_f32(&f_data[2], &mag_data[1], (N_SAMPLES / 2) - 1);
    //Fill in the first and last terms from the first entry in f_data
    mag_data[0] = f_data[0];
    mag_data[N_SAMPLES / 2] = f_data[1];


    //Find peak in spectrum
    float max_mag = -1;
    int max_mag_i = -1;
    if (dataPrint) {
        
        for (int x=0; x < N_SAMPLES; x++){
            pc.printf("%f, %f\n", p_data_raw[x], mag_data[x]);
            }
        
    }
    
    for(int i = PEAK_SEARCH_START + SUM_AROUND_PEAK; i < PEAK_SEARCH_END; i++) {
        if (dataPrint) {
            //pc.printf("%10f \n", mag_data[i]);
        }
        if(mag_data[i] > max_mag) {
            max_mag_i = i;
            max_mag = mag_data[i];
        }
    }
    //pc.printf("max mag=%f\n", max_mag);
    
    //Sum surrounding
    float sum = 0.f;
    for(int i = max_mag_i - SUM_AROUND_PEAK; i < (max_mag_i + SUM_AROUND_PEAK + 1); i++) {
        sum += mag_data[i];
        //printf("%10f ", sum);
    }

   

    //Scale by N_SAMPLES to recover pressure in Pa
    sum /= N_SAMPLES;

    //Apply inverse of logarithmic regression from test data
    float t90 = exp((sum + 80.07) / 53.77986);


    //Output iteration data
    iter_counter++;
    sample_rate = 1000000 / (sample_timer.read_us() / N_SAMPLES);
    if (dataPrint) {
        pc.printf("   titer    fsamp  avpress     fmax sum_peak         t90\n");
        pc.printf("%8.2f, %8.2f, %8.1f, %8.1f, %3.5e, %8.1f\n", iter_timer.read(), sample_rate, f_data[0] / N_SAMPLES, (max_mag_i * sample_rate / N_SAMPLES), sum, t90);
        //pc.printf("$SAM\n");
        //pc.printf("$%d\n", sample_timer.read_us());
    }
    
    return sum;
    
}
//run flow block functionality and print some of sample out to console for analysis
void flowBlockRaw(float duty) {
    
    pc.printf("START\n");

    //turn motor on hard and settle to required duty cycle (voltage)
    drive.write(1.0f);
    wait_ms(100);
    drive.write(duty);
    
    int iter_counter = 0; //Iteration counter
    iter_timer.reset();
    iter_timer.start();
    float temperature_raw = pressure_sensor.getRawTemperature();

    int a = 0;
    while (a<2000) {
        pressure_sensor.getRawPressure();
        a++;
    }
    
    sample_timer.reset();
    sample_timer.start();

    //Capture raw pressure samples
    for(int i = 0; i < N_SAMPLES; i++) {
        t_data[i] = sample_timer.read_us();
        p_data_rawi[i] = pressure_sensor.getRawPressure();  
    }
    
    sample_timer.stop();
    
    //print to console
    for(int i = 0; i < N_SAMPLES; i++) {
        pc.printf("%d, %u\n", t_data[i], p_data_rawi[i]);
        p_data[i] = (float)p_data_rawi[i];
    }
     
    pc.printf("STOP\n");      
    drive.write(0.0);
    
}

int main() {
    pc.baud(115200);
    pc.printf("MS5607 TEST\n");
    drive.period_ms(10);
    motorDuty = 1.0f;
    drive.write(motorDuty);
    ps = 0;
    
    pressure_sensor.reset();
    //pc.printf("CRC check %d\n", pressure_sensor.checkCRC());
    //pressure_sensor.printCoefficients(str);
    //pc.printf(str);
    
    
    motorDuty = 1.0f;
    
    for (int i = 0; i<10; i++){
         
        //pc.printf("%3.0f, %f \n", motorDuty*100, flowBlock(motorDuty, 1));
        //motorDuty = motorDuty + 0.01;
        flowBlock(motorDuty, 1);
        
        
            
        }
    pc.printf("END\n");
    
}