spit out pressure samples and FFT bins
Dependencies: MS5607 mbed-dsp mbed
Revision 0:ec4e8ecd0db7, committed 2018-06-07
- Comitter:
- AlexStokoe
- Date:
- Thu Jun 07 16:55:30 2018 +0000
- Commit message:
- change to compensated pressure values;
Changed in this revision
diff -r 000000000000 -r ec4e8ecd0db7 MS5607.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MS5607.lib Thu Jun 07 16:55:30 2018 +0000 @@ -0,0 +1,1 @@ +http://os.mbed.com/teams/The-Technology-Partnership/code/MS5607/#32d5dcc432cb
diff -r 000000000000 -r ec4e8ecd0db7 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Jun 07 16:55:30 2018 +0000 @@ -0,0 +1,228 @@ +#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"); + +}
diff -r 000000000000 -r ec4e8ecd0db7 mbed-dsp.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-dsp.lib Thu Jun 07 16:55:30 2018 +0000 @@ -0,0 +1,1 @@ +http://os.mbed.com/users/mbed_official/code/mbed-dsp/#3762170b6d4d
diff -r 000000000000 -r ec4e8ecd0db7 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Jun 07 16:55:30 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/5aab5a7997ee \ No newline at end of file