Used for calibration consumables

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

Committer:
AlexStokoe
Date:
Mon Jul 23 13:58:48 2018 +0000
Revision:
0:362148ad8f6f
Child:
1:7f99e938ae2a
initial commit - noisy ADC;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AlexStokoe 0:362148ad8f6f 1 #include "mbed.h"
AlexStokoe 0:362148ad8f6f 2
AlexStokoe 0:362148ad8f6f 3 #define ALL_CH 15 //value of convst bus to read all chanels simultaneosly
AlexStokoe 0:362148ad8f6f 4 #define IO_REF 10.17 //ref channel voltage mV (most accurate between 9-12V high supply voltage)
AlexStokoe 0:362148ad8f6f 5
AlexStokoe 0:362148ad8f6f 6 #define CHA0_REF 6217
AlexStokoe 0:362148ad8f6f 7 #define CHA1_REF 6196
AlexStokoe 0:362148ad8f6f 8 #define CHB0_REF 6231
AlexStokoe 0:362148ad8f6f 9 #define CHC0_REF 6231
AlexStokoe 0:362148ad8f6f 10 #define CHC1_REF 6223
AlexStokoe 0:362148ad8f6f 11 #define CHD0_REF 6240
AlexStokoe 0:362148ad8f6f 12 #define CHD1_REF 6228
AlexStokoe 0:362148ad8f6f 13
AlexStokoe 0:362148ad8f6f 14
AlexStokoe 0:362148ad8f6f 15
AlexStokoe 0:362148ad8f6f 16 Serial pc(USBTX, USBRX); // tx, rx
AlexStokoe 0:362148ad8f6f 17
AlexStokoe 0:362148ad8f6f 18 DigitalOut drive(p21);
AlexStokoe 0:362148ad8f6f 19 DigitalOut yLED(p27);
AlexStokoe 0:362148ad8f6f 20 DigitalOut gLED(p28);
AlexStokoe 0:362148ad8f6f 21 DigitalOut rLED(p26);
AlexStokoe 0:362148ad8f6f 22
AlexStokoe 0:362148ad8f6f 23 AnalogIn battVolt(p19);
AlexStokoe 0:362148ad8f6f 24 AnalogIn auxVolt(p20);
AlexStokoe 0:362148ad8f6f 25
AlexStokoe 0:362148ad8f6f 26 BusOut convt(p11, p12, p13, p14);
AlexStokoe 0:362148ad8f6f 27 SPI spi(p5, p6, p7); // mosi, miso, sclk
AlexStokoe 0:362148ad8f6f 28 DigitalOut cs(p8); //chip select
AlexStokoe 0:362148ad8f6f 29 DigitalIn busy(p9);
AlexStokoe 0:362148ad8f6f 30 DigitalOut reset(p10);
AlexStokoe 0:362148ad8f6f 31
AlexStokoe 0:362148ad8f6f 32 LocalFileSystem local("local");
AlexStokoe 0:362148ad8f6f 33
AlexStokoe 0:362148ad8f6f 34 FILE *fp = fopen("/local/TEST_LOG.csv", "w"); // Open "test_log" on the local file system for writing
AlexStokoe 0:362148ad8f6f 35
AlexStokoe 0:362148ad8f6f 36
AlexStokoe 0:362148ad8f6f 37 char buffer16[16];
AlexStokoe 0:362148ad8f6f 38 int val_array[8];
AlexStokoe 0:362148ad8f6f 39 float voltages[8];
AlexStokoe 0:362148ad8f6f 40 const char dummy = 0;
AlexStokoe 0:362148ad8f6f 41 int i = 0;
AlexStokoe 0:362148ad8f6f 42 float cur1 = 0;
AlexStokoe 0:362148ad8f6f 43 float cur2 = 0;
AlexStokoe 0:362148ad8f6f 44 float R1 = 0;
AlexStokoe 0:362148ad8f6f 45 float R2 = 0;
AlexStokoe 0:362148ad8f6f 46 int scale_factors[8];
AlexStokoe 0:362148ad8f6f 47 int drivetime_ms;
AlexStokoe 0:362148ad8f6f 48
AlexStokoe 0:362148ad8f6f 49 float scale_factor = 0.0;
AlexStokoe 0:362148ad8f6f 50 char outString[100];
AlexStokoe 0:362148ad8f6f 51
AlexStokoe 0:362148ad8f6f 52 int readChannels (char buffer[16], int values[8], int OSR){
AlexStokoe 0:362148ad8f6f 53 //simultaneosly samples all channels and reads into buffer
AlexStokoe 0:362148ad8f6f 54 short int val_array[8];
AlexStokoe 0:362148ad8f6f 55
AlexStokoe 0:362148ad8f6f 56 for (int i=0; i<OSR; i++) {
AlexStokoe 0:362148ad8f6f 57
AlexStokoe 0:362148ad8f6f 58 //send convert signal to all channels
AlexStokoe 0:362148ad8f6f 59 convt = ALL_CH;
AlexStokoe 0:362148ad8f6f 60 wait_us(1);
AlexStokoe 0:362148ad8f6f 61 convt = 0;
AlexStokoe 0:362148ad8f6f 62
AlexStokoe 0:362148ad8f6f 63 //SPI(like) data transfer
AlexStokoe 0:362148ad8f6f 64 cs = 0;
AlexStokoe 0:362148ad8f6f 65 spi.write(&dummy, 1, buffer, 16);
AlexStokoe 0:362148ad8f6f 66 cs=1;
AlexStokoe 0:362148ad8f6f 67
AlexStokoe 0:362148ad8f6f 68 //loop over bytes to add channel voltage values
AlexStokoe 0:362148ad8f6f 69 for (int x=0; x<8; x++){
AlexStokoe 0:362148ad8f6f 70 val_array[x] = buffer[2*x]<<8 | buffer16[(2*x) + 1];
AlexStokoe 0:362148ad8f6f 71 values [x] = values[x] + val_array[x];
AlexStokoe 0:362148ad8f6f 72 }
AlexStokoe 0:362148ad8f6f 73 }
AlexStokoe 0:362148ad8f6f 74
AlexStokoe 0:362148ad8f6f 75 for (int y=0; y<8; y++){
AlexStokoe 0:362148ad8f6f 76 values[y] = values[y]/OSR;
AlexStokoe 0:362148ad8f6f 77 }
AlexStokoe 0:362148ad8f6f 78
AlexStokoe 0:362148ad8f6f 79 return 0;
AlexStokoe 0:362148ad8f6f 80 }
AlexStokoe 0:362148ad8f6f 81
AlexStokoe 0:362148ad8f6f 82
AlexStokoe 0:362148ad8f6f 83 int main() {
AlexStokoe 0:362148ad8f6f 84 rLED = 0;
AlexStokoe 0:362148ad8f6f 85 yLED = 0;
AlexStokoe 0:362148ad8f6f 86 gLED = 0;
AlexStokoe 0:362148ad8f6f 87
AlexStokoe 0:362148ad8f6f 88 int OSR = 10;
AlexStokoe 0:362148ad8f6f 89
AlexStokoe 0:362148ad8f6f 90 drive = 0;
AlexStokoe 0:362148ad8f6f 91 drivetime_ms = 1;
AlexStokoe 0:362148ad8f6f 92
AlexStokoe 0:362148ad8f6f 93 scale_factors[0] = CHA0_REF;
AlexStokoe 0:362148ad8f6f 94 scale_factors[1] = CHA1_REF;
AlexStokoe 0:362148ad8f6f 95 scale_factors[2] = CHB0_REF;
AlexStokoe 0:362148ad8f6f 96 scale_factors[3] = 0;
AlexStokoe 0:362148ad8f6f 97 scale_factors[4] = CHC0_REF;
AlexStokoe 0:362148ad8f6f 98 scale_factors[5] = CHC1_REF;
AlexStokoe 0:362148ad8f6f 99 scale_factors[6] = CHD0_REF;
AlexStokoe 0:362148ad8f6f 100 scale_factors[7] = CHD1_REF;
AlexStokoe 0:362148ad8f6f 101
AlexStokoe 0:362148ad8f6f 102 pc.baud(115200);
AlexStokoe 0:362148ad8f6f 103 pc.printf("Test start\n\r");
AlexStokoe 0:362148ad8f6f 104
AlexStokoe 0:362148ad8f6f 105 //Reset ADC sequence
AlexStokoe 0:362148ad8f6f 106 reset = 1;
AlexStokoe 0:362148ad8f6f 107 wait_ms(1);
AlexStokoe 0:362148ad8f6f 108 reset = 0;
AlexStokoe 0:362148ad8f6f 109
AlexStokoe 0:362148ad8f6f 110 //set SPI serial to 2MHz, 16 bit data transfer, mode 2 (clock normally high, data preceeding clock cycle)
AlexStokoe 0:362148ad8f6f 111 spi.format(8,2);
AlexStokoe 0:362148ad8f6f 112 spi.frequency(2000000);
AlexStokoe 0:362148ad8f6f 113 spi.set_default_write_value(0x00);
AlexStokoe 0:362148ad8f6f 114 cs = 1;
AlexStokoe 0:362148ad8f6f 115
AlexStokoe 0:362148ad8f6f 116 //while(1) {
AlexStokoe 0:362148ad8f6f 117 rLED = 1;
AlexStokoe 0:362148ad8f6f 118 yLED = drive;
AlexStokoe 0:362148ad8f6f 119 gLED = 1;
AlexStokoe 0:362148ad8f6f 120
AlexStokoe 0:362148ad8f6f 121
AlexStokoe 0:362148ad8f6f 122 drive = 1;
AlexStokoe 0:362148ad8f6f 123 wait_ms(drivetime_ms);
AlexStokoe 0:362148ad8f6f 124 readChannels (buffer16, val_array, 1);
AlexStokoe 0:362148ad8f6f 125 drive = 0;
AlexStokoe 0:362148ad8f6f 126
AlexStokoe 0:362148ad8f6f 127 rLED = 0;
AlexStokoe 0:362148ad8f6f 128 pc.printf("Drive for %d ms\n", drivetime_ms);
AlexStokoe 0:362148ad8f6f 129 for (int x=0; x<8; x++){
AlexStokoe 0:362148ad8f6f 130 voltages[x] = val_array[x]*scale_factors[x]/10000;
AlexStokoe 0:362148ad8f6f 131 pc.printf("%f\n", voltages[x]);
AlexStokoe 0:362148ad8f6f 132 }
AlexStokoe 0:362148ad8f6f 133 cur1 = 2* (voltages[0] - voltages[1]);
AlexStokoe 0:362148ad8f6f 134 cur2 = 2* (voltages[2] - voltages[1]);
AlexStokoe 0:362148ad8f6f 135
AlexStokoe 0:362148ad8f6f 136 R1 = (voltages[4]- voltages[5])/cur1;
AlexStokoe 0:362148ad8f6f 137 R2 = (voltages[6]- voltages[7])/cur2;
AlexStokoe 0:362148ad8f6f 138
AlexStokoe 0:362148ad8f6f 139 pc.printf("I1 = %f\n", cur1);
AlexStokoe 0:362148ad8f6f 140 pc.printf("I2 = %f\n", cur2);
AlexStokoe 0:362148ad8f6f 141 pc.printf("R1 = %f\n", R1);
AlexStokoe 0:362148ad8f6f 142 pc.printf("R2 = %f\n", R2);
AlexStokoe 0:362148ad8f6f 143
AlexStokoe 0:362148ad8f6f 144 sprintf(outString, "R1, R2, Drive for %d ms, OSR %d\n", drivetime_ms, OSR);
AlexStokoe 0:362148ad8f6f 145 fprintf(fp, outString);
AlexStokoe 0:362148ad8f6f 146
AlexStokoe 0:362148ad8f6f 147 for (int x=0; x<20; x++) {
AlexStokoe 0:362148ad8f6f 148 drive = 1;
AlexStokoe 0:362148ad8f6f 149 wait_ms(drivetime_ms);
AlexStokoe 0:362148ad8f6f 150 readChannels (buffer16, val_array, OSR);
AlexStokoe 0:362148ad8f6f 151 drive = 0;
AlexStokoe 0:362148ad8f6f 152
AlexStokoe 0:362148ad8f6f 153 for (int x=0; x<8; x++){
AlexStokoe 0:362148ad8f6f 154 voltages[x] = val_array[x]*scale_factors[x]/10000;
AlexStokoe 0:362148ad8f6f 155 }
AlexStokoe 0:362148ad8f6f 156
AlexStokoe 0:362148ad8f6f 157 cur1 = 2* (voltages[0] - voltages[1]);
AlexStokoe 0:362148ad8f6f 158 cur2 = 2* (voltages[2] - voltages[1]);
AlexStokoe 0:362148ad8f6f 159
AlexStokoe 0:362148ad8f6f 160 R1 = (voltages[4]- voltages[5])/cur1;
AlexStokoe 0:362148ad8f6f 161 R2 = (voltages[6]- voltages[7])/cur2;
AlexStokoe 0:362148ad8f6f 162 sprintf(outString, "%f, %f\n", R1, R2);
AlexStokoe 0:362148ad8f6f 163 fprintf(fp, outString);
AlexStokoe 0:362148ad8f6f 164 wait_ms(100);
AlexStokoe 0:362148ad8f6f 165
AlexStokoe 0:362148ad8f6f 166 }
AlexStokoe 0:362148ad8f6f 167 rLED = 0;
AlexStokoe 0:362148ad8f6f 168
AlexStokoe 0:362148ad8f6f 169 fclose(fp);
AlexStokoe 0:362148ad8f6f 170
AlexStokoe 0:362148ad8f6f 171
AlexStokoe 0:362148ad8f6f 172 //
AlexStokoe 0:362148ad8f6f 173 // pc.printf("Repeat Test?\n\rPress to increment wait time\n\r");
AlexStokoe 0:362148ad8f6f 174 // while(1){
AlexStokoe 0:362148ad8f6f 175 // if (pc.getc() != 0) {
AlexStokoe 0:362148ad8f6f 176 // drivetime_ms++;
AlexStokoe 0:362148ad8f6f 177 // break;
AlexStokoe 0:362148ad8f6f 178 // }
AlexStokoe 0:362148ad8f6f 179 // }
AlexStokoe 0:362148ad8f6f 180
AlexStokoe 0:362148ad8f6f 181 //}
AlexStokoe 0:362148ad8f6f 182 }