ADC logging with demo drive board for calibration ADC read synchronised with heater on time

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

Revision:
25:f507cfd50fcc
Parent:
24:899071abfc14
Child:
26:323238949f9d
--- a/main.cpp	Wed Oct 09 12:46:23 2019 +0000
+++ b/main.cpp	Wed Oct 09 17:36:51 2019 +0000
@@ -1,12 +1,13 @@
 #include "mbed.h"
 #include "ADS8568_ADC.h"
-#include "FastPWM.h"
+// #include "FastPWM.h"
 #include "MODSERIAL.h"
 
-#define MEAS_DELAY      120  // measurement delay after turning on FET (us)
-#define LOG_INTERVAL   5000  // log file interval (ms)
+#define MEAS_DELAY       50  // measurement delay after turning on FET (us)
+#define LOG_INTERVAL   1000  // log file interval (ms)
 #define START_DELAY    1000  // pause for startup (ms)
 #define N_STEPS         100
+#define N_READ           10
 #define BUFFER_SIZE    4096
 
 //UID lookup address and pointer
@@ -31,9 +32,8 @@
 float drive_board_cal[UID_TABLE_LENGTH][2][2] = 
  {{{0.096724353, 10.1817431}, {0.056098807, 10.19962849}},
  {{0.0596907336847412, 10.1550084867437}, {0.0320376283698263, 10.2580153464834}},
- // {{0.059473025, 10.14814327}, {0.03200058, 10.25073923}},
-  {{0.01887149,  10.39360225}, {0.03115874, 10.28199855}},
-  {{0.052545339, 10.06008621}, {0.094239471, 10.11983777}}}; 
+ {{0.01887149,  10.39360225}, {0.03115874, 10.28199855}},
+ {{0.052545339, 10.06008621}, {0.094239471, 10.11983777}}}; 
   
 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);
@@ -42,16 +42,19 @@
 DigitalIn adc_busy(PA_8);                   //Busy interrupt sig#
 
 //Heater Control
-FastPWM drive_1(PC_9);
-FastPWM drive_2(PC_8);
-FastPWM guard_1(PC_7);
-FastPWM guard_2(PC_6);
+DigitalOut drive_1(PC_9);
+DigitalOut drive_2(PC_8);
+DigitalOut guard_1(PC_7);
+DigitalOut guard_2(PC_6);
 
 //Indicator LEDs
 DigitalOut hb_led(PC_13);       //Green
 DigitalOut led_0(PC_4);         //Red
 DigitalOut led_1(PC_5);         //Green
 
+//External LED
+DigitalOut led_ext(PB_4);
+
 //User buttons
 DigitalIn user_0(PB_0);
 DigitalIn user_1(PB_1);
@@ -69,22 +72,29 @@
     pc.baud(115200);
     adc.init();
     
+    // External LED off
+    led_ext = 0;
+    
     // Initialsation - all heaters off
-    drive_1.prescaler(1);
-    drive_1.period_ticks(1000);
-    drive_1.pulsewidth_ticks(0);
+    drive_1 = 0;
+    drive_2 = 0;
+    guard_1 = 0;
+    guard_2 = 0;
+//    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);
+//    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);
+//    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);
+//    guard_2.prescaler(1);
+//    guard_2.period_ticks(1000);
+//    guard_2.pulsewidth_ticks(0);
    
     pc.printf("\r\nUnique ID: %08X %08X %08X \r\n", uid[0], uid[1], uid[2]);   
     int i_board = -1;  
@@ -105,39 +115,60 @@
     wait_ms(START_DELAY);
     timer.start();
 
+    for (int iDelay = 1; iDelay < 3; iDelay++) {
 
     for (int iStep=0; iStep<N_STEPS; iStep++) {
 
         eTime = timer.read_ms();
-        pc.printf("%5d, %10d,", iStep, eTime);
+        pc.printf("%5d, %10d,", iDelay, 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);
+            if (iHeater==0) {
+//                drive_1.pulsewidth_ticks(1000);
+                  drive_1 = 1;
+                  led_0 = 1;
+                  led_1 = 0;
+            }
+            else {
+//                drive_2.pulsewidth_ticks(1000);
+                  drive_2 = 1;
+                  led_0 = 0;
+                  led_1 = 1;
+            }
+            
+            wait_us(MEAS_DELAY*iDelay);
         
-            //Start ADC conversion
-            adc.start_conversion(15);
+            //Average N_READ ADC cycles
+            curr[iHeater] = 0;
+            v[iHeater] = 0;
+            for (int iRead = 0; iRead<N_READ; iRead++) {
+                //Start ADC conversion
+                adc.start_conversion(15);
 
-            //Wait until ADC is free
-            while(adc_busy == 1) {
-                wait_us(1);
-            }
+                //Wait until ADC is free
+                while(adc_busy == 1) {
+                    wait_us(1);
+                }
 
+                //Get ADC values
+                adc.read_channels();
+                curr[iHeater] += adc.read_channel_result(i_port[iHeater]);
+                v[iHeater] += adc.read_channel_result(v_port[iHeater]);
+            } 
+            
             //Turn off heater
             if (iHeater==0)
-                drive_1.pulsewidth_ticks(0);
+//                drive_1.pulsewidth_ticks(0);
+                  drive_1 = 0;
             else
-                drive_2.pulsewidth_ticks(0);
-            wait_us(MEAS_DELAY);
+//                drive_2.pulsewidth_ticks(0);
+                  drive_2 = 0;
+            
+            
+            wait_us(MEAS_DELAY*iDelay);
         
-            //Get ADC values
-            adc.read_channels();
-            curr[iHeater] = adc.read_channel_result(i_port[iHeater]);
-            v[iHeater] = adc.read_channel_result(v_port[iHeater]);
+            //Calculate resistance
             r_adc[iHeater] = (float)v[iHeater]/(float)curr[iHeater];
             if (i_board != -1)
                 r_ohm[iHeater] = drive_board_cal[i_board][iHeater][0] + r_adc[iHeater]*drive_board_cal[i_board][iHeater][1];
@@ -152,8 +183,15 @@
             wait_ms(LOG_INTERVAL/2);
 
         }
-        pc.printf("\n");
-        
+        pc.printf("\n");    
+    }
+    
     }
 
+    // turn everything off
+    drive_1 = 0;
+    drive_2 = 0;
+    led_0 = 0;
+    led_1 = 0;
+    
  }