Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:f75c555dc52b, committed 2010-01-05
- Comitter:
- Bobty
- Date:
- Tue Jan 05 10:46:48 2010 +0000
- Commit message:
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r f75c555dc52b main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Jan 05 10:46:48 2010 +0000
@@ -0,0 +1,160 @@
+// analog input p20 (ADC0[5], pin 3) test with stats
+
+#include "mbed.h"
+
+// Code from Simon Ford 2010-01-04
+void mbedAdcInit()
+{
+ // power on, clk divider /4
+ LPC_SC->PCONP |= (1 << 12);
+ LPC_SC->PCLKSEL0 &= ~(0x3 << 24);
+
+ // software-controlled ADC settings
+ LPC_ADC->ADCR = (0 << 0) // SEL: 0 = no channels selected
+ | (200 << 8) // CLKDIV: PCLK max ~= 25MHz, /25 to give safe 1MHz
+ | (0 << 16) // BURST: 0 = software control
+ | (0 << 17) // CLKS: not applicable
+ | (1 << 21) // PDN: 1 = operational
+ | (0 << 24) // START: 0 = no start
+ | (0 << 27); // EDGE: not applicable
+
+ // setup P1_31 as sel 3 (ADC), mode 2 (no pull)
+ LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30);
+ LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 30;
+
+ LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30);
+ LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 30;
+
+}
+
+unsigned int mbedGetVal()
+{
+ // Select channel and start conversion
+ LPC_ADC->ADCR &= ~0xFF;
+ LPC_ADC->ADCR |= 1 << 5; // ADC0[5]
+ LPC_ADC->ADCR |= 1 << 24;
+
+ // Repeatedly get the sample data until DONE bit
+ unsigned int data;
+ do {
+ data = LPC_ADC->ADGDR;
+ } while ((data & ((unsigned int)1 << 31)) == 0);
+ data = LPC_ADC->ADGDR;
+
+ // Stop conversion
+ LPC_ADC->ADCR &= ~(1 << 24);
+
+ return data;
+}
+
+// Code gleaned from MBED forum
+void DispInfo()
+{
+ printf("SystemCoreClock = %d Hz\n", SystemCoreClock);
+
+ int Fin = 12000000; // 12MHz XTAL
+
+ printf("PLL Registers:\n");
+ printf(" - PLL0CFG = 0x%08X\n", LPC_SC->PLL0CFG);
+ printf(" - CLKCFG = 0x%08X\n", LPC_SC->CCLKCFG);
+
+ int M = (LPC_SC->PLL0CFG & 0xFFFF) + 1;
+ int N = (LPC_SC->PLL0CFG >> 16) + 1;
+ int CCLKDIV = LPC_SC->CCLKCFG + 1;
+
+ printf("Clock Variables:\n");
+ printf(" - Fin = %d\n", Fin);
+ printf(" - M = %d\n", M);
+ printf(" - N = %d\n", N);
+ printf(" - CCLKDIV = %d\n", CCLKDIV);
+
+ int Fcco = (2 * M * 12000000) / N;
+ int CCLK = Fcco / CCLKDIV;
+
+ printf("Clock Results:\n");
+ printf(" - Fcco = %d\n", Fcco);
+ printf(" - CCLK = %d\n", CCLK);
+
+ printf("PCLKSEL0 = 0x%08x\n", LPC_SC->PCLKSEL0);
+ printf("PCLKSEL1 = 0x%08x\n", LPC_SC->PCLKSEL1);
+
+}
+
+int main() {
+
+ const int NUM_LOOPS = 100;
+ const int NUM_SAMPS = 1024;
+
+ mbedAdcInit();
+ wait_ms(100);
+
+ DispInfo();
+
+ // Table of deviation counts
+ const int DEV_HIST_SIZE = 10;
+ int devTable[DEV_HIST_SIZE+1];
+ for (int i = 0; i < DEV_HIST_SIZE+1; i++)
+ devTable[i] = 0;
+
+ // Run many times
+ double mean;
+ double lowestStdDev = 1024;
+ double highestStdDev = 0;
+ double sumForMean = 0;
+ for (int j = 0; j < NUM_LOOPS; j++)
+ {
+ // Get ADC readings
+ unsigned int adgdrVals[NUM_SAMPS];
+ unsigned int samples[NUM_SAMPS];
+ for(int i=0; i<NUM_SAMPS; i++) {
+ adgdrVals[i] = mbedGetVal();
+ samples[i] = (adgdrVals[i] >> 5) & 0x3ff;
+ wait_ms(1);
+ }
+
+ // Calculate mean
+ double localSum = 0;
+ for(int i=0; i<NUM_SAMPS; i++)
+ localSum += samples[i];
+ double localMean = localSum / NUM_SAMPS;
+ sumForMean += localSum;
+
+ // Calculate std-dev sum
+ double sumSqrDiffs = 0;
+ for(int i=0; i<NUM_SAMPS; i++)
+ sumSqrDiffs += (samples[i] - localMean) * (samples[i] - localMean);
+
+ // Calculate stdDev and see if low/high
+ double stdDev = sqrt(sumSqrDiffs / NUM_SAMPS);
+ if (lowestStdDev > stdDev)
+ lowestStdDev = stdDev;
+ if (highestStdDev < stdDev)
+ highestStdDev = stdDev;
+
+ // Histogram of values
+ for (int i = 0; i < NUM_SAMPS; i++)
+ {
+ int outOfBoundsDist = int(fabs(samples[i] - localMean));
+ if (outOfBoundsDist >= DEV_HIST_SIZE)
+ devTable[DEV_HIST_SIZE]++;
+ else
+ devTable[outOfBoundsDist]++;
+ }
+
+ // Show results that are out of bounds
+ printf("Results out of bounds for pass %d:\n", j);
+ for(int i=0; i<NUM_SAMPS; i++) {
+ if (fabs(samples[i] - localMean) > 5)
+ printf("%5d, 0x%04X, %d\n", i, adgdrVals[i], samples[i]);
+ }
+ }
+
+ // Show overall stats
+ mean = sumForMean / NUM_SAMPS / NUM_LOOPS;
+ printf("Mean: %.2f\n", mean);
+ printf("Std-dev (highest, lowest): %.2f, %.2f\n", highestStdDev, lowestStdDev);
+ printf("Deviation Table\n");
+ printf("Dist.\tCount\n");
+ for (int i = 0; i < DEV_HIST_SIZE+1; i++)
+ printf("%s%d\t%d\n", i == DEV_HIST_SIZE ? "> " : "", i, devTable[i]);
+}
diff -r 000000000000 -r f75c555dc52b mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Jan 05 10:46:48 2010 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/49a220cc26e0