Working code for pc app 12/01/2018 commit
Dependencies: mbed MS5607 mbed-dsp
Fork of Turrentine_Code by
main.cpp@3:c80aa39db5bb, 2018-01-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |