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.
main.cpp@0:caf407d467b1, 2010-12-14 (annotated)
- Committer:
- Mischa
- Date:
- Tue Dec 14 06:37:48 2010 +0000
- Revision:
- 0:caf407d467b1
Who changed what in which revision?
User | Revision | Line number | New 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 |