Scans through the DAC values, and copies a set of ADC values to file on USB local filesystem. Reads from the ADC directly. Connect pin 18 to pin 17.

Dependencies:   mbed

Committer:
Mischa
Date:
Tue Dec 14 06:37:48 2010 +0000
Revision:
0:caf407d467b1

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mischa 0:caf407d467b1 1 // Scans through the D/A converter values, and copies a set of A/D converter values to file on USB local filesystem.
Mischa 0:caf407d467b1 2 // Connect pin 18 to pin 17.
Mischa 0:caf407d467b1 3
Mischa 0:caf407d467b1 4 #include "mbed.h"
Mischa 0:caf407d467b1 5
Mischa 0:caf407d467b1 6 AnalogOut aout(p18);
Mischa 0:caf407d467b1 7 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
Mischa 0:caf407d467b1 8
Mischa 0:caf407d467b1 9 const int N = 100; //number of samples per D/A value
Mischa 0:caf407d467b1 10 int i;
Mischa 0:caf407d467b1 11 int n;
Mischa 0:caf407d467b1 12 unsigned short x[N];
Mischa 0:caf407d467b1 13 short trim = 3; // ADC trim; appears this is added to the ADC readings in two's complement (i.e, -8 gives results in too low readings, 0 gives about correct readings, +3 gives really correct readings for my system, and +7 gives too high readings.)
Mischa 0:caf407d467b1 14
Mischa 0:caf407d467b1 15 // /4 /26 -> mbed
Mischa 0:caf407d467b1 16 // /8 /3 -> nice
Mischa 0:caf407d467b1 17 // /1 /8 -> 12MHz (max) (ugly)
Mischa 0:caf407d467b1 18 // /1 /12 (i.e., 11 in reg.) -> nice
Mischa 0:caf407d467b1 19
Mischa 0:caf407d467b1 20 int main() {
Mischa 0:caf407d467b1 21 // A/D power on, set A/D clk divider /4
Mischa 0:caf407d467b1 22 LPC_SC->PCONP |= (1 << 12); // power on, PCADC bit
Mischa 0:caf407d467b1 23 LPC_SC->PCLKSEL0 &= ~(0x1 << 24); // PCLK_ADC=0,1,2,3 -> CCLK /4,/1,/2,/8
Mischa 0:caf407d467b1 24
Mischa 0:caf407d467b1 25 // software-controlled ADC settings
Mischa 0:caf407d467b1 26 LPC_ADC->ADCR = (0 << 0) // SEL: 0 = no channels selected yet
Mischa 0:caf407d467b1 27 | (11 << 8) // CLKDIV: PCLK_ADC0 is divided by this number+1 (8 bits)
Mischa 0:caf407d467b1 28 | (0 << 16) // BURST: 0 = software control
Mischa 0:caf407d467b1 29 | (1 << 21) // PDN: 1 = operational
Mischa 0:caf407d467b1 30 | (0 << 24); // START: 0 = no start
Mischa 0:caf407d467b1 31
Mischa 0:caf407d467b1 32 //p15 = LPC1768 pin 9 = P0.23 = AD0.0 = PINSEL1 bit 15&14 01
Mischa 0:caf407d467b1 33 //p16 = LPC1768 pin 8 = P0.24 = AD0.1 = PINSEL1 bit 17&16 01
Mischa 0:caf407d467b1 34 //p17 = LPC1768 pin 7 = P0.25 = AD0.2 = PINSEL1 bit 19&18 01
Mischa 0:caf407d467b1 35 //p19 = LPC1768 pin 21 = P1.30 = AD0.4 = PINSEL3 bit 29&28 11
Mischa 0:caf407d467b1 36 //p20 = LPC1768 pin 20 = P1.31 = AD0.5 = PINSEL3 bit 31&30 11
Mischa 0:caf407d467b1 37 //Same bits in PINMODEi, set these to 10 to disconnect pull up/pull down resistors
Mischa 0:caf407d467b1 38 LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18);
Mischa 0:caf407d467b1 39 LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 18;
Mischa 0:caf407d467b1 40 LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18);
Mischa 0:caf407d467b1 41 LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 18; // neither pull up nor pull down
Mischa 0:caf407d467b1 42 LPC_ADC->ADCR &= ~0xFF;
Mischa 0:caf407d467b1 43 LPC_ADC->ADCR |= 1 << 2; // ADC0[2]
Mischa 0:caf407d467b1 44 /* LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28);
Mischa 0:caf407d467b1 45 LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 28;
Mischa 0:caf407d467b1 46 LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28);
Mischa 0:caf407d467b1 47 LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 28; // neither pull up nor pull down
Mischa 0:caf407d467b1 48 LPC_ADC->ADCR &= ~0xFF;
Mischa 0:caf407d467b1 49 LPC_ADC->ADCR |= 1 << 4; // ADC0[4]
Mischa 0:caf407d467b1 50 */
Mischa 0:caf407d467b1 51 LPC_ADC->ADTRM&=~0x00F0;
Mischa 0:caf407d467b1 52 LPC_ADC->ADTRM|=(trim<<4) & 0x00F0; //set the trim
Mischa 0:caf407d467b1 53
Mischa 0:caf407d467b1 54 FILE *fp = fopen("/local/out.txt", "w"); // Open "out.txt" on the local file system for writing
Mischa 0:caf407d467b1 55 for (i=0;i<1024;i++) {
Mischa 0:caf407d467b1 56 aout.write_u16(i<<6);
Mischa 0:caf407d467b1 57 wait(0.000100);
Mischa 0:caf407d467b1 58 for (n=0;n<N;n++) {
Mischa 0:caf407d467b1 59 // Select channel and start conversion
Mischa 0:caf407d467b1 60 LPC_ADC->ADCR |= 1 << 24;
Mischa 0:caf407d467b1 61
Mischa 0:caf407d467b1 62 // Repeatedly get the sample data until DONE or OVERRUN bit
Mischa 0:caf407d467b1 63 unsigned int data;
Mischa 0:caf407d467b1 64 do {
Mischa 0:caf407d467b1 65 data = LPC_ADC->ADGDR;
Mischa 0:caf407d467b1 66 } while ((data & ((unsigned int)3 << 30)) == 0);
Mischa 0:caf407d467b1 67 x[n]=data;
Mischa 0:caf407d467b1 68 }
Mischa 0:caf407d467b1 69 // Stop conversions
Mischa 0:caf407d467b1 70 LPC_ADC->ADCR &= ~(1 << 24);
Mischa 0:caf407d467b1 71
Mischa 0:caf407d467b1 72 fwrite(x,sizeof(x[0]),sizeof(x)/sizeof(x[0]),fp);
Mischa 0:caf407d467b1 73 }
Mischa 0:caf407d467b1 74 fclose(fp);
Mischa 0:caf407d467b1 75 }
Mischa 0:caf407d467b1 76