ADC logging with demo drive board for calibration

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

Revision:
16:2c563709cf09
Parent:
15:a08527d78ffa
Child:
17:25831977b98e
--- a/main.cpp	Mon Aug 05 17:36:42 2019 +0000
+++ b/main.cpp	Fri Sep 13 10:29:44 2019 +0000
@@ -1,176 +1,108 @@
 #include "mbed.h"
-
-#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 MEAS_DELAY       50  // measurement delay after turning on FET (us) (themocycling control programme uses 50 us)
-#define LOG_INTERVAL   5000  // log file interval (ms)
-
-#define N_STEPS        1000
-#define CAM_TRIG         20  // camera trigger pulse width (us)
-
-Serial pc(USBTX, USBRX);     // tx, rx
+#include "ADS8568_ADC.h"
+#include "FastPWM.h"
+#include "MODSERIAL.h"
 
-DigitalOut drive(p21);
-DigitalOut yLED(p27);
-DigitalOut gLED(p28);
-DigitalOut rLED(p26);
-DigitalOut camTrig(p24);
-DigitalOut mbedIO(p25);      // MBED IO     
+#define MEAS_DELAY       60  // measurement delay after turning on FET (us)
+#define LOG_INTERVAL   5000  // log file interval (ms)
+#define START_DELAY    1000  // pause for startup (ms)
+#define N_STEPS        1000
+#define BUFFER_SIZE    4096
 
-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);
-DigitalIn userButton(p16);
+MODSERIAL pc(PA_9, PA_10, BUFFER_SIZE); //mcu TX, RX, BUFFER_SIZE byte TX and RX buffers
+ADS8568_ADC adc(PB_15, PB_14, PB_13, PB_12, PC_15, PC_0, PC_1, PC_2, PC_3);
+I2C i2c(PB_7, PB_8);            //SDA, SCL
 Timer timer;
-LocalFileSystem local("local");
-
-FILE *fp = fopen("/local/TEST_LOG.csv", "w");  // Open "test_log" on the local file system for writing
+DigitalIn adc_busy(PA_8);                   //Busy interrupt sig#
 
-char outString[100];
-char buffer16[16];
-int val_array[8];
-const char dummy = 0;
-int drivetime_ms = 1;
+//Heater Control
+FastPWM drive_1(PC_9);
+FastPWM drive_2(PC_8);
+FastPWM guard_1(PC_7);
+FastPWM guard_2(PC_6);
 
