ADC logging with demo drive board for calibration

Dependencies:   mbed MODSERIAL FastPWM ADS8568_ADC

main.cpp

Committer:
AlexStokoe
Date:
2018-07-23
Revision:
0:362148ad8f6f
Child:
1:7f99e938ae2a

File content as of revision 0:362148ad8f6f:

#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



Serial pc(USBTX, USBRX); // tx, rx

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
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
    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;    
        }
            
    return 0;
    }
    

int main() {
    rLED = 0;
    yLED = 0;
    gLED = 0;
    
    int OSR = 10;
    
    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");
    
    //Reset ADC sequence
    reset = 1;
    wait_ms(1);
    reset = 0;
    
    //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;

    //while(1) {
    rLED = 1;
    yLED = drive;
    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] = 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;
    
    pc.printf("I1 = %f\n", cur1);
    pc.printf("I2 = %f\n", cur2);
    pc.printf("R1 = %f\n", R1);
    pc.printf("R2 = %f\n", R2);
    
    sprintf(outString, "R1, R2, Drive for %d ms, OSR %d\n", drivetime_ms, OSR);
    fprintf(fp, outString);
    
    for (int x=0; x<20; x++) {
        drive = 1;
        wait_ms(drivetime_ms);
        readChannels (buffer16, val_array, OSR);
        drive = 0;

        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;
        sprintf(outString, "%f, %f\n", R1, R2);
        fprintf(fp, outString); 
        wait_ms(100);
        
        }
    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;
//                }
//            }
    
    //}
}