Rob Dobson
/
TestAnalogWithSnippet
main.cpp@0:f75c555dc52b, 2010-01-05 (annotated)
- Committer:
- Bobty
- Date:
- Tue Jan 05 10:46:48 2010 +0000
- Revision:
- 0:f75c555dc52b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Bobty | 0:f75c555dc52b | 1 | // analog input p20 (ADC0[5], pin 3) test with stats |
Bobty | 0:f75c555dc52b | 2 | |
Bobty | 0:f75c555dc52b | 3 | #include "mbed.h" |
Bobty | 0:f75c555dc52b | 4 | |
Bobty | 0:f75c555dc52b | 5 | // Code from Simon Ford 2010-01-04 |
Bobty | 0:f75c555dc52b | 6 | void mbedAdcInit() |
Bobty | 0:f75c555dc52b | 7 | { |
Bobty | 0:f75c555dc52b | 8 | // power on, clk divider /4 |
Bobty | 0:f75c555dc52b | 9 | LPC_SC->PCONP |= (1 << 12); |
Bobty | 0:f75c555dc52b | 10 | LPC_SC->PCLKSEL0 &= ~(0x3 << 24); |
Bobty | 0:f75c555dc52b | 11 | |
Bobty | 0:f75c555dc52b | 12 | // software-controlled ADC settings |
Bobty | 0:f75c555dc52b | 13 | LPC_ADC->ADCR = (0 << 0) // SEL: 0 = no channels selected |
Bobty | 0:f75c555dc52b | 14 | | (200 << 8) // CLKDIV: PCLK max ~= 25MHz, /25 to give safe 1MHz |
Bobty | 0:f75c555dc52b | 15 | | (0 << 16) // BURST: 0 = software control |
Bobty | 0:f75c555dc52b | 16 | | (0 << 17) // CLKS: not applicable |
Bobty | 0:f75c555dc52b | 17 | | (1 << 21) // PDN: 1 = operational |
Bobty | 0:f75c555dc52b | 18 | | (0 << 24) // START: 0 = no start |
Bobty | 0:f75c555dc52b | 19 | | (0 << 27); // EDGE: not applicable |
Bobty | 0:f75c555dc52b | 20 | |
Bobty | 0:f75c555dc52b | 21 | // setup P1_31 as sel 3 (ADC), mode 2 (no pull) |
Bobty | 0:f75c555dc52b | 22 | LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30); |
Bobty | 0:f75c555dc52b | 23 | LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 30; |
Bobty | 0:f75c555dc52b | 24 | |
Bobty | 0:f75c555dc52b | 25 | LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30); |
Bobty | 0:f75c555dc52b | 26 | LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 30; |
Bobty | 0:f75c555dc52b | 27 | |
Bobty | 0:f75c555dc52b | 28 | } |
Bobty | 0:f75c555dc52b | 29 | |
Bobty | 0:f75c555dc52b | 30 | unsigned int mbedGetVal() |
Bobty | 0:f75c555dc52b | 31 | { |
Bobty | 0:f75c555dc52b | 32 | // Select channel and start conversion |
Bobty | 0:f75c555dc52b | 33 | LPC_ADC->ADCR &= ~0xFF; |
Bobty | 0:f75c555dc52b | 34 | LPC_ADC->ADCR |= 1 << 5; // ADC0[5] |
Bobty | 0:f75c555dc52b | 35 | LPC_ADC->ADCR |= 1 << 24; |
Bobty | 0:f75c555dc52b | 36 | |
Bobty | 0:f75c555dc52b | 37 | // Repeatedly get the sample data until DONE bit |
Bobty | 0:f75c555dc52b | 38 | unsigned int data; |
Bobty | 0:f75c555dc52b | 39 | do { |
Bobty | 0:f75c555dc52b | 40 | data = LPC_ADC->ADGDR; |
Bobty | 0:f75c555dc52b | 41 | } while ((data & ((unsigned int)1 << 31)) == 0); |
Bobty | 0:f75c555dc52b | 42 | data = LPC_ADC->ADGDR; |
Bobty | 0:f75c555dc52b | 43 | |
Bobty | 0:f75c555dc52b | 44 | // Stop conversion |
Bobty | 0:f75c555dc52b | 45 | LPC_ADC->ADCR &= ~(1 << 24); |
Bobty | 0:f75c555dc52b | 46 | |
Bobty | 0:f75c555dc52b | 47 | return data; |
Bobty | 0:f75c555dc52b | 48 | } |
Bobty | 0:f75c555dc52b | 49 | |
Bobty | 0:f75c555dc52b | 50 | // Code gleaned from MBED forum |
Bobty | 0:f75c555dc52b | 51 | void DispInfo() |
Bobty | 0:f75c555dc52b | 52 | { |
Bobty | 0:f75c555dc52b | 53 | printf("SystemCoreClock = %d Hz\n", SystemCoreClock); |
Bobty | 0:f75c555dc52b | 54 | |
Bobty | 0:f75c555dc52b | 55 | int Fin = 12000000; // 12MHz XTAL |
Bobty | 0:f75c555dc52b | 56 | |
Bobty | 0:f75c555dc52b | 57 | printf("PLL Registers:\n"); |
Bobty | 0:f75c555dc52b | 58 | printf(" - PLL0CFG = 0x%08X\n", LPC_SC->PLL0CFG); |
Bobty | 0:f75c555dc52b | 59 | printf(" - CLKCFG = 0x%08X\n", LPC_SC->CCLKCFG); |
Bobty | 0:f75c555dc52b | 60 | |
Bobty | 0:f75c555dc52b | 61 | int M = (LPC_SC->PLL0CFG & 0xFFFF) + 1; |
Bobty | 0:f75c555dc52b | 62 | int N = (LPC_SC->PLL0CFG >> 16) + 1; |
Bobty | 0:f75c555dc52b | 63 | int CCLKDIV = LPC_SC->CCLKCFG + 1; |
Bobty | 0:f75c555dc52b | 64 | |
Bobty | 0:f75c555dc52b | 65 | printf("Clock Variables:\n"); |
Bobty | 0:f75c555dc52b | 66 | printf(" - Fin = %d\n", Fin); |
Bobty | 0:f75c555dc52b | 67 | printf(" - M = %d\n", M); |
Bobty | 0:f75c555dc52b | 68 | printf(" - N = %d\n", N); |
Bobty | 0:f75c555dc52b | 69 | printf(" - CCLKDIV = %d\n", CCLKDIV); |
Bobty | 0:f75c555dc52b | 70 | |
Bobty | 0:f75c555dc52b | 71 | int Fcco = (2 * M * 12000000) / N; |
Bobty | 0:f75c555dc52b | 72 | int CCLK = Fcco / CCLKDIV; |
Bobty | 0:f75c555dc52b | 73 | |
Bobty | 0:f75c555dc52b | 74 | printf("Clock Results:\n"); |
Bobty | 0:f75c555dc52b | 75 | printf(" - Fcco = %d\n", Fcco); |
Bobty | 0:f75c555dc52b | 76 | printf(" - CCLK = %d\n", CCLK); |
Bobty | 0:f75c555dc52b | 77 | |
Bobty | 0:f75c555dc52b | 78 | printf("PCLKSEL0 = 0x%08x\n", LPC_SC->PCLKSEL0); |
Bobty | 0:f75c555dc52b | 79 | printf("PCLKSEL1 = 0x%08x\n", LPC_SC->PCLKSEL1); |
Bobty | 0:f75c555dc52b | 80 | |
Bobty | 0:f75c555dc52b | 81 | } |
Bobty | 0:f75c555dc52b | 82 | |
Bobty | 0:f75c555dc52b | 83 | int main() { |
Bobty | 0:f75c555dc52b | 84 | |
Bobty | 0:f75c555dc52b | 85 | const int NUM_LOOPS = 100; |
Bobty | 0:f75c555dc52b | 86 | const int NUM_SAMPS = 1024; |
Bobty | 0:f75c555dc52b | 87 | |
Bobty | 0:f75c555dc52b | 88 | mbedAdcInit(); |
Bobty | 0:f75c555dc52b | 89 | wait_ms(100); |
Bobty | 0:f75c555dc52b | 90 | |
Bobty | 0:f75c555dc52b | 91 | DispInfo(); |
Bobty | 0:f75c555dc52b | 92 | |
Bobty | 0:f75c555dc52b | 93 | // Table of deviation counts |
Bobty | 0:f75c555dc52b | 94 | const int DEV_HIST_SIZE = 10; |
Bobty | 0:f75c555dc52b | 95 | int devTable[DEV_HIST_SIZE+1]; |
Bobty | 0:f75c555dc52b | 96 | for (int i = 0; i < DEV_HIST_SIZE+1; i++) |
Bobty | 0:f75c555dc52b | 97 | devTable[i] = 0; |
Bobty | 0:f75c555dc52b | 98 | |
Bobty | 0:f75c555dc52b | 99 | // Run many times |
Bobty | 0:f75c555dc52b | 100 | double mean; |
Bobty | 0:f75c555dc52b | 101 | double lowestStdDev = 1024; |
Bobty | 0:f75c555dc52b | 102 | double highestStdDev = 0; |
Bobty | 0:f75c555dc52b | 103 | double sumForMean = 0; |
Bobty | 0:f75c555dc52b | 104 | for (int j = 0; j < NUM_LOOPS; j++) |
Bobty | 0:f75c555dc52b | 105 | { |
Bobty | 0:f75c555dc52b | 106 | // Get ADC readings |
Bobty | 0:f75c555dc52b | 107 | unsigned int adgdrVals[NUM_SAMPS]; |
Bobty | 0:f75c555dc52b | 108 | unsigned int samples[NUM_SAMPS]; |
Bobty | 0:f75c555dc52b | 109 | for(int i=0; i<NUM_SAMPS; i++) { |
Bobty | 0:f75c555dc52b | 110 | adgdrVals[i] = mbedGetVal(); |
Bobty | 0:f75c555dc52b | 111 | samples[i] = (adgdrVals[i] >> 5) & 0x3ff; |
Bobty | 0:f75c555dc52b | 112 | wait_ms(1); |
Bobty | 0:f75c555dc52b | 113 | } |
Bobty | 0:f75c555dc52b | 114 | |
Bobty | 0:f75c555dc52b | 115 | // Calculate mean |
Bobty | 0:f75c555dc52b | 116 | double localSum = 0; |
Bobty | 0:f75c555dc52b | 117 | for(int i=0; i<NUM_SAMPS; i++) |
Bobty | 0:f75c555dc52b | 118 | localSum += samples[i]; |
Bobty | 0:f75c555dc52b | 119 | double localMean = localSum / NUM_SAMPS; |
Bobty | 0:f75c555dc52b | 120 | sumForMean += localSum; |
Bobty | 0:f75c555dc52b | 121 | |
Bobty | 0:f75c555dc52b | 122 | // Calculate std-dev sum |
Bobty | 0:f75c555dc52b | 123 | double sumSqrDiffs = 0; |
Bobty | 0:f75c555dc52b | 124 | for(int i=0; i<NUM_SAMPS; i++) |
Bobty | 0:f75c555dc52b | 125 | sumSqrDiffs += (samples[i] - localMean) * (samples[i] - localMean); |
Bobty | 0:f75c555dc52b | 126 | |
Bobty | 0:f75c555dc52b | 127 | // Calculate stdDev and see if low/high |
Bobty | 0:f75c555dc52b | 128 | double stdDev = sqrt(sumSqrDiffs / NUM_SAMPS); |
Bobty | 0:f75c555dc52b | 129 | if (lowestStdDev > stdDev) |
Bobty | 0:f75c555dc52b | 130 | lowestStdDev = stdDev; |
Bobty | 0:f75c555dc52b | 131 | if (highestStdDev < stdDev) |
Bobty | 0:f75c555dc52b | 132 | highestStdDev = stdDev; |
Bobty | 0:f75c555dc52b | 133 | |
Bobty | 0:f75c555dc52b | 134 | // Histogram of values |
Bobty | 0:f75c555dc52b | 135 | for (int i = 0; i < NUM_SAMPS; i++) |
Bobty | 0:f75c555dc52b | 136 | { |
Bobty | 0:f75c555dc52b | 137 | int outOfBoundsDist = int(fabs(samples[i] - localMean)); |
Bobty | 0:f75c555dc52b | 138 | if (outOfBoundsDist >= DEV_HIST_SIZE) |
Bobty | 0:f75c555dc52b | 139 | devTable[DEV_HIST_SIZE]++; |
Bobty | 0:f75c555dc52b | 140 | else |
Bobty | 0:f75c555dc52b | 141 | devTable[outOfBoundsDist]++; |
Bobty | 0:f75c555dc52b | 142 | } |
Bobty | 0:f75c555dc52b | 143 | |
Bobty | 0:f75c555dc52b | 144 | // Show results that are out of bounds |
Bobty | 0:f75c555dc52b | 145 | printf("Results out of bounds for pass %d:\n", j); |
Bobty | 0:f75c555dc52b | 146 | for(int i=0; i<NUM_SAMPS; i++) { |
Bobty | 0:f75c555dc52b | 147 | if (fabs(samples[i] - localMean) > 5) |
Bobty | 0:f75c555dc52b | 148 | printf("%5d, 0x%04X, %d\n", i, adgdrVals[i], samples[i]); |
Bobty | 0:f75c555dc52b | 149 | } |
Bobty | 0:f75c555dc52b | 150 | } |
Bobty | 0:f75c555dc52b | 151 | |
Bobty | 0:f75c555dc52b | 152 | // Show overall stats |
Bobty | 0:f75c555dc52b | 153 | mean = sumForMean / NUM_SAMPS / NUM_LOOPS; |
Bobty | 0:f75c555dc52b | 154 | printf("Mean: %.2f\n", mean); |
Bobty | 0:f75c555dc52b | 155 | printf("Std-dev (highest, lowest): %.2f, %.2f\n", highestStdDev, lowestStdDev); |
Bobty | 0:f75c555dc52b | 156 | printf("Deviation Table\n"); |
Bobty | 0:f75c555dc52b | 157 | printf("Dist.\tCount\n"); |
Bobty | 0:f75c555dc52b | 158 | for (int i = 0; i < DEV_HIST_SIZE+1; i++) |
Bobty | 0:f75c555dc52b | 159 | printf("%s%d\t%d\n", i == DEV_HIST_SIZE ? "> " : "", i, devTable[i]); |
Bobty | 0:f75c555dc52b | 160 | } |