/* connect the DAC to to ADC and call this with adc to get data MUST be linked with the Labmaster! eg gcc -Wall -O3 -ansi -pedantic -lm -llabmaster -o adc adc.c */ #include /* [f]printf */ #include /* sscanf */ #include /* sqrt */ #include /* labmaster calls */ #include "dac.h" const static int dacStep = 16; const static int iterations = 256; int main(int argc, char **argv) { int dac, adc, dacIn, iter; double dacOut, adcOut, adcErr, adcUnc, sum, sumSq; /* initialize arguments */ if(argc < 3) { fprintf(stderr, "Usage: adc \n"); return 1; } if(sscanf(argv[1], "%d", &dac) != 1) { fprintf(stderr, "Ca'n't parse DAC.\n"); return 1; } if(dac < 0 || dac > 1) { fprintf(stderr, "DAC out-of-bounds.\n"); return 1; } if(sscanf(argv[2], "%d", &adc) != 1) { fprintf(stderr, "Ca'n't parse ADC.\n"); return 1; } if(adc < 0 || adc > 3) { fprintf(stderr, "ADC out-of-bounds.\n"); return 1; } /* "This step is critical," OK */ labmaster_initialize(); /* connect DAC to ADC */ for(dacIn = -2048; dacIn < 2048; dacIn += dacStep) { /* dac output */ out_dac(dac, dacIn); /* dac translated to volts */ dacOut = a[dac] + (b[dac] * dacIn); /* adc out, average, error */ for(iter = 0, sum = 0, sumSq = 0; iter < iterations; iter++) { adcOut = in_adc(adc); sum += adcOut; sumSq += adcOut * adcOut; } adcOut = sum / iterations; adcErr = sqrt(sumSq / iterations - adcOut * adcOut); adcUnc = adcErr / sqrt(iterations); /* points were getting saturated, hence if() */ if(adcUnc) printf("%g %g %g\n", dacOut, adcOut, adcUnc); } /* I assume this step is critical too */ labmaster_terminate(); return 0; }