ADC logging with demo drive board for calibration
Dependencies: mbed MODSERIAL FastPWM ADS8568_ADC
Diff: main.cpp
- 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; + + }