Used for calibration consumables

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

Revision:
2:23f848b21b09
Parent:
1:7f99e938ae2a
Child:
3:447b0de4295a
--- a/main.cpp	Mon Jul 23 17:34:20 2018 +0000
+++ b/main.cpp	Thu Jul 26 13:44:16 2018 +0000
@@ -1,17 +1,8 @@
 #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
-
-
+#define CH_A 1     // value of convst bus to read channel A only
+#define CH_AC 5     // value of convst bus to read channels A and C
+#define CH_ABCD 15 // value of convst bus to read all chanels simultaneously
 
 Serial pc(USBTX, USBRX); // tx, rx
 
@@ -29,51 +20,31 @@
 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
+int readChannels (char buffer[16], int values[8]){
+    //simultaneously samples 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;    
+             
+    //send convert signal to channels
+    convt = CH_AC;
+    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 i=0; i<8; i++){
+        val_array[i] = buffer[2*i]<<8 | buffer16[(2*i) + 1];
+        values [i] = val_array[i];   
         }
             
     return 0;
@@ -81,26 +52,26 @@
     
 
 int main() {
+    int n_samples = 50;
+    double r;
+    double r_max = 0;
+    double r_min = 1e10;
+    double r_sum = 0;
+    double r_sum2 = 0;
+    double r_mean;
+    double r_mean2;
+    double r_sd;
+    double r_cv;
+     
     rLED = 0;
     yLED = 0;
     gLED = 0;
     
-    int OSR = 5;
-    
     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");
+    pc.printf("Test start\r\n");
     
     //Reset ADC sequence
     reset = 1;
@@ -113,76 +84,46 @@
     spi.set_default_write_value(0x00);
     cs = 1;
 
-    //while(1) {
     rLED = 1;
-    yLED = drive;
+    yLED = 0;
     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] = (float)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;
+    sprintf(outString, "I1SIG, I1REF, V1POS, V1NEG,        R\r\n");
+    pc.printf("%s", outString);
     
-    pc.printf("V0 = %f\n", voltages[0]);
-    pc.printf("V1 = %f\n", voltages[1]);
-    pc.printf("V2 = %f\n", voltages[2]);
-    pc.printf("V4 = %f\n", voltages[4]);
-    pc.printf("V5 = %f\n", voltages[5]);
-    pc.printf("V6 = %f\n", voltages[6]);
-    pc.printf("V7 = %f\n", voltages[7]);
-    
-    
-    sprintf(outString, "R1, R2, Drive for %d ms, OSR %d\n", drivetime_ms, OSR);
-    fprintf(fp, outString);
-    
-    for (int x=0; x<20; x++) {
+    for (int x=0; x<n_samples; x++) {
         drive = 1;
+        yLED = 1;
         wait_ms(drivetime_ms);
-        readChannels (buffer16, val_array, OSR);
+        readChannels (buffer16, val_array);
         drive = 0;
+        yLED = 0;
+        
+        r = (double)(val_array[5]-val_array[4])/(double)(val_array[1]-val_array[0]);
+        if (r < r_min) { r_min = r; }
+        if (r > r_max) { r_max = r; }
+        r_sum = r_sum + r;
+        r_sum2 = r_sum2 + (r*r);
 
-        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;
-        R1 = cur1;
-        R2 = cur2;
-        sprintf(outString, "%f, %f\n", R1, R2);
-        fprintf(fp, outString); 
-        wait_ms(100);
+        sprintf(outString, "%5d, %5d, %5d, %5d, %f\r\n", val_array[0], val_array[1], val_array[4], val_array[5], r);
+        pc.printf("%s", outString); 
+        wait_ms(1000);
         
         }
+
+    r_mean = r_sum/n_samples;
+    r_mean2 = r_sum2/n_samples;
+    r_sd = sqrt(r_mean2-(r_mean*r_mean));
+    r_cv = r_sd/r_mean;
+
+    pc.printf("Statistics:\r\n"); 
+    pc.printf("n_samples : %d\r\n", n_samples); 
+    pc.printf("r_mean    : %f\r\n", r_mean); 
+    pc.printf("r_min     : %f\r\n", r_min); 
+    pc.printf("r_max     : %f\r\n", r_max); 
+    pc.printf("r_sd      : %f\r\n", r_sd); 
+    pc.printf("r_cv      : %f\r\n", r_cv);  
+
     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;
-//                }
-//            }
-    
-    //}
-}
+ }