WIZwiki W7500 ADC Performance Meter
Dependencies: SDFileSystem STATIC_COLORS WIZnetInterface mbed
Fork of WIZwiki-W7500_ADC_Sampling by
main.cpp
- Committer:
- Fo170
- Date:
- 2016-07-10
- Revision:
- 4:9b3e3c52778a
- Parent:
- 3:cc86b144837b
File content as of revision 4:9b3e3c52778a:
#include "mbed.h" #include "EthernetInterface.h" #include "SDFileSystem.h" #include <stdio.h> #include <string.h> // https://developer.mbed.org/users/chris/notebook/Getting-best-ADC-performance/ // https://developer.mbed.org/users/chris/code/ADCPerformanceMeter/ #if defined(TARGET_WIZwiki_W7500) Serial uart(USBTX, USBRX); SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500 #include "static_colors.h" // LED RED : server listning status // LED GREEN : socket connecting status Ok // LED BLUE : socket connecting status Busy #endif #define HTTPD_MAX_FNAME_LENGTH 127 #define HTTPD_MAX_DNAME_LENGTH 127 char fileName[HTTPD_MAX_FNAME_LENGTH+1]; char dirName[HTTPD_MAX_DNAME_LENGTH+1]; char *uristr; char *eou; char *qrystr; FILE *fp; int rdCnt; // Initialize a pins to perform analog input and digital output fucntions AnalogIn ain0(A0); #define NUM_SAMPLES 500000 // size of sample series #define SAMPLE_BLOCKS 5 Timer t; Ticker ledTick; char *pch; char ext[5]; int pos_ext; int extLen; //--------------------------- int samples = 0; int num_4 = 0; int num_8 = 0; int num_16 = 0; int num_32 = 0; int num_64 = 0; int num_128 = 0; int num_256 = 0; int num_512 = 0; int num_1024 = 0; int num_spike = 0; float AVERAGE = 0.5; float AVERAGE_MOY = 0.5; float average_min = 0.0; float average_max = 3.3; float average_error = 3.0303; // Par défaut : 3.0303% sur la valeur centrale 1.65V #define __AVERAGE_AUTO__ 1 void PerformanceMeter(void) { float r = 0.0; //--------------------------------- // Take the average over 500,000 samples // This is because the bias to 1.65v has a tolerance // adjust the analog input to 1.65V, if NO AUTO MODE uart.printf("Taking an average over %d samples\r\n",NUM_SAMPLES); if( __AVERAGE_AUTO__ ) { COLOR(_BLUE_); samples = 0; average_error = 5.0; // 5% initiale uart.printf("AVERAGE AUTO : error %f%%\r\n", average_error); while(samples < NUM_SAMPLES) { r = ain0.read(); AVERAGE_MOY += r; samples++; } AVERAGE_MOY /= NUM_SAMPLES; average_min = AVERAGE_MOY - (AVERAGE_MOY * average_error / 100.0); average_max = AVERAGE_MOY + (AVERAGE_MOY * average_error / 100.0); uart.printf("Average Moyenne (for 5%%) = %f , Min = %f , Max = %f\r\n",3.3 * AVERAGE, 3.3 * average_min, 3.3 * average_max); samples = 0; while(samples < NUM_SAMPLES) { r = ain0.read(); if((r > average_min) && (r < average_max)) { AVERAGE += r; samples++; } } AVERAGE /= NUM_SAMPLES; average_min = AVERAGE - (AVERAGE * average_error / 100.0); average_max = AVERAGE + (AVERAGE * average_error / 100.0); uart.printf("Average (for 5%%) = %f , Min = %f , Max = %f\r\n",3.3 * AVERAGE, 3.3 * average_min, 3.3 * average_max); // étalonage à 1% -------------------- average_error = 1.0; // 1% COLOR(_YELLOW_); samples = 0; while(samples < NUM_SAMPLES) { r = ain0.read(); if((r > average_min) && (r < average_max)) { AVERAGE += r; samples++; } } AVERAGE /= NUM_SAMPLES; average_min = AVERAGE - (AVERAGE * average_error / 100.0); average_max = AVERAGE + (AVERAGE * average_error / 100.0); uart.printf("Average (for 1%%) = %f , Min = %f , Max = %f\r\n",3.3 * AVERAGE, 3.3 * average_min, 3.3 * average_max); } else { COLOR(_PURPLE_); average_min = 1.65 - (1.65 * average_error / 100.0); // 0.45 --> -3,0303% of 1.65V --> 1.485V average_max = 1.65 + (1.65 * average_error / 100.0); // 0.55 --> +3,0303% of 1.65V --> 1.815V samples = 0; while(samples < NUM_SAMPLES) { r = ain0.read(); if((r > average_min) && (r < average_max)) // 0.7425V à 0.9075 { AVERAGE += r; samples++; } } AVERAGE /= NUM_SAMPLES; uart.printf("Average = %f , Min = %f , Max = %f\r\n",3.3 * AVERAGE, 3.3 * average_min, 3.3 * average_max); } samples = 0; // Now start sampling series of 500,000 // acculumating the errors seen in each range uart.printf("Profiling %d samples\r\n",SAMPLE_BLOCKS*NUM_SAMPLES); float a; for(int j=0; j < SAMPLE_BLOCKS ; j++) { t.reset(); t.start(); COLOR(_WHITE_); //uart.printf("%d SAMPLE BLOCKS\r\n",j); for(int i = 0; i < NUM_SAMPLES ; i++) { a = ain0.read(); if(a == 1.0) { num_spike++; // > 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 } samples++; } t.stop(); COLOR(_BLACK_); if(j==0) { uart.printf("Samples\t"); uart.printf("4\t"); uart.printf("8\t"); uart.printf("16\t"); uart.printf("32\t"); uart.printf("64\t"); uart.printf("128\t"); uart.printf("256\t"); uart.printf("512\t"); uart.printf("1024\t"); uart.printf("Spikes\t"); uart.printf("Time\r\n"); } // Every 500,000 print the results uart.printf("%d\t",samples); uart.printf("%d\t",num_4); uart.printf("%d\t",num_8); uart.printf("%d\t",num_16); uart.printf("%d\t",num_32); uart.printf("%d\t",num_64); uart.printf("%d\t",num_128); uart.printf("%d\t",num_256); uart.printf("%d\t",num_512); uart.printf("%d\t",num_1024); uart.printf("%d\t",num_spike); uart.printf("%fs\r\n",t.read()); } uart.printf("==== Test Complete ====\r\n"); COLOR(_GREEN_); //------------------------------- // TEST continu uart.printf("==== Test Continu avec %d Samples ====\r\n", NUM_SAMPLES / 10); samples = 0; while(1) { a = ain0.read(); samples++; if(a == 1.0) { num_spike++; // > 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 } if(samples == NUM_SAMPLES / 10) { uart.printf("Samples\t"); uart.printf("4\t"); uart.printf("8\t"); uart.printf("16\t"); uart.printf("32\t"); uart.printf("64\t"); uart.printf("128\t"); uart.printf("256\t"); uart.printf("512\t"); uart.printf("1024\t"); uart.printf("Spikes\r\n"); // Every 500,000 print the results uart.printf("%d\t",samples); uart.printf("%d\t",num_4); uart.printf("%d\t",num_8); uart.printf("%d\t",num_16); uart.printf("%d\t",num_32); uart.printf("%d\t",num_64); uart.printf("%d\t",num_128); uart.printf("%d\t",num_256); uart.printf("%d\t",num_512); uart.printf("%d\t",num_1024); uart.printf("%d\r\n\r\n",num_spike); 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_spike = 0; samples = 0; } } } //-------------------------------------------- int main(void) { // initialisation des variables //-------------- COLOR(_BLACK_); // Serial Interface eth; // Serial port configuration (valeurs par defaut) : 9600 baud, 8-bit data, no parity, stop bit uart.baud(9600); uart.format(8, SerialBase::None, 1); COLOR(_RED_); uart.printf("WIZwiki-W7500 - mBED ( Compiled at : %s and %s )\r\n", __DATE__ , __TIME__); uart.printf("Initializing\n\r"); wait(1.0); PerformanceMeter(); }