Used for calibration consumables

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

Revision:
5:67e4ee9a00dc
Parent:
4:694f0e328a52
Child:
6:75b09f0bcbd9
--- a/main.cpp	Tue Jul 31 17:25:41 2018 +0000
+++ b/main.cpp	Mon Aug 06 13:34:33 2018 +0000
@@ -1,86 +1,33 @@
 #include "mbed.h"
 
-// thermal cycling settings
-#define N_CYCLES           10     // number of thermal cycles (ramp-hold-ramp-hold)
-#define R_SETPOINT_LOW  0.840     // heater resistance at low temp R60
-#define T_LOW_RAMP       0000     // low temperature ramp time (ms)
-#define T_LOW_HOLD       2000     // low temperature hold time (ms)
-#define R_SETPOINT_HIGH 0.860     // heater resistance at high temp R95
-#define T_HIGH_RAMP      0000     // high temperaure ramp time (ms)
-#define T_HIGH_HOLD      2000     // high temperature time (ms)
-#define T_HIGH_START     2000     // hotstart time(ms)
-
-// temperature measurement settings
-#define N_SAMPLES           1     // number of samples to acquire for I and V measurements
-#define N_ROLL_AVG         10     // rolling average for R values
-#define PULSE_WIDTH      2000     // heat or cool pulse width (us)
-#define MEAS_DELAY       1000     // measurement delay after turning on FET (us)
-#define CAM_TRIG           20     // camera trigger pulse width (us)
-#define LOG_INTERVAL      100     // log file interval (ms)
-
-// ADC channels to read
-#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
+#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
 
-DigitalOut drive(p21);            // drive FET
-DigitalOut yLED(p27);             // yellow LED (drive on)
-DigitalOut gLED(p28);             // green LED (power on)
-DigitalOut rLED(p26);             // red LED (thermocycling in progress)
-DigitalOut camTrig(p25);          // trigger camera
+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
+SPI spi(p5, p6, p7); // mosi, miso, sclk
+DigitalOut cs(p8);  //chip select
 DigitalIn busy(p9);
 DigitalOut reset(p10);
 
-Timer timer;
-LocalFileSystem local("local");
-
-FILE *fp = fopen("/local/TEST_LOG.csv", "w");  // Open "test_log" on the local file system for writing
-
-float r = 0;
-float rAvg = 0;
-float rAcc = 0;
-float rSet;
-
-int nAcc = 0;
-int eTime;
-int logTime = 0;
-int iCycle = 0;
-
-char outString[100];
-
 char buffer16[16];
 int val_array[8];
 const char dummy = 0;
-
-void logFile(void) {
-    rAcc = rAcc + r;
-    nAcc++;
-    if (eTime > logTime) {
-       // trigger camera 
-       camTrig = 1;
-       wait_us(CAM_TRIG);
-       camTrig = 0;
+int drivetime_ms;
 
-       // write data
-       sprintf(outString, "%10d,%10d,%10.6f,%10.6f\n", iCycle, eTime, rAcc/nAcc, rSet); // log data
-       pc.printf("%s",outString);
-       fprintf(fp, outString);
-       logTime = logTime + LOG_INTERVAL;
-       rAcc = 0;
-       nAcc = 0;
-    }
-}
+char outString[100];
 
-void readChannels (char buffer[16], int values[8]){
+int readChannels (char buffer[16], int values[8]){
     //simultaneously samples and reads into buffer
     short int val_array[8];
              
@@ -98,70 +45,35 @@
     for (int i=0; i<8; i++){
         val_array[i] = buffer[2*i]<<8 | buffer16[(2*i) + 1];
         values [i] = val_array[i];   
-    }            
-    r = (double)(val_array[5]-val_array[4])/(double)(val_array[1]-val_array[0]);
-}
+        }
+            
+    return 0;
+    }
     
