Working code for pc app 12/01/2018 commit

Dependencies:   mbed MS5607 mbed-dsp

Fork of Turrentine_Code by Alex Stokoe

Committer:
intrinseca
Date:
Thu Jan 25 09:21:43 2018 +0000
Revision:
3:c80aa39db5bb
Parent:
2:3d3e21c907e4
Child:
4:d4804771134a
Update to use MS5607 library and include DFT built in

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AlexStokoe 0:2c6d81be69d8 1 #include "mbed.h"
intrinseca 3:c80aa39db5bb 2 #include "MS5607SPI.h"
intrinseca 3:c80aa39db5bb 3 #include "arm_math.h"
AlexStokoe 0:2c6d81be69d8 4
AlexStokoe 0:2c6d81be69d8 5 #define M_PI 3.14159265358979323846
AlexStokoe 0:2c6d81be69d8 6
intrinseca 2:3d3e21c907e4 7 #define N_SAMPLES 1024
intrinseca 1:ab3dacbfcde6 8
AlexStokoe 0:2c6d81be69d8 9 //mbed class def
AlexStokoe 0:2c6d81be69d8 10 Serial pc(USBTX, USBRX); // tx, rx
intrinseca 3:c80aa39db5bb 11 MS5607SPI pressure_sensor(p5, p6, p7, p8); // mosi, miso, sclk, cs
AlexStokoe 0:2c6d81be69d8 12
intrinseca 3:c80aa39db5bb 13 BusOut leds(LED1, LED2, LED3, LED4);
AlexStokoe 0:2c6d81be69d8 14
intrinseca 3:c80aa39db5bb 15 PwmOut motor(p26);
AlexStokoe 0:2c6d81be69d8 16
intrinseca 3:c80aa39db5bb 17 Timer sample_timer;
intrinseca 3:c80aa39db5bb 18 Timer iter_timer;
AlexStokoe 0:2c6d81be69d8 19
intrinseca 3:c80aa39db5bb 20 float p_data[N_SAMPLES];
intrinseca 3:c80aa39db5bb 21 float p_data_raw[N_SAMPLES];
intrinseca 3:c80aa39db5bb 22 float f_data[N_SAMPLES];
intrinseca 3:c80aa39db5bb 23 float mag_data[N_SAMPLES / 2 + 1];
AlexStokoe 0:2c6d81be69d8 24
intrinseca 1:ab3dacbfcde6 25 unsigned int tData[N_SAMPLES];
AlexStokoe 0:2c6d81be69d8 26
intrinseca 3:c80aa39db5bb 27 arm_rfft_fast_instance_f32 rfft;
AlexStokoe 0:2c6d81be69d8 28
AlexStokoe 0:2c6d81be69d8 29 float duty = 1;
AlexStokoe 0:2c6d81be69d8 30
AlexStokoe 0:2c6d81be69d8 31 int round(float number)
AlexStokoe 0:2c6d81be69d8 32 {
AlexStokoe 0:2c6d81be69d8 33 return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5);
AlexStokoe 0:2c6d81be69d8 34 }
AlexStokoe 0:2c6d81be69d8 35
intrinseca 1:ab3dacbfcde6 36 int main()
intrinseca 1:ab3dacbfcde6 37 {
intrinseca 3:c80aa39db5bb 38 printf("Turrentine\n");
intrinseca 3:c80aa39db5bb 39
intrinseca 3:c80aa39db5bb 40 //Configure PC serial link
AlexStokoe 0:2c6d81be69d8 41 pc.baud(115200);
intrinseca 3:c80aa39db5bb 42
intrinseca 3:c80aa39db5bb 43 //Configure motor PWM
intrinseca 3:c80aa39db5bb 44 motor = 0;
intrinseca 3:c80aa39db5bb 45 motor.period_ms(10);
intrinseca 2:3d3e21c907e4 46
intrinseca 2:3d3e21c907e4 47 printf("Pump On\n");
intrinseca 2:3d3e21c907e4 48 //turn pump on
intrinseca 3:c80aa39db5bb 49 motor.write(duty);
intrinseca 2:3d3e21c907e4 50
intrinseca 1:ab3dacbfcde6 51 printf("Start loop\n");
intrinseca 3:c80aa39db5bb 52 int iter_counter = 0; //Iteration counter
intrinseca 3:c80aa39db5bb 53 iter_timer.start();
intrinseca 1:ab3dacbfcde6 54
intrinseca 3:c80aa39db5bb 55 //program loop
intrinseca 3:c80aa39db5bb 56 while(1) {
intrinseca 3:c80aa39db5bb 57 sample_timer.reset();
intrinseca 3:c80aa39db5bb 58 sample_timer.start();
intrinseca 3:c80aa39db5bb 59
intrinseca 3:c80aa39db5bb 60 float temperature_raw = pressure_sensor.getRawTemperature();
intrinseca 3:c80aa39db5bb 61
intrinseca 3:c80aa39db5bb 62 //Capture raw pressure samples
intrinseca 1:ab3dacbfcde6 63 for(int i = 0; i < N_SAMPLES; i++) {
intrinseca 3:c80aa39db5bb 64 p_data_raw[i] = pressure_sensor.calculatePressure(pressure_sensor.getRawPressure(), temperature_raw);
intrinseca 3:c80aa39db5bb 65 p_data[i] = p_data_raw[i];
intrinseca 1:ab3dacbfcde6 66 }
intrinseca 3:c80aa39db5bb 67
intrinseca 3:c80aa39db5bb 68 sample_timer.stop();
intrinseca 3:c80aa39db5bb 69
intrinseca 3:c80aa39db5bb 70 //http://www.keil.com/pack/doc/CMSIS/DSP/html/group__RealFFT.html
intrinseca 3:c80aa39db5bb 71 //Compute the RFFT
intrinseca 3:c80aa39db5bb 72 //
intrinseca 3:c80aa39db5bb 73 //p_data is trashed in the process
intrinseca 3:c80aa39db5bb 74 //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]
intrinseca 3:c80aa39db5bb 75 arm_rfft_fast_init_f32(&rfft, N_SAMPLES);
intrinseca 3:c80aa39db5bb 76 arm_rfft_fast_f32(&rfft, p_data, f_data, 0);
intrinseca 3:c80aa39db5bb 77
intrinseca 3:c80aa39db5bb 78 //http://www.keil.com/pack/doc/CMSIS/DSP/html/group__cmplx__mag.html
intrinseca 3:c80aa39db5bb 79 //Convert to magntiude, skip over the DC and fundamental terms
intrinseca 3:c80aa39db5bb 80
intrinseca 3:c80aa39db5bb 81 arm_cmplx_mag_f32(&f_data[2], &mag_data[1], (N_SAMPLES / 2) - 1);
intrinseca 3:c80aa39db5bb 82 //Fill in the first and last terms from the first entry in f_data
intrinseca 3:c80aa39db5bb 83 mag_data[0] = f_data[0];
intrinseca 3:c80aa39db5bb 84 mag_data[N_SAMPLES / 2] = f_data[1];
intrinseca 3:c80aa39db5bb 85
intrinseca 3:c80aa39db5bb 86 //Output iteration data
intrinseca 3:c80aa39db5bb 87 iter_counter++;
intrinseca 3:c80aa39db5bb 88 printf("%10.5g %5d %5d\n", f_data[0] / N_SAMPLES, 1000000 / (sample_timer.read_us() / N_SAMPLES), iter_timer.read_ms() / iter_counter);
intrinseca 3:c80aa39db5bb 89
intrinseca 3:c80aa39db5bb 90 //Output raw data
intrinseca 3:c80aa39db5bb 91 /*for(int i = 0; i < N_SAMPLES; i++) {
intrinseca 3:c80aa39db5bb 92 printf("%f %f\n", p_data_raw[i], f_data[i]);
intrinseca 3:c80aa39db5bb 93 }*/
intrinseca 3:c80aa39db5bb 94
intrinseca 3:c80aa39db5bb 95 //Analysis - average from bin 15 to bin 25
intrinseca 3:c80aa39db5bb 96 //Print out subset of data
intrinseca 3:c80aa39db5bb 97 float average = 0;
intrinseca 3:c80aa39db5bb 98
intrinseca 3:c80aa39db5bb 99 for(int i = 15; i < 25; i++) {
intrinseca 3:c80aa39db5bb 100 printf("%10.5g ", mag_data[i]);
intrinseca 3:c80aa39db5bb 101 average += mag_data[i] / 10;
intrinseca 1:ab3dacbfcde6 102 }
intrinseca 3:c80aa39db5bb 103
intrinseca 3:c80aa39db5bb 104 printf("%10.5g\n", average);
intrinseca 3:c80aa39db5bb 105
intrinseca 3:c80aa39db5bb 106 //Set LEDs based on thresholds
intrinseca 3:c80aa39db5bb 107 leds[0] = average > 1000.f;
intrinseca 3:c80aa39db5bb 108 leds[1] = average > 2000.f;
intrinseca 3:c80aa39db5bb 109 leds[2] = average > 3000.f;
intrinseca 3:c80aa39db5bb 110 leds[3] = average > 4000.f;
intrinseca 3:c80aa39db5bb 111
intrinseca 3:c80aa39db5bb 112 //break;
intrinseca 1:ab3dacbfcde6 113 }
AlexStokoe 0:2c6d81be69d8 114 }