Working code for pc app 12/01/2018 commit

Dependencies:   mbed MS5607 mbed-dsp

Fork of Turrentine_Code by Alex Stokoe

Committer:
AlexStokoe
Date:
Tue Feb 13 11:01:34 2018 +0000
Revision:
6:8f16c432964d
Parent:
2:3d3e21c907e4
Old working turrentine pc app code

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 //program loop
intrinseca 1:ab3dacbfcde6 140 while(1) {
AlexStokoe 6:8f16c432964d 141
AlexStokoe 0:2c6d81be69d8 142 //read temerature value
AlexStokoe 0:2c6d81be69d8 143 cs = 0;
AlexStokoe 0:2c6d81be69d8 144 spi.write(&D2conv4096, 1, buffer16, 1);
AlexStokoe 0:2c6d81be69d8 145 wait_ms(10);
intrinseca 1:ab3dacbfcde6 146 cs = 1;
intrinseca 1:ab3dacbfcde6 147 cs = 0;
AlexStokoe 0:2c6d81be69d8 148 spi.write(&readADC, 1, tempBuffer, 4);
AlexStokoe 0:2c6d81be69d8 149 cs = 1;
intrinseca 1:ab3dacbfcde6 150
AlexStokoe 0:2c6d81be69d8 151 //write values from buffers to program variables
AlexStokoe 0:2c6d81be69d8 152 temp = tempBuffer[1]<<16 | tempBuffer[2]<<8 | tempBuffer[3];
AlexStokoe 6:8f16c432964d 153
intrinseca 1:ab3dacbfcde6 154
AlexStokoe 0:2c6d81be69d8 155 int a =0;
intrinseca 2:3d3e21c907e4 156 while(a < 5000) {
AlexStokoe 0:2c6d81be69d8 157 cs = 0;
AlexStokoe 0:2c6d81be69d8 158 spi.write(&D1conv256, 1, buffer16, 1);
AlexStokoe 0:2c6d81be69d8 159 wait_us(500);
intrinseca 1:ab3dacbfcde6 160 cs = 1;
intrinseca 1:ab3dacbfcde6 161 cs = 0;
AlexStokoe 0:2c6d81be69d8 162 spi.write(&readADC, 1, pressBuffer, 4);
AlexStokoe 0:2c6d81be69d8 163 cs = 1;
AlexStokoe 0:2c6d81be69d8 164 a++;
intrinseca 1:ab3dacbfcde6 165 }
intrinseca 2:3d3e21c907e4 166
intrinseca 1:ab3dacbfcde6 167 printf("Start Measurement\n");
AlexStokoe 6:8f16c432964d 168
AlexStokoe 0:2c6d81be69d8 169 t.reset();
AlexStokoe 0:2c6d81be69d8 170 t.start();
AlexStokoe 6:8f16c432964d 171
AlexStokoe 0:2c6d81be69d8 172 //loop values
intrinseca 1:ab3dacbfcde6 173 for (int x = 0; x < N_SAMPLES; x++) {
AlexStokoe 0:2c6d81be69d8 174 cs = 0;
AlexStokoe 0:2c6d81be69d8 175 spi.write(&D1conv256, 1, buffer16, 1);
AlexStokoe 0:2c6d81be69d8 176 wait_us(500);
intrinseca 1:ab3dacbfcde6 177 cs = 1;
intrinseca 1:ab3dacbfcde6 178
intrinseca 1:ab3dacbfcde6 179 cs = 0;
intrinseca 1:ab3dacbfcde6 180 if (x > 0) {
AlexStokoe 0:2c6d81be69d8 181 pData[x-1] = pressBuffer[1]<<16 | pressBuffer[2]<<8 | pressBuffer[3];
AlexStokoe 6:8f16c432964d 182
intrinseca 1:ab3dacbfcde6 183 }
AlexStokoe 0:2c6d81be69d8 184 spi.write(&readADC, 1, pressBuffer, 4);
AlexStokoe 0:2c6d81be69d8 185 tData[x] = t.read_us();
AlexStokoe 0:2c6d81be69d8 186 cs = 1;
intrinseca 1:ab3dacbfcde6 187 }
intrinseca 1:ab3dacbfcde6 188
intrinseca 1:ab3dacbfcde6 189 pData[N_SAMPLES - 1] = pressBuffer[1]<<16 | pressBuffer[2]<<8 | pressBuffer[3];
intrinseca 1:ab3dacbfcde6 190
AlexStokoe 6:8f16c432964d 191 //stop timer
AlexStokoe 0:2c6d81be69d8 192 t.stop();
intrinseca 2:3d3e21c907e4 193
intrinseca 1:ab3dacbfcde6 194 printf("Stop Measurement\n");
intrinseca 1:ab3dacbfcde6 195
AlexStokoe 0:2c6d81be69d8 196 //calc temperature
AlexStokoe 0:2c6d81be69d8 197 calcT(temp, calData);
AlexStokoe 0:2c6d81be69d8 198 long long sum = 0;
intrinseca 1:ab3dacbfcde6 199
intrinseca 1:ab3dacbfcde6 200
AlexStokoe 6:8f16c432964d 201 //output data to PC
intrinseca 2:3d3e21c907e4 202 printf("$CAL %hu %hu %hu %hu %hu %hu\n", calData[0], calData[1], calData[2], calData[3], calData[4], calData[5]);
intrinseca 1:ab3dacbfcde6 203
intrinseca 1:ab3dacbfcde6 204 for(int i = 0; i < N_SAMPLES; i++) {
intrinseca 2:3d3e21c907e4 205 printf("$%d\n", pData[i]);
intrinseca 1:ab3dacbfcde6 206 }
intrinseca 1:ab3dacbfcde6 207
intrinseca 2:3d3e21c907e4 208 printf("$COMPLETE\n");
intrinseca 2:3d3e21c907e4 209
AlexStokoe 6:8f16c432964d 210
intrinseca 1:ab3dacbfcde6 211 }
AlexStokoe 0:2c6d81be69d8 212 }