ADC logging with demo drive board for calibration

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

Revision:
0:362148ad8f6f
Child:
1:7f99e938ae2a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jul 23 13:58:48 2018 +0000
@@ -0,0 +1,182 @@
+#include "mbed.h"
+
+#define ALL_CH 15 //value of convst bus to read all chanels simultaneosly
+#define IO_REF 10.17 //ref channel voltage mV (most accurate between 9-12V high supply voltage)
+
+#define CHA0_REF 6217
+#define CHA1_REF 6196
+#define CHB0_REF 6231
+#define CHC0_REF 6231
+#define CHC1_REF 6223
+#define CHD0_REF 6240
+#define CHD1_REF 6228
+
+
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+DigitalOut drive(p21);
+DigitalOut yLED(p27);
+DigitalOut gLED(p28);
+DigitalOut rLED(p26);
+
+AnalogIn battVolt(p19);
+AnalogIn auxVolt(p20);
+
+BusOut convt(p11, p12, p13, p14);
+SPI spi(p5, p6, p7); // mosi, miso, sclk
+DigitalOut cs(p8);  //chip select
+DigitalIn busy(p9);
+DigitalOut reset(p10);
+
+LocalFileSystem local("local");
+
+FILE *fp = fopen("/local/TEST_LOG.csv", "w");  // Open "test_log" on the local file system for writing
+
+
+char buffer16[16];
+int val_array[8];
+float voltages[8];
+const char dummy = 0;
+int i = 0;
+float cur1 = 0;
+float cur2 = 0;
+float R1 = 0;
+float R2 = 0;
+int scale_factors[8];
+int drivetime_ms;
+
+float scale_factor = 0.0;
+char outString[100];
+
+int readChannels (char buffer[16], int values[8], int OSR){
+    //simultaneosly samples all channels and reads into buffer
+    short int val_array[8];
+    
+    for (int i=0; i<OSR; i++) {
+        
+        //send convert signal to all channels
+        convt = ALL_CH;
+        wait_us(1);
+        convt = 0;
+        
+        //SPI(like) data transfer
+        cs = 0;
+        spi.write(&dummy, 1, buffer, 16);
+        cs=1;
+        
+        //loop over bytes to add channel voltage values
+        for (int x=0; x<8; x++){
+                val_array[x] = buffer[2*x]<<8 | buffer16[(2*x) + 1];
+                values [x] = values[x] + val_array[x]; 
+            }
+        }
+        
+    for (int y=0; y<8; y++){
+        values[y] = values[y]/OSR;    
+        }
+            
+    return 0;
+    }
+    
+
+int main() {
+    rLED = 0;
+    yLED = 0;
+    gLED = 0;
+    
+    int OSR = 10;
+    
+    drive = 0;
+    drivetime_ms = 1;
+    
+    scale_factors[0] = CHA0_REF;
+    scale_factors[1] = CHA1_REF;
+    scale_factors[2] = CHB0_REF;
+    scale_factors[3] = 0;
+    scale_factors[4] = CHC0_REF;
+    scale_factors[5] = CHC1_REF;
+    scale_factors[6] = CHD0_REF;
+    scale_factors[7] = CHD1_REF;
+    
+    pc.baud(115200);
+    pc.printf("Test start\n\r");
+    
+    //Reset ADC sequence
+    reset = 1;
+    wait_ms(1);
+    reset = 0;
+    
+    //set SPI serial to 2MHz, 16 bit data transfer, mode 2 (clock normally high, data preceeding clock cycle) 
+    spi.format(8,2);
+    spi.frequency(2000000);
+    spi.set_default_write_value(0x00);
+    cs = 1;
+
+    //while(1) {
+    rLED = 1;
+    yLED = drive;
+    gLED = 1;
+    
+    
+    drive = 1;
+    wait_ms(drivetime_ms);
+    readChannels (buffer16, val_array, 1);
+    drive = 0;
+    
+    rLED = 0;
+    pc.printf("Drive for %d ms\n", drivetime_ms);
+    for (int x=0; x<8; x++){
+        voltages[x] = val_array[x]*scale_factors[x]/10000;
+        pc.printf("%f\n", voltages[x]);
+        }
+    cur1 = 2* (voltages[0] - voltages[1]);
+    cur2 = 2* (voltages[2] - voltages[1]);
+    
+    R1 = (voltages[4]- voltages[5])/cur1;
+    R2 = (voltages[6]- voltages[7])/cur2;
+    
+    pc.printf("I1 = %f\n", cur1);
+    pc.printf("I2 = %f\n", cur2);
+    pc.printf("R1 = %f\n", R1);
+    pc.printf("R2 = %f\n", R2);
+    
+    sprintf(outString, "R1, R2, Drive for %d ms, OSR %d\n", drivetime_ms, OSR);
+    fprintf(fp, outString);
+    
+    for (int x=0; x<20; x++) {
+        drive = 1;
+        wait_ms(drivetime_ms);
+        readChannels (buffer16, val_array, OSR);
+        drive = 0;
+
+        for (int x=0; x<8; x++){
+            voltages[x] = val_array[x]*scale_factors[x]/10000;
+            }
+            
+        cur1 = 2* (voltages[0] - voltages[1]);
+        cur2 = 2* (voltages[2] - voltages[1]);
+        
+        R1 = (voltages[4]- voltages[5])/cur1;
+        R2 = (voltages[6]- voltages[7])/cur2;
+        sprintf(outString, "%f, %f\n", R1, R2);
+        fprintf(fp, outString); 
+        wait_ms(100);
+        
+        }
+    rLED = 0;
+    
+    fclose(fp);    
+        
+            
+        //
+//        pc.printf("Repeat Test?\n\rPress to increment wait time\n\r");
+//        while(1){             
+//            if (pc.getc() != 0) {
+//                drivetime_ms++;
+//                break;
+//                }
+//            }
+    
+    //}
+}