-int readChannels (char buffer[16], int values[8]){
-    //simultaneously samples and reads into buffer
-    short int val_array[8];
-             
-    //send convert signal to channels
-    convt = CH_ABCD;
-    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;
-    }
-    
+//Indicator LEDs
+DigitalOut hb_led(PC_13);       //Green
+DigitalOut led_0(PC_4);         //Red
+DigitalOut led_1(PC_5);         //Green
+
+//User buttons
+DigitalIn user_0(PB_0);
+DigitalIn user_1(PB_1);
+
+BusOut converts(PC_0, PC_1, PC_2, PC_3);
 
 int main() {
     int eTime;
-    double r1;
-    double r2;
-    double r1_max = 0;
-    double r1_min = 1e10;
-    double r1_sum = 0;
-    double r1_sum2 = 0;
-    double r1_mean;
-    double r1_mean2;
-    double r1_sd;
-    double r1_cv;
-    double r2_max = 0;
-    double r2_min = 1e10;
-    double r2_sum = 0;
-    double r2_sum2 = 0;
-    double r2_mean;
-    double r2_mean2;
-    double r2_sd;
-    double r2_cv;
+    int v[2], curr[2];
+    double r[2];
+
+    int i_port[2] = {0,2};
+    int v_port[2] = {1,3};
      
-    rLED = 0;
-    yLED = 0;
-    gLED = 0;
+    pc.baud(115200);
+    adc.init();
     
-    drive = 0;
-       
-    pc.baud(115200);
-    
-    //Reset ADC sequence
-    reset = 1;
-    wait_ms(1);
-    reset = 0;
+    // Initialsation - all heaters off
+    drive_1.prescaler(1);
+    drive_1.period_ticks(1000);
+    drive_1.pulsewidth_ticks(0);
+
+    guard_1.prescaler(1);
+    guard_1.period_ticks(1000);
+    guard_1.pulsewidth_ticks(0);
+
+    drive_2.prescaler(1);
+    drive_2.period_ticks(1000);
+    drive_2.pulsewidth_ticks(0);
+
+    guard_2.prescaler(1);
+    guard_2.period_ticks(1000);
+    guard_2.pulsewidth_ticks(0);
+   
+    pc.printf("iStep,      eTime,        I1,         V1,         R1,       I2,         V2,         R2\n");
     
-    //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;
+    wait_ms(START_DELAY);
+    timer.start();
 
-    rLED = 1;
-    yLED = 0;
-    gLED = 1;
-    
-    //sprintf(outString, "iSteps, eTime, R1, R2 \n");
-    sprintf(outString, "iSteps, eTime, I1SIG, IREF, V1POS, V1NEG, R1,I2SIG,IREF, V2POS, V2NEG, R2\n");
-    pc.printf("%s", outString);
-    fprintf(fp, outString);
-    
-    timer.start();
     for (int iStep=0; iStep<N_STEPS; iStep++) {
-        // trigger measurement
-        drive = 1;
-        yLED = 1;
-        camTrig = 1;
-        mbedIO = 1;
-        wait_us(CAM_TRIG);
-        camTrig = 0;
-        mbedIO = 0;
-        wait_us(MEAS_DELAY - CAM_TRIG);
-        readChannels (buffer16, val_array);
-        drive = 0;
-        yLED = 0;
+
+        eTime = timer.read_ms();
+        pc.printf("%5d, %10d,", iStep, eTime);
+
+        for (int iHeater=0; iHeater <2; iHeater++) {
+            // measure heater
+            if (iHeater==0)
+                drive_1.pulsewidth_ticks(1000);
+            else
+                drive_2.pulsewidth_ticks(1000);
+            wait_us(MEAS_DELAY);
         
-        r1 = (double)(val_array[5]-val_array[4])/(double)(val_array[1]-val_array[0]);
-        r2 = (double)(val_array[7]-val_array[6])/(double)(val_array[1]-val_array[2]);
-        if (r1 < r1_min) { r1_min = r1; }
-        if (r1 > r1_max) { r1_max = r1; }
-        if (r2 < r2_min) { r2_min = r2; }
-        if (r2 > r2_max) { r2_max = r2; }
-        r1_sum = r1_sum + r1;
-        r1_sum2 = r1_sum2 + (r1*r1);
-        r2_sum = r2_sum + r2;
-        r2_sum2 = r2_sum2 + (r2*r2);
+            //Start ADC conversion
+            adc.start_conversion(15);
+
+            //Wait until ADC is free
+            while(adc_busy == 1) {
+                wait_us(1);
+            }
+
+            //Turn off heater
+            if (iHeater==0)
+                drive_1.pulsewidth_ticks(0);
+            else
+                drive_2.pulsewidth_ticks(0);
+            wait_us(MEAS_DELAY);
         
-        eTime = timer.read_ms();
-        //printf(outString, "%10d,%10d,%10f,%10f\n", iStep, eTime, r1, r2); // log data
-        sprintf(outString, "%5d, %10d, %5d, %5d, %5d, %5d, %f, %5d, %5d, %5d, %5d, %f\n", iStep, eTime, 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);
-        pc.printf("%s", outString); 
-        fprintf(fp, outString);
+            //Get ADC values
+            adc.read_channels();
+            curr[iHeater] = adc.read_channel_result(i_port[iHeater]);
+            v[iHeater] = adc.read_channel_result(v_port[iHeater]);
+            r[iHeater] = (float)v[iHeater]/(float)curr[iHeater];
+
+            //Write output for iHeater
+            pc.printf("%10d, %10d, %10.6f", curr[iHeater], v[iHeater], r[iHeater]);
+        }
+        pc.printf("\n");
         wait_ms(LOG_INTERVAL);
-        }
-
-    //r1_mean = r1_sum/n_samples;
-    //r1_mean2 = r1_sum2/n_samples;
-    //r1_sd = sqrt(r1_mean2-(r1_mean*r1_mean));
-    //r1_cv = r1_sd/r1_mean;
-
-    //r2_mean = r2_sum/n_samples;
-    //r2_mean2 = r2_sum2/n_samples;
-    //r2_sd = sqrt(r2_mean2-(r2_mean*r2_mean));
-    //r2_cv = r2_sd/r1_mean;
-
-    //pc.printf("Statistics:\r\n"); 
-    //pc.printf("n_samples : %d\r\n", n_samples); 
-    //pc.printf("r1_mean    : %f\r\n", r1_mean); 
-    //pc.printf("r1_min     : %f\r\n", r1_min); 
-    //pc.printf("r1_max     : %f\r\n", r1_max); 
-    //pc.printf("r1_sd      : %f\r\n", r1_sd); 
-    //pc.printf("r1_cv      : %f\r\n", r1_cv);  
-
-    //pc.printf("r2_mean    : %f\r\n", r2_mean); 
-    //pc.printf("r2_min     : %f\r\n", r2_min); 
-    //pc.printf("r2_max     : %f\r\n", r2_max); 
-    //pc.printf("r2_sd      : %f\r\n", r2_sd); 
-    //.printf("r2_cv      : %f\r\n", r2_cv);  
-
-    rLED = 0;
-    fclose(fp);
-    
+    }
  }