Working code for pc app 12/01/2018 commit

Dependencies:   mbed MS5607 mbed-dsp

Fork of Turrentine_Code by Alex Stokoe

Committer:
intrinseca
Date:
Fri Jan 12 15:40:32 2018 +0000
Revision:
2:3d3e21c907e4
Parent:
1:ab3dacbfcde6
Child:
3:c80aa39db5bb
Child:
6:8f16c432964d
Optimise readout

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AlexStokoe 0:2c6d81be69d8 1 #include "mbed.h"
AlexStokoe 0:2c6d81be69d8 2
AlexStokoe 0:2c6d81be69d8 3 #define M_PI 3.14159265358979323846
AlexStokoe 0:2c6d81be69d8 4
intrinseca 2:3d3e21c907e4 5 #define N_SAMPLES 1024
intrinseca 1:ab3dacbfcde6 6
AlexStokoe 0:2c6d81be69d8 7 //mbed class def
AlexStokoe 0:2c6d81be69d8 8 Serial pc(USBTX, USBRX); // tx, rx
AlexStokoe 0:2c6d81be69d8 9 SPI spi(p5, p6, p7); // mosi, miso, sclk
AlexStokoe 0:2c6d81be69d8 10 DigitalOut cs(p8);
AlexStokoe 0:2c6d81be69d8 11
AlexStokoe 0:2c6d81be69d8 12 PwmOut motorOn(p26);
AlexStokoe 0:2c6d81be69d8 13
AlexStokoe 0:2c6d81be69d8 14 Timer t;
AlexStokoe 0:2c6d81be69d8 15
AlexStokoe 0:2c6d81be69d8 16 //variable instaniation
AlexStokoe 0:2c6d81be69d8 17 unsigned short calData[6];
AlexStokoe 0:2c6d81be69d8 18
AlexStokoe 0:2c6d81be69d8 19 char buffer16[3];
intrinseca 1:ab3dacbfcde6 20 short int serbuffer[2];
AlexStokoe 0:2c6d81be69d8 21
AlexStokoe 0:2c6d81be69d8 22 char tempBuffer[4];
AlexStokoe 0:2c6d81be69d8 23 unsigned int temp = 0;
AlexStokoe 0:2c6d81be69d8 24 char pressBuffer[4];
AlexStokoe 0:2c6d81be69d8 25 unsigned int press = 0;
AlexStokoe 0:2c6d81be69d8 26
intrinseca 1:ab3dacbfcde6 27 unsigned int pData[N_SAMPLES];
intrinseca 1:ab3dacbfcde6 28 float spData[N_SAMPLES];
intrinseca 1:ab3dacbfcde6 29 unsigned int tData[N_SAMPLES];
AlexStokoe 0:2c6d81be69d8 30
AlexStokoe 0:2c6d81be69d8 31 const char cb1 = 0xA2;
AlexStokoe 0:2c6d81be69d8 32 const char cb2 = 0xA4;
AlexStokoe 0:2c6d81be69d8 33 const char cb3 = 0xA6;
AlexStokoe 0:2c6d81be69d8 34 const char cb4 = 0xA8;
AlexStokoe 0:2c6d81be69d8 35 const char cb5 = 0xAA;
AlexStokoe 0:2c6d81be69d8 36 const char cb6 = 0xAC;
AlexStokoe 0:2c6d81be69d8 37
AlexStokoe 0:2c6d81be69d8 38 const char * commarr[6] = {&cb1, &cb2, &cb3, &cb4, &cb5, &cb6};
AlexStokoe 0:2c6d81be69d8 39
AlexStokoe 0:2c6d81be69d8 40 const char D1conv256 = 0x40;
AlexStokoe 0:2c6d81be69d8 41 const char D1conv512 = 0x42;
AlexStokoe 0:2c6d81be69d8 42 const char D2conv4096 = 0x58;
AlexStokoe 0:2c6d81be69d8 43 const char D2conv512 = 0x52;
AlexStokoe 0:2c6d81be69d8 44 const char readADC = 0x00;
AlexStokoe 0:2c6d81be69d8 45
AlexStokoe 0:2c6d81be69d8 46 float duty = 1;
AlexStokoe 0:2c6d81be69d8 47
AlexStokoe 0:2c6d81be69d8 48 int round(float number)
AlexStokoe 0:2c6d81be69d8 49 {
AlexStokoe 0:2c6d81be69d8 50 return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5);
AlexStokoe 0:2c6d81be69d8 51 }
AlexStokoe 0:2c6d81be69d8 52
AlexStokoe 0:2c6d81be69d8 53 //calculate temperature
intrinseca 1:ab3dacbfcde6 54 int calcT(unsigned int Tval, unsigned short consts[6])
intrinseca 1:ab3dacbfcde6 55 {
AlexStokoe 0:2c6d81be69d8 56 int dT = Tval - consts[4]*(2<<7);
intrinseca 1:ab3dacbfcde6 57
AlexStokoe 0:2c6d81be69d8 58 int T = 2000 + dT*consts[5]/(2<<22);
intrinseca 1:ab3dacbfcde6 59 printf("Temp: %d C\n", T);
AlexStokoe 0:2c6d81be69d8 60 return T;
intrinseca 1:ab3dacbfcde6 61 }
AlexStokoe 0:2c6d81be69d8 62
AlexStokoe 0:2c6d81be69d8 63 //calculate 1st order temperature compensated pressure
intrinseca 1:ab3dacbfcde6 64 int calcP(unsigned int Tval, unsigned int Pval, unsigned short consts[6])
intrinseca 1:ab3dacbfcde6 65 {
AlexStokoe 0:2c6d81be69d8 66 int dT = Tval - consts[4]*(2<<7);
intrinseca 1:ab3dacbfcde6 67
AlexStokoe 0:2c6d81be69d8 68 long long int off = (long long)consts[1]*(2<<16) + ((long long)consts[3] *(long long)dT)/(2<<5);
intrinseca 1:ab3dacbfcde6 69
AlexStokoe 0:2c6d81be69d8 70 long long int sens = (long long)consts[0]*(2<<15) + ((long long)consts[2] *(long long)dT)/(2<<6);
intrinseca 1:ab3dacbfcde6 71
AlexStokoe 0:2c6d81be69d8 72 int P = (Pval *(sens/(2<<20)) - off)/(2<<14);
intrinseca 1:ab3dacbfcde6 73 //printf("Pressure %d Pa\n\r", P);
AlexStokoe 0:2c6d81be69d8 74 return P;
intrinseca 1:ab3dacbfcde6 75 }
intrinseca 1:ab3dacbfcde6 76
intrinseca 1:ab3dacbfcde6 77 int main()
intrinseca 1:ab3dacbfcde6 78 {
AlexStokoe 0:2c6d81be69d8 79 pc.baud(115200);
AlexStokoe 0:2c6d81be69d8 80 motorOn = 0;
AlexStokoe 0:2c6d81be69d8 81 motorOn.period_ms(10);
intrinseca 1:ab3dacbfcde6 82
intrinseca 2:3d3e21c907e4 83 printf("Turrentine\n");
intrinseca 2:3d3e21c907e4 84
AlexStokoe 0:2c6d81be69d8 85 // Chip must be deselected
AlexStokoe 0:2c6d81be69d8 86 cs = 1;
AlexStokoe 0:2c6d81be69d8 87
AlexStokoe 0:2c6d81be69d8 88 // Setup the spi for 8 bit data, high steady state clock,
AlexStokoe 0:2c6d81be69d8 89 // second edge capture, with a 1MHz clock rate
AlexStokoe 0:2c6d81be69d8 90 spi.format(8,3);
AlexStokoe 0:2c6d81be69d8 91 spi.frequency(500000);
AlexStokoe 0:2c6d81be69d8 92 spi.set_default_write_value(0x00);
intrinseca 1:ab3dacbfcde6 93
AlexStokoe 0:2c6d81be69d8 94 // Select the device by seting chip select low
AlexStokoe 0:2c6d81be69d8 95 cs = 0;
intrinseca 1:ab3dacbfcde6 96
AlexStokoe 0:2c6d81be69d8 97 // Send 0x1E Command to reset the chip
AlexStokoe 0:2c6d81be69d8 98 spi.write(0x1E);
AlexStokoe 0:2c6d81be69d8 99 cs = 1;
AlexStokoe 0:2c6d81be69d8 100 wait_ms(100);
intrinseca 1:ab3dacbfcde6 101 cs = 1;
intrinseca 2:3d3e21c907e4 102
intrinseca 1:ab3dacbfcde6 103 printf("Read cal data\n");
intrinseca 1:ab3dacbfcde6 104
AlexStokoe 0:2c6d81be69d8 105 //read cal data values from device into program
intrinseca 1:ab3dacbfcde6 106 for (char i=0; i<6; i++) {
AlexStokoe 0:2c6d81be69d8 107 //spi read sequence
AlexStokoe 0:2c6d81be69d8 108 cs= 0;
AlexStokoe 0:2c6d81be69d8 109 spi.write(commarr[i], 1, buffer16, 3);
AlexStokoe 0:2c6d81be69d8 110 //time for SPI to write into data buffers
AlexStokoe 0:2c6d81be69d8 111 wait_ms(10);
AlexStokoe 0:2c6d81be69d8 112 cs=1;
AlexStokoe 0:2c6d81be69d8 113 //Put data into 16bit unsigned int in calData array
intrinseca 1:ab3dacbfcde6 114 calData[i] = buffer16[1]<<8 | buffer16[2];
intrinseca 1:ab3dacbfcde6 115 }
intrinseca 2:3d3e21c907e4 116
intrinseca 2:3d3e21c907e4 117
intrinseca 2:3d3e21c907e4 118 printf("Pump On\n");
intrinseca 2:3d3e21c907e4 119
intrinseca 2:3d3e21c907e4 120 //turn pump on
intrinseca 2:3d3e21c907e4 121 motorOn.write(duty);
intrinseca 2:3d3e21c907e4 122
intrinseca 2:3d3e21c907e4 123
intrinseca 2:3d3e21c907e4 124 //dummy samples to wait for sensor response to stabilise
intrinseca 2:3d3e21c907e4 125 int a =0;
intrinseca 2:3d3e21c907e4 126 while(a < 10000) {
intrinseca 2:3d3e21c907e4 127 cs = 0;
intrinseca 2:3d3e21c907e4 128 spi.write(&D1conv256, 1, buffer16, 1);
intrinseca 2:3d3e21c907e4 129 wait_us(500);
intrinseca 2:3d3e21c907e4 130 cs = 1;
intrinseca 2:3d3e21c907e4 131 cs = 0;
intrinseca 2:3d3e21c907e4 132 spi.write(&readADC, 1, pressBuffer, 4);
intrinseca 2:3d3e21c907e4 133 cs = 1;
intrinseca 2:3d3e21c907e4 134 a++;
intrinseca 2:3d3e21c907e4 135 }
intrinseca 2:3d3e21c907e4 136
intrinseca 1:ab3dacbfcde6 137 printf("Start loop\n");
intrinseca 1:ab3dacbfcde6 138
AlexStokoe 0:2c6d81be69d8 139 //display calibration values to check against datasheet
intrinseca 1:ab3dacbfcde6 140
AlexStokoe 0:2c6d81be69d8 141 //program loop
intrinseca 1:ab3dacbfcde6 142 while(1) {
AlexStokoe 0:2c6d81be69d8 143 //read temerature value
AlexStokoe 0:2c6d81be69d8 144 cs = 0;
AlexStokoe 0:2c6d81be69d8 145 spi.write(&D2conv4096, 1, buffer16, 1);
AlexStokoe 0:2c6d81be69d8 146 wait_ms(10);
intrinseca 1:ab3dacbfcde6 147 cs = 1;
intrinseca 1:ab3dacbfcde6 148 cs = 0;
intrinseca 1:ab3dacbfcde6 149
AlexStokoe 0:2c6d81be69d8 150 spi.write(&readADC, 1, tempBuffer, 4);
AlexStokoe 0:2c6d81be69d8 151 cs = 1;
intrinseca 1:ab3dacbfcde6 152
AlexStokoe 0:2c6d81be69d8 153 //read pressure value
intrinseca 1:ab3dacbfcde6 154 /*cs = 0;
AlexStokoe 0:2c6d81be69d8 155 spi.write(&D1conv512, 1, buffer16, 1);
AlexStokoe 0:2c6d81be69d8 156 wait_ms(2);
AlexStokoe 0:2c6d81be69d8 157 cs = 1; cs = 0;
intrinseca 1:ab3dacbfcde6 158
AlexStokoe 0:2c6d81be69d8 159 spi.write(&readADC, 1, pressBuffer, 4);
intrinseca 1:ab3dacbfcde6 160 cs = 1;*/
intrinseca 1:ab3dacbfcde6 161
AlexStokoe 0:2c6d81be69d8 162 //write values from buffers to program variables
AlexStokoe 0:2c6d81be69d8 163 temp = tempBuffer[1]<<16 | tempBuffer[2]<<8 | tempBuffer[3];
intrinseca 1:ab3dacbfcde6 164 //press = pressBuffer[1]<<16 | pressBuffer[2]<<8 | pressBuffer[3];
intrinseca 1:ab3dacbfcde6 165
AlexStokoe 0:2c6d81be69d8 166 int a =0;
intrinseca 2:3d3e21c907e4 167 while(a < 5000) {
AlexStokoe 0:2c6d81be69d8 168 cs = 0;
AlexStokoe 0:2c6d81be69d8 169 spi.write(&D1conv256, 1, buffer16, 1);
AlexStokoe 0:2c6d81be69d8 170 wait_us(500);
intrinseca 1:ab3dacbfcde6 171 cs = 1;
intrinseca 1:ab3dacbfcde6 172 cs = 0;
AlexStokoe 0:2c6d81be69d8 173 spi.write(&readADC, 1, pressBuffer, 4);
AlexStokoe 0:2c6d81be69d8 174 cs = 1;
AlexStokoe 0:2c6d81be69d8 175 a++;
intrinseca 1:ab3dacbfcde6 176 }
intrinseca 2:3d3e21c907e4 177
intrinseca 1:ab3dacbfcde6 178 printf("Start Measurement\n");
intrinseca 1:ab3dacbfcde6 179
intrinseca 1:ab3dacbfcde6 180 //double cumsum = 0;
intrinseca 1:ab3dacbfcde6 181
AlexStokoe 0:2c6d81be69d8 182 t.reset();
AlexStokoe 0:2c6d81be69d8 183 t.start();
AlexStokoe 0:2c6d81be69d8 184 //loop values
intrinseca 1:ab3dacbfcde6 185 for (int x = 0; x < N_SAMPLES; x++) {
AlexStokoe 0:2c6d81be69d8 186 cs = 0;
AlexStokoe 0:2c6d81be69d8 187 spi.write(&D1conv256, 1, buffer16, 1);
AlexStokoe 0:2c6d81be69d8 188 wait_us(500);
intrinseca 1:ab3dacbfcde6 189 cs = 1;
intrinseca 1:ab3dacbfcde6 190
intrinseca 1:ab3dacbfcde6 191 cs = 0;
intrinseca 1:ab3dacbfcde6 192 if (x > 0) {
AlexStokoe 0:2c6d81be69d8 193 pData[x-1] = pressBuffer[1]<<16 | pressBuffer[2]<<8 | pressBuffer[3];
intrinseca 1:ab3dacbfcde6 194 //cumsum = cumsum + pData[x-1];
intrinseca 1:ab3dacbfcde6 195 }
AlexStokoe 0:2c6d81be69d8 196 spi.write(&readADC, 1, pressBuffer, 4);
AlexStokoe 0:2c6d81be69d8 197 tData[x] = t.read_us();
AlexStokoe 0:2c6d81be69d8 198 cs = 1;
intrinseca 1:ab3dacbfcde6 199 }
intrinseca 1:ab3dacbfcde6 200
intrinseca 1:ab3dacbfcde6 201 pData[N_SAMPLES - 1] = pressBuffer[1]<<16 | pressBuffer[2]<<8 | pressBuffer[3];
intrinseca 1:ab3dacbfcde6 202
AlexStokoe 0:2c6d81be69d8 203 //stop motor and timer
AlexStokoe 0:2c6d81be69d8 204 t.stop();
intrinseca 2:3d3e21c907e4 205 //motorOn.write(0);
intrinseca 2:3d3e21c907e4 206
intrinseca 1:ab3dacbfcde6 207 printf("Stop Measurement\n");
intrinseca 1:ab3dacbfcde6 208
AlexStokoe 0:2c6d81be69d8 209 //calc temperature
AlexStokoe 0:2c6d81be69d8 210 calcT(temp, calData);
AlexStokoe 0:2c6d81be69d8 211 long long sum = 0;
intrinseca 1:ab3dacbfcde6 212
intrinseca 1:ab3dacbfcde6 213 //float avg = calcP(temp, cumsum/(nsample-1), calData);
intrinseca 1:ab3dacbfcde6 214
intrinseca 1:ab3dacbfcde6 215 //printf("avg %f\n\r", avg);
intrinseca 1:ab3dacbfcde6 216
intrinseca 1:ab3dacbfcde6 217 //output date to PC
intrinseca 2:3d3e21c907e4 218 printf("$CAL %hu %hu %hu %hu %hu %hu\n", calData[0], calData[1], calData[2], calData[3], calData[4], calData[5]);
intrinseca 1:ab3dacbfcde6 219
intrinseca 1:ab3dacbfcde6 220 for(int i = 0; i < N_SAMPLES; i++) {
intrinseca 2:3d3e21c907e4 221 printf("$%d\n", pData[i]);
intrinseca 1:ab3dacbfcde6 222 }
intrinseca 1:ab3dacbfcde6 223
intrinseca 2:3d3e21c907e4 224 printf("$COMPLETE\n");
intrinseca 2:3d3e21c907e4 225
intrinseca 1:ab3dacbfcde6 226 /*
AlexStokoe 0:2c6d81be69d8 227 //for crossing detection
AlexStokoe 0:2c6d81be69d8 228 bool cflag1 = (avg > pData[0]);
AlexStokoe 0:2c6d81be69d8 229 bool cflag2 = (avg > pData[1]);
AlexStokoe 0:2c6d81be69d8 230 int numcross = 0;
AlexStokoe 0:2c6d81be69d8 231 int lastcrosspoint = 0;
AlexStokoe 0:2c6d81be69d8 232 unsigned int crosstart;
AlexStokoe 0:2c6d81be69d8 233 unsigned int crossend;
AlexStokoe 0:2c6d81be69d8 234 float freq = 0;
intrinseca 2:3d3e21c907e4 235
AlexStokoe 0:2c6d81be69d8 236 //smooth data array 20 sample size
intrinseca 1:ab3dacbfcde6 237 for (int y=0; y< nsample-1; y++) {
intrinseca 1:ab3dacbfcde6 238 if (9< y && y <nsample-10) {
intrinseca 1:ab3dacbfcde6 239 sum = 0;
intrinseca 1:ab3dacbfcde6 240 for (int z=0; z<20; z++) {
intrinseca 1:ab3dacbfcde6 241 sum = sum + pData[y-10+z];
intrinseca 1:ab3dacbfcde6 242 }
intrinseca 1:ab3dacbfcde6 243
intrinseca 1:ab3dacbfcde6 244 spData[y] = (float) calcP(temp, sum/20, calData);
intrinseca 1:ab3dacbfcde6 245
intrinseca 1:ab3dacbfcde6 246 //detect avg crossings for frequency calc
intrinseca 1:ab3dacbfcde6 247 if (y>10) {
intrinseca 1:ab3dacbfcde6 248 cflag2 = (avg > spData[y]);
intrinseca 1:ab3dacbfcde6 249 cflag1 = (avg > spData[y-1]);
intrinseca 1:ab3dacbfcde6 250
intrinseca 1:ab3dacbfcde6 251 if (cflag1 != cflag2) {
intrinseca 1:ab3dacbfcde6 252 if(lastcrosspoint<=(y-10)) {
intrinseca 1:ab3dacbfcde6 253 numcross++;
intrinseca 1:ab3dacbfcde6 254 lastcrosspoint = y;
intrinseca 1:ab3dacbfcde6 255
intrinseca 1:ab3dacbfcde6 256 if (numcross == 1) {
intrinseca 1:ab3dacbfcde6 257 crosstart = tData[y];
intrinseca 1:ab3dacbfcde6 258 }
intrinseca 1:ab3dacbfcde6 259
intrinseca 1:ab3dacbfcde6 260 crossend = tData[y];
intrinseca 1:ab3dacbfcde6 261 }
intrinseca 1:ab3dacbfcde6 262 }
intrinseca 1:ab3dacbfcde6 263 }
intrinseca 1:ab3dacbfcde6 264 //calc pressure & display list
intrinseca 1:ab3dacbfcde6 265 //printf("%d\t%d\t%d\n\r", tData[y], calcP(temp, spData[y], calData), calcP(temp, pData[y], calData));
intrinseca 1:ab3dacbfcde6 266 printf("%d\t%f\n\r", tData[y],spData[y]);
intrinseca 1:ab3dacbfcde6 267 } else if (10> y || y >nsample-10) {
intrinseca 1:ab3dacbfcde6 268 spData[y] = (float) calcP(temp, pData[y], calData);
intrinseca 1:ab3dacbfcde6 269 }
intrinseca 1:ab3dacbfcde6 270
intrinseca 1:ab3dacbfcde6 271
intrinseca 1:ab3dacbfcde6 272 }
intrinseca 1:ab3dacbfcde6 273
AlexStokoe 0:2c6d81be69d8 274 printf("numcross = %d\n\r", numcross);
intrinseca 1:ab3dacbfcde6 275 printf("crosstart = %d\n\r", crosstart);
intrinseca 1:ab3dacbfcde6 276 printf("crossend = %d\n\r", crossend);
intrinseca 1:ab3dacbfcde6 277
intrinseca 1:ab3dacbfcde6 278 freq = (1e6 *numcross)/(2*(crossend - crosstart));
intrinseca 1:ab3dacbfcde6 279 printf("frequency = %f\n\r", freq);
intrinseca 1:ab3dacbfcde6 280
intrinseca 1:ab3dacbfcde6 281 for (int z=0; z< nsample-1; z++) {
intrinseca 1:ab3dacbfcde6 282
intrinseca 1:ab3dacbfcde6 283 spData[z] = spData[z] -avg;
intrinseca 1:ab3dacbfcde6 284 }
intrinseca 1:ab3dacbfcde6 285
intrinseca 1:ab3dacbfcde6 286 printf("Repeat Blockage Test?\n\rPress Enter to continue\n\r");
intrinseca 1:ab3dacbfcde6 287
intrinseca 1:ab3dacbfcde6 288 while(1) {
intrinseca 1:ab3dacbfcde6 289 if (pc.getc() != 0) {
intrinseca 1:ab3dacbfcde6 290 break;
intrinseca 1:ab3dacbfcde6 291 }
intrinseca 1:ab3dacbfcde6 292 }
intrinseca 1:ab3dacbfcde6 293 */
intrinseca 1:ab3dacbfcde6 294 }
AlexStokoe 0:2c6d81be69d8 295 }