-void tempControl(int endTime){
-    eTime = timer.read_ms();
-    while (eTime < endTime) {
-        yLED = 1;
-        drive = 1;
-        wait_us(MEAS_DELAY);                         // wait for heater current to stabilise
-        readChannels (buffer16, val_array);          // read ADC channels and update r
-        rAvg = ((N_ROLL_AVG-1)*rAvg + r)/N_ROLL_AVG; // calculate rolling average r
-        // printf("hold r: %8.4f\r\n",r);
-        if (rAvg > rSet) {
-            drive = 0; // turn off heater if setpoint resistance is exceeded  
-            yLED = 0;
-        }
-        // printf("set r: %8.4f\r\n",r);
-           
-        logFile();
-        wait_us(PULSE_WIDTH);  //wait until pulse_width (us) has elapsed  
-        eTime = timer.read_ms();
-     }    
-}
-
-void tempControlRamp(float setStartR, float setEndR, int endTime){
-    float setRate;
-    int startTime;
-    
-    startTime = timer.read_ms();
-    setRate = (setEndR - setStartR)/(endTime - startTime);
-    eTime = startTime;
-    while (eTime < endTime) {
-        rSet = setStartR + setRate*(eTime - startTime);
-        yLED = 1;
-        drive = 1;
-        wait_us(MEAS_DELAY); // wait for heater current to stabilise
-        readChannels (buffer16, val_array);          // read ADC channels and update r
-        rAvg = ((N_ROLL_AVG-1)*rAvg + r)/N_ROLL_AVG; // measure r
-        if (rAvg > rSet) {
-            drive = 0; // turn off heater if setpoint resistance is exceeded  
-            yLED = 0;
-        }
-        // printf("ramp r: %8.4f\r\n",r);
-
-        logFile();
-        wait_us(PULSE_WIDTH);  //wait until pulse_width (us) has elapsed  
-        eTime = timer.read_ms();
-    }    
-}
-
 
 int main() {
-    int endTime = 0;
+    int n_samples = 10000;
+    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;
     
     drive = 0;
+    drivetime_ms = 1;
        
     pc.baud(115200);
+    pc.printf("Test start\r\n");
+    
     //Reset ADC sequence
-
     reset = 1;
     wait_ms(1);
     reset = 0;
@@ -172,50 +84,46 @@
     spi.set_default_write_value(0x00);
     cs = 1;
 
-    rLED = 1;  // thermal cycling in progress
-    yLED = 0;  // heater on
-    gLED = 1;  // microprocessor power on
+    rLED = 1;
+    yLED = 0;
+    gLED = 1;
     
-    sprintf(outString,"    iCycle,  Time(ms),         r,      rSet\n");  
+    sprintf(outString, "I1SIG, I1REF, V1POS, V1NEG,        R\r\n");
     pc.printf("%s", outString);
-    fprintf(fp, outString);
-  
-    timer.start();
     
-    // optional hot start: additional HIGH temperature time at start
-    if (T_HIGH_START > 0) {
-          endTime = T_HIGH_START;
-          rSet = R_SETPOINT_HIGH;
-          tempControl(endTime);
-    }
-
-    // thermocycle loop
-    for (iCycle = 0; iCycle < N_CYCLES; iCycle++ ) {
-        
-        // ramp up to HIGH temperature
-        endTime = endTime + T_HIGH_RAMP;
-        tempControlRamp(R_SETPOINT_LOW, R_SETPOINT_HIGH, endTime);
+    for (int x=0; x<n_samples; x++) {
+        drive = 1;
+        yLED = 1;
+        wait_ms(drivetime_ms);
+        readChannels (buffer16, val_array);
+        drive = 0;
+        yLED = 0;
         
-        // hold at HIGH temperature
-        endTime = endTime + T_HIGH_HOLD;
-        rSet = R_SETPOINT_HIGH;
-        tempControl(endTime);
-        
-        // ramp down to LOW temperature
-        endTime = endTime + T_LOW_RAMP;
-        tempControlRamp(R_SETPOINT_HIGH, R_SETPOINT_LOW, endTime);
+        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);
+
+        sprintf(outString, "%5d\t %5d\t %5d\t %5d\t %f\r\n", val_array[0], val_array[1], val_array[4], val_array[5], r);
+        pc.printf("%s", outString); 
+        wait_ms(1000);
         
-        // hold at LOW temperature
-        endTime = endTime + T_LOW_HOLD;
-        rSet = R_SETPOINT_LOW;
-        tempControl(endTime);
-        
-    }        
-  
-    // extinguish rLED (thermocycling complete), ensure heater is off and close log file for access
-    drive = 0;
-    rLED = 0; 
-    logTime = 0;
-    logFile();
-    fclose(fp);     
-}
+        }
+
+    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;
+    
+ }