Dependencies:   mbed

Committer:
Bobty
Date:
Tue Jan 05 10:46:48 2010 +0000
Revision:
0:f75c555dc52b

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }