Working code for pc app 12/01/2018 commit

Dependencies:   mbed MS5607 mbed-dsp

Fork of Turrentine_Code by Alex Stokoe

Committer:
AlexStokoe
Date:
Fri Jan 12 09:22:44 2018 +0000
Revision:
0:2c6d81be69d8
Child:
1:ab3dacbfcde6
Working ASCII dump;

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