Used for calibration consumables

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

Committer:
justinbuckland
Date:
Wed Jun 26 08:55:30 2019 +0000
Revision:
9:3c5a43ce68bb
Parent:
8:325f68c1e3d2
Child:
10:a64434365090
Updated:; Drive-on to measure: MEAS_DELAY and; Time between measurements: LOG_INTERVAL definitions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AlexStokoe 0:362148ad8f6f 1 #include "mbed.h"
AlexStokoe 0:362148ad8f6f 2
justinbuckland 5:67e4ee9a00dc 3 #define CH_A 1 // value of convst bus to read channel A only
justinbuckland 5:67e4ee9a00dc 4 #define CH_AC 5 // value of convst bus to read channels A and C
justinbuckland 5:67e4ee9a00dc 5 #define CH_ABCD 15 // value of convst bus to read all chanels simultaneously
justinbuckland 9:3c5a43ce68bb 6 #define MEAS_DELAY 1000 // measurement delay after turning on FET (us) (themocycling control programme uses 50 us)
justinbuckland 9:3c5a43ce68bb 7 #define LOG_INTERVAL 1000 // log file interval (ms)
justinbuckland 9:3c5a43ce68bb 8
AlexStokoe 0:362148ad8f6f 9
AlexStokoe 0:362148ad8f6f 10 Serial pc(USBTX, USBRX); // tx, rx
AlexStokoe 0:362148ad8f6f 11
justinbuckland 5:67e4ee9a00dc 12 DigitalOut drive(p21);
justinbuckland 5:67e4ee9a00dc 13 DigitalOut yLED(p27);
justinbuckland 5:67e4ee9a00dc 14 DigitalOut gLED(p28);
justinbuckland 5:67e4ee9a00dc 15 DigitalOut rLED(p26);
AlexStokoe 0:362148ad8f6f 16
AlexStokoe 0:362148ad8f6f 17 AnalogIn battVolt(p19);
AlexStokoe 0:362148ad8f6f 18 AnalogIn auxVolt(p20);
AlexStokoe 0:362148ad8f6f 19
AlexStokoe 0:362148ad8f6f 20 BusOut convt(p11, p12, p13, p14);
justinbuckland 5:67e4ee9a00dc 21 SPI spi(p5, p6, p7); // mosi, miso, sclk
justinbuckland 5:67e4ee9a00dc 22 DigitalOut cs(p8); //chip select
AlexStokoe 0:362148ad8f6f 23 DigitalIn busy(p9);
AlexStokoe 0:362148ad8f6f 24 DigitalOut reset(p10);
AlexStokoe 0:362148ad8f6f 25
AlexStokoe 0:362148ad8f6f 26 char buffer16[16];
AlexStokoe 0:362148ad8f6f 27 int val_array[8];
AlexStokoe 0:362148ad8f6f 28 const char dummy = 0;
justinbuckland 6:75b09f0bcbd9 29 int drivetime_ms = 1;
AlexStokoe 0:362148ad8f6f 30
justinbuckland 5:67e4ee9a00dc 31 char outString[100];
AlexStokoe 0:362148ad8f6f 32
justinbuckland 5:67e4ee9a00dc 33 int readChannels (char buffer[16], int values[8]){
justinbuckland 2:23f848b21b09 34 //simultaneously samples and reads into buffer
AlexStokoe 0:362148ad8f6f 35 short int val_array[8];
justinbuckland 2:23f848b21b09 36
justinbuckland 2:23f848b21b09 37 //send convert signal to channels
justinbuckland 7:2d695116d636 38 convt = CH_ABCD;
justinbuckland 2:23f848b21b09 39 wait_us(1);
justinbuckland 2:23f848b21b09 40 convt = 0;
justinbuckland 2:23f848b21b09 41
justinbuckland 2:23f848b21b09 42 //SPI(like) data transfer
justinbuckland 2:23f848b21b09 43 cs = 0;
justinbuckland 2:23f848b21b09 44 spi.write(&dummy, 1, buffer, 16);
justinbuckland 2:23f848b21b09 45 cs=1;
justinbuckland 2:23f848b21b09 46
justinbuckland 2:23f848b21b09 47 //loop over bytes to add channel voltage values
justinbuckland 2:23f848b21b09 48 for (int i=0; i<8; i++){
justinbuckland 2:23f848b21b09 49 val_array[i] = buffer[2*i]<<8 | buffer16[(2*i) + 1];
justinbuckland 2:23f848b21b09 50 values [i] = val_array[i];
justinbuckland 5:67e4ee9a00dc 51 }
justinbuckland 5:67e4ee9a00dc 52
justinbuckland 5:67e4ee9a00dc 53 return 0;
justinbuckland 5:67e4ee9a00dc 54 }
justinbuckland 4:694f0e328a52 55
AlexStokoe 0:362148ad8f6f 56
AlexStokoe 0:362148ad8f6f 57 int main() {
justinbuckland 6:75b09f0bcbd9 58 int n_samples = 20;
justinbuckland 7:2d695116d636 59 double r1;
justinbuckland 7:2d695116d636 60 double r2;
justinbuckland 7:2d695116d636 61 double r1_max = 0;
justinbuckland 7:2d695116d636 62 double r1_min = 1e10;
justinbuckland 7:2d695116d636 63 double r1_sum = 0;
justinbuckland 7:2d695116d636 64 double r1_sum2 = 0;
justinbuckland 7:2d695116d636 65 double r1_mean;
justinbuckland 7:2d695116d636 66 double r1_mean2;
justinbuckland 7:2d695116d636 67 double r1_sd;
justinbuckland 7:2d695116d636 68 double r1_cv;
justinbuckland 8:325f68c1e3d2 69 double r2_max = 0;
justinbuckland 8:325f68c1e3d2 70 double r2_min = 1e10;
justinbuckland 8:325f68c1e3d2 71 double r2_sum = 0;
justinbuckland 8:325f68c1e3d2 72 double r2_sum2 = 0;
justinbuckland 8:325f68c1e3d2 73 double r2_mean;
justinbuckland 8:325f68c1e3d2 74 double r2_mean2;
justinbuckland 8:325f68c1e3d2 75 double r2_sd;
justinbuckland 8:325f68c1e3d2 76 double r2_cv;
justinbuckland 2:23f848b21b09 77
AlexStokoe 0:362148ad8f6f 78 rLED = 0;
AlexStokoe 0:362148ad8f6f 79 yLED = 0;
AlexStokoe 0:362148ad8f6f 80 gLED = 0;
AlexStokoe 0:362148ad8f6f 81
AlexStokoe 0:362148ad8f6f 82 drive = 0;
justinbuckland 2:23f848b21b09 83
AlexStokoe 0:362148ad8f6f 84 pc.baud(115200);
justinbuckland 5:67e4ee9a00dc 85 pc.printf("Test start\r\n");
justinbuckland 5:67e4ee9a00dc 86
AlexStokoe 0:362148ad8f6f 87 //Reset ADC sequence
AlexStokoe 0:362148ad8f6f 88 reset = 1;
AlexStokoe 0:362148ad8f6f 89 wait_ms(1);
AlexStokoe 0:362148ad8f6f 90 reset = 0;
AlexStokoe 0:362148ad8f6f 91
AlexStokoe 0:362148ad8f6f 92 //set SPI serial to 2MHz, 16 bit data transfer, mode 2 (clock normally high, data preceeding clock cycle)
AlexStokoe 0:362148ad8f6f 93 spi.format(8,2);
AlexStokoe 0:362148ad8f6f 94 spi.frequency(2000000);
AlexStokoe 0:362148ad8f6f 95 spi.set_default_write_value(0x00);
AlexStokoe 0:362148ad8f6f 96 cs = 1;
AlexStokoe 0:362148ad8f6f 97
justinbuckland 5:67e4ee9a00dc 98 rLED = 1;
justinbuckland 5:67e4ee9a00dc 99 yLED = 0;
justinbuckland 5:67e4ee9a00dc 100 gLED = 1;
AlexStokoe 0:362148ad8f6f 101
justinbuckland 8:325f68c1e3d2 102 sprintf(outString, "I1SIG, IREF, V1POS, V1NEG, R1, I2SIG, IREF, V2POS, V2NEG, R2\r\n");
justinbuckland 4:694f0e328a52 103 pc.printf("%s", outString);
justinbuckland 4:694f0e328a52 104
justinbuckland 5:67e4ee9a00dc 105 for (int x=0; x<n_samples; x++) {
justinbuckland 5:67e4ee9a00dc 106 drive = 1;
justinbuckland 5:67e4ee9a00dc 107 yLED = 1;
justinbuckland 9:3c5a43ce68bb 108 wait_us(MEAS_DELAY);
justinbuckland 5:67e4ee9a00dc 109 readChannels (buffer16, val_array);
justinbuckland 5:67e4ee9a00dc 110 drive = 0;
justinbuckland 5:67e4ee9a00dc 111 yLED = 0;
justinbuckland 4:694f0e328a52 112
justinbuckland 7:2d695116d636 113 r1 = (double)(val_array[5]-val_array[4])/(double)(val_array[1]-val_array[0]);
justinbuckland 7:2d695116d636 114 r2 = (double)(val_array[7]-val_array[6])/(double)(val_array[1]-val_array[2]);
justinbuckland 7:2d695116d636 115 if (r1 < r1_min) { r1_min = r1; }
justinbuckland 7:2d695116d636 116 if (r1 > r1_max) { r1_max = r1; }
justinbuckland 8:325f68c1e3d2 117 if (r2 < r2_min) { r2_min = r2; }
justinbuckland 8:325f68c1e3d2 118 if (r2 > r2_max) { r2_max = r2; }
justinbuckland 7:2d695116d636 119 r1_sum = r1_sum + r1;
justinbuckland 7:2d695116d636 120 r1_sum2 = r1_sum2 + (r1*r1);
justinbuckland 8:325f68c1e3d2 121 r2_sum = r2_sum + r2;
justinbuckland 8:325f68c1e3d2 122 r2_sum2 = r2_sum2 + (r2*r2);
justinbuckland 5:67e4ee9a00dc 123
justinbuckland 7:2d695116d636 124 sprintf(outString, "%5d\t %5d\t %5d\t %5d\t %f %5d\t %5d\t %5d\t %5d\t %f\r\n", val_array[0], val_array[1], val_array[4], val_array[5], r1, val_array[2], val_array[1], val_array[6], val_array[7], r2);
justinbuckland 5:67e4ee9a00dc 125 pc.printf("%s", outString);
justinbuckland 9:3c5a43ce68bb 126 wait_ms(LOG_INTERVAL);
justinbuckland 4:694f0e328a52 127
justinbuckland 5:67e4ee9a00dc 128 }
justinbuckland 5:67e4ee9a00dc 129
justinbuckland 7:2d695116d636 130 r1_mean = r1_sum/n_samples;
justinbuckland 7:2d695116d636 131 r1_mean2 = r1_sum2/n_samples;
justinbuckland 7:2d695116d636 132 r1_sd = sqrt(r1_mean2-(r1_mean*r1_mean));
justinbuckland 7:2d695116d636 133 r1_cv = r1_sd/r1_mean;
justinbuckland 5:67e4ee9a00dc 134
justinbuckland 8:325f68c1e3d2 135 r2_mean = r2_sum/n_samples;
justinbuckland 8:325f68c1e3d2 136 r2_mean2 = r2_sum2/n_samples;
justinbuckland 8:325f68c1e3d2 137 r2_sd = sqrt(r2_mean2-(r2_mean*r2_mean));
justinbuckland 8:325f68c1e3d2 138 r2_cv = r2_sd/r1_mean;
justinbuckland 8:325f68c1e3d2 139
justinbuckland 6:75b09f0bcbd9 140 pc.printf("Statistics:\r\n");
justinbuckland 6:75b09f0bcbd9 141 pc.printf("n_samples : %d\r\n", n_samples);
justinbuckland 7:2d695116d636 142 pc.printf("r1_mean : %f\r\n", r1_mean);
justinbuckland 7:2d695116d636 143 pc.printf("r1_min : %f\r\n", r1_min);
justinbuckland 7:2d695116d636 144 pc.printf("r1_max : %f\r\n", r1_max);
justinbuckland 7:2d695116d636 145 pc.printf("r1_sd : %f\r\n", r1_sd);
justinbuckland 7:2d695116d636 146 pc.printf("r1_cv : %f\r\n", r1_cv);
justinbuckland 5:67e4ee9a00dc 147
justinbuckland 8:325f68c1e3d2 148 pc.printf("r2_mean : %f\r\n", r2_mean);
justinbuckland 8:325f68c1e3d2 149 pc.printf("r2_min : %f\r\n", r2_min);
justinbuckland 8:325f68c1e3d2 150 pc.printf("r2_max : %f\r\n", r2_max);
justinbuckland 8:325f68c1e3d2 151 pc.printf("r2_sd : %f\r\n", r2_sd);
justinbuckland 8:325f68c1e3d2 152 pc.printf("r2_cv : %f\r\n", r2_cv);
justinbuckland 8:325f68c1e3d2 153
justinbuckland 5:67e4ee9a00dc 154 rLED = 0;
justinbuckland 5:67e4ee9a00dc 155
justinbuckland 5:67e4ee9a00dc 156 }