Chris Styles
/
ADCPerformanceMeter
Added explicit check for spikes
Diff: main.cpp
- Revision:
- 0:7d24851a0521
- Child:
- 1:748e07bbe96e
diff -r 000000000000 -r 7d24851a0521 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Dec 02 17:11:13 2011 +0000 @@ -0,0 +1,115 @@ +#include "mbed.h" + +#define NUM_SAMPLES 500000 // size of sample series +#define SAMPLE_BLOCKS 5 + +Timer t; + +Serial pc(USBTX,USBRX); + +AnalogIn ain(p17); + +// initialise error counters +int num_4; +int num_8; +int num_16; +int num_32; +int num_64; +int num_128; +int num_256; +int num_512; +int num_1024; +int num_2048; + +int main() { + + pc.baud(115200); + + int num_samples = 0; + + num_4 = 0; + num_8 = 0; + num_16 = 0; + num_32 = 0; + num_64 = 0; + num_128 = 0; + num_256 = 0; + num_512 = 0; + num_1024 = 0; + num_2048 = 0; + + +// Take the average over 500,000 samples +// This is because the bias to 1.65v has a tolerance + float AVERAGE = 0.5; + + pc.printf("Taking an average over %d samples\n",NUM_SAMPLES); + while (num_samples < NUM_SAMPLES) { + float r = ain.read(); + + if ((r > 0.45) && (r < 0.55)) { + AVERAGE += r; + num_samples++; + } + } + + AVERAGE /= NUM_SAMPLES; + + num_samples = 0; + pc.printf("Average = %f\n",AVERAGE); + + +// Now start sampling series of 500,000 +// acculumating the errors seen in each range + pc.printf("Profiling %d samples\n",SAMPLE_BLOCKS*NUM_SAMPLES); + for (int j=0; j < SAMPLE_BLOCKS ; j++) { + + t.reset(); + t.start(); + + for (int i = 0; i < NUM_SAMPLES ; i++) { + float a = ain.read(); + + if (a > (AVERAGE + 0.5000)) { + num_2048++; // > 2048 lsb + } else if (a > (AVERAGE + 0.2500)) { + num_1024++; // > 1024 lsb + } else if (a > (AVERAGE + 0.0625)) { + num_512++; // > 512 lsb + } else if (a > (AVERAGE + 0.0312)) { + num_256++; // > 256 lsb + } else if (a > (AVERAGE + 0.0312)) { + num_128++; // > 128 lsb + } else if (a > (AVERAGE + 0.0156)) { + num_64++; // > 64 lsb + } else if (a > (AVERAGE + 0.0078)) { + num_32++; // > 32 lsb + } else if (a > (AVERAGE + 0.0039)) { + num_16++; // > 16 lsb + } else if (a > (AVERAGE + 0.0019)) { + num_8++; // > 8 lsb + } else if (a > (AVERAGE + 0.0009)) { + num_4++; // > 8 lsb + } + + num_samples++; + } + t.stop(); + + // Every 500,000 print the results + pc.printf("%d\t",num_samples); + pc.printf("%d\t",num_4); + pc.printf("%d\t",num_8); + pc.printf("%d\t",num_16); + pc.printf("%d\t",num_32); + pc.printf("%d\t",num_64); + pc.printf("%d\t",num_128); + pc.printf("%d\t",num_256); + pc.printf("%d\t",num_512); + pc.printf("%d\t",num_1024); + pc.printf("%d\t",num_2048); + pc.printf("%f\n",t.read()); + } + + pc.printf("==== Test Complete ====\n"); +}