ADC logging for temperature calibration
Dependencies: mbed MODSERIAL FastPWM ADS8568_ADC
Diff: main.cpp
- Revision:
- 0:362148ad8f6f
- Child:
- 1:7f99e938ae2a
diff -r 000000000000 -r 362148ad8f6f main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jul 23 13:58:48 2018 +0000 @@ -0,0 +1,182 @@ +#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; +// } +// } + + //} +}