![](/media/cache/profiles/5f14615696649541a025d3d0f8e0447f.jpg.50x50_q85.jpg)
ライントレーサPD制御 ロボット製作セミナー演習ex
HighSpeedAnalogIn/HighSpeedAnalogIn.cpp@0:b5d91230ff3c, 2013-08-10 (annotated)
- Committer:
- jksoft
- Date:
- Sat Aug 10 04:13:15 2013 +0000
- Revision:
- 0:b5d91230ff3c
Rev1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jksoft | 0:b5d91230ff3c | 1 | |
jksoft | 0:b5d91230ff3c | 2 | #include "HighSpeedAnalogIn.h" |
jksoft | 0:b5d91230ff3c | 3 | |
jksoft | 0:b5d91230ff3c | 4 | HighSpeedAnalogIn *HighSpeedAnalogIn::instance; |
jksoft | 0:b5d91230ff3c | 5 | int HighSpeedAnalogIn::refcnt = 0; |
jksoft | 0:b5d91230ff3c | 6 | |
jksoft | 0:b5d91230ff3c | 7 | HighSpeedAnalogIn::HighSpeedAnalogIn(PinName pin0, PinName pin1, PinName pin2, PinName pin3, PinName pin4, PinName pin5) { |
jksoft | 0:b5d91230ff3c | 8 | |
jksoft | 0:b5d91230ff3c | 9 | refcnt++; |
jksoft | 0:b5d91230ff3c | 10 | if (refcnt > 1) { |
jksoft | 0:b5d91230ff3c | 11 | error("Please do not use over an object."); |
jksoft | 0:b5d91230ff3c | 12 | } |
jksoft | 0:b5d91230ff3c | 13 | |
jksoft | 0:b5d91230ff3c | 14 | static const int sample_rate = 200000; |
jksoft | 0:b5d91230ff3c | 15 | static const int cclk_div = 1; |
jksoft | 0:b5d91230ff3c | 16 | |
jksoft | 0:b5d91230ff3c | 17 | int adc_clk_freq = CLKS_PER_SAMPLE * sample_rate; |
jksoft | 0:b5d91230ff3c | 18 | int m = (LPC_SC->PLL0CFG & 0xFFFF) + 1; |
jksoft | 0:b5d91230ff3c | 19 | int n = (LPC_SC->PLL0CFG >> 16) + 1; |
jksoft | 0:b5d91230ff3c | 20 | int cclkdiv = LPC_SC->CCLKCFG + 1; |
jksoft | 0:b5d91230ff3c | 21 | int Fcco = (2 * m * XTAL_FREQ) / n; |
jksoft | 0:b5d91230ff3c | 22 | int cclk = Fcco / cclkdiv; |
jksoft | 0:b5d91230ff3c | 23 | |
jksoft | 0:b5d91230ff3c | 24 | LPC_SC->PCONP |= (1 << 12); |
jksoft | 0:b5d91230ff3c | 25 | LPC_SC->PCLKSEL0 &= ~(0x3 << 24); |
jksoft | 0:b5d91230ff3c | 26 | switch (cclk_div) { |
jksoft | 0:b5d91230ff3c | 27 | case 1: |
jksoft | 0:b5d91230ff3c | 28 | LPC_SC->PCLKSEL0 |= 0x1 << 24; |
jksoft | 0:b5d91230ff3c | 29 | break; |
jksoft | 0:b5d91230ff3c | 30 | case 2: |
jksoft | 0:b5d91230ff3c | 31 | LPC_SC->PCLKSEL0 |= 0x2 << 24; |
jksoft | 0:b5d91230ff3c | 32 | break; |
jksoft | 0:b5d91230ff3c | 33 | case 4: |
jksoft | 0:b5d91230ff3c | 34 | LPC_SC->PCLKSEL0 |= 0x0 << 24; |
jksoft | 0:b5d91230ff3c | 35 | break; |
jksoft | 0:b5d91230ff3c | 36 | case 8: |
jksoft | 0:b5d91230ff3c | 37 | LPC_SC->PCLKSEL0 |= 0x3 << 24; |
jksoft | 0:b5d91230ff3c | 38 | break; |
jksoft | 0:b5d91230ff3c | 39 | default: |
jksoft | 0:b5d91230ff3c | 40 | fprintf(stderr, "Warning: ADC CCLK clock divider must be 1, 2, 4 or 8. %u supplied.\n", cclk_div); |
jksoft | 0:b5d91230ff3c | 41 | fprintf(stderr, "Defaulting to 1.\n"); |
jksoft | 0:b5d91230ff3c | 42 | LPC_SC->PCLKSEL0 |= 0x1 << 24; |
jksoft | 0:b5d91230ff3c | 43 | break; |
jksoft | 0:b5d91230ff3c | 44 | } |
jksoft | 0:b5d91230ff3c | 45 | int pclk = cclk / cclk_div; |
jksoft | 0:b5d91230ff3c | 46 | int clock_div = pclk / adc_clk_freq; |
jksoft | 0:b5d91230ff3c | 47 | |
jksoft | 0:b5d91230ff3c | 48 | if (clock_div > 0xFF) { |
jksoft | 0:b5d91230ff3c | 49 | fprintf(stderr, "Warning: Clock division is %u which is above 255 limit. Re-Setting at limit.\n", clock_div); |
jksoft | 0:b5d91230ff3c | 50 | clock_div = 0xFF; |
jksoft | 0:b5d91230ff3c | 51 | } |
jksoft | 0:b5d91230ff3c | 52 | if (clock_div == 0) { |
jksoft | 0:b5d91230ff3c | 53 | fprintf(stderr, "Warning: Clock division is 0. Re-Setting to 1.\n"); |
jksoft | 0:b5d91230ff3c | 54 | clock_div = 1; |
jksoft | 0:b5d91230ff3c | 55 | } |
jksoft | 0:b5d91230ff3c | 56 | |
jksoft | 0:b5d91230ff3c | 57 | int _adc_clk_freq = pclk / clock_div; |
jksoft | 0:b5d91230ff3c | 58 | if (_adc_clk_freq > MAX_ADC_CLOCK) { |
jksoft | 0:b5d91230ff3c | 59 | fprintf(stderr, "Warning: Actual ADC sample rate of %u which is above %u limit\n", _adc_clk_freq / CLKS_PER_SAMPLE, MAX_ADC_CLOCK / CLKS_PER_SAMPLE); |
jksoft | 0:b5d91230ff3c | 60 | int max_div = 1; |
jksoft | 0:b5d91230ff3c | 61 | while ((pclk / max_div) > MAX_ADC_CLOCK) { |
jksoft | 0:b5d91230ff3c | 62 | max_div++; |
jksoft | 0:b5d91230ff3c | 63 | } |
jksoft | 0:b5d91230ff3c | 64 | fprintf(stderr, "Maximum recommended sample rate is %u\n", (pclk / max_div) / CLKS_PER_SAMPLE); |
jksoft | 0:b5d91230ff3c | 65 | } |
jksoft | 0:b5d91230ff3c | 66 | |
jksoft | 0:b5d91230ff3c | 67 | LPC_ADC->ADCR = ((clock_div - 1) << 8) | (1 << 21); |
jksoft | 0:b5d91230ff3c | 68 | LPC_ADC->ADCR &= ~0xFF; |
jksoft | 0:b5d91230ff3c | 69 | |
jksoft | 0:b5d91230ff3c | 70 | for (int i = 0; i < 8; i++) { |
jksoft | 0:b5d91230ff3c | 71 | _adc_data[i] = 0; |
jksoft | 0:b5d91230ff3c | 72 | } |
jksoft | 0:b5d91230ff3c | 73 | |
jksoft | 0:b5d91230ff3c | 74 | // Attach IRQ |
jksoft | 0:b5d91230ff3c | 75 | instance = this; |
jksoft | 0:b5d91230ff3c | 76 | NVIC_SetVector(ADC_IRQn, (uint32_t)&static_adcisr); |
jksoft | 0:b5d91230ff3c | 77 | |
jksoft | 0:b5d91230ff3c | 78 | // Disable global interrupt |
jksoft | 0:b5d91230ff3c | 79 | LPC_ADC->ADINTEN &= ~0x100; |
jksoft | 0:b5d91230ff3c | 80 | |
jksoft | 0:b5d91230ff3c | 81 | // Clock frequency. |
jksoft | 0:b5d91230ff3c | 82 | printf("Clock frequency:%d\n", _adc_clk_freq); |
jksoft | 0:b5d91230ff3c | 83 | |
jksoft | 0:b5d91230ff3c | 84 | // Actual sampling rate. |
jksoft | 0:b5d91230ff3c | 85 | printf("Actual sampling rate:%d\n", _adc_clk_freq / CLKS_PER_SAMPLE); |
jksoft | 0:b5d91230ff3c | 86 | |
jksoft | 0:b5d91230ff3c | 87 | int tmp = LPC_ADC->ADCR & ~(0x0F << 24); |
jksoft | 0:b5d91230ff3c | 88 | tmp |= ((0x0 & 7) << 24) | ((0x0 & 1) << 27); |
jksoft | 0:b5d91230ff3c | 89 | LPC_ADC->ADCR = tmp; |
jksoft | 0:b5d91230ff3c | 90 | LPC_ADC->ADCR |= (1 << 16); |
jksoft | 0:b5d91230ff3c | 91 | |
jksoft | 0:b5d91230ff3c | 92 | if (pin0 != NC) setup(pin0, 1); |
jksoft | 0:b5d91230ff3c | 93 | if (pin1 != NC) setup(pin1, 1); |
jksoft | 0:b5d91230ff3c | 94 | if (pin2 != NC) setup(pin2, 1); |
jksoft | 0:b5d91230ff3c | 95 | if (pin3 != NC) setup(pin3, 1); |
jksoft | 0:b5d91230ff3c | 96 | if (pin4 != NC) setup(pin4, 1); |
jksoft | 0:b5d91230ff3c | 97 | if (pin5 != NC) setup(pin5, 1); |
jksoft | 0:b5d91230ff3c | 98 | |
jksoft | 0:b5d91230ff3c | 99 | interrupt_state(pin0, 1); |
jksoft | 0:b5d91230ff3c | 100 | } |
jksoft | 0:b5d91230ff3c | 101 | |
jksoft | 0:b5d91230ff3c | 102 | HighSpeedAnalogIn::~HighSpeedAnalogIn() { |
jksoft | 0:b5d91230ff3c | 103 | } |
jksoft | 0:b5d91230ff3c | 104 | |
jksoft | 0:b5d91230ff3c | 105 | void HighSpeedAnalogIn::static_adcisr(void) { |
jksoft | 0:b5d91230ff3c | 106 | instance->adcisr(); |
jksoft | 0:b5d91230ff3c | 107 | } |
jksoft | 0:b5d91230ff3c | 108 | |
jksoft | 0:b5d91230ff3c | 109 | void HighSpeedAnalogIn::adcisr(void) { |
jksoft | 0:b5d91230ff3c | 110 | uint32_t stat = LPC_ADC->ADSTAT; |
jksoft | 0:b5d91230ff3c | 111 | // Scan channels for over-run or done and update array |
jksoft | 0:b5d91230ff3c | 112 | if (stat & 0x0101) _adc_data[0] = LPC_ADC->ADDR0; |
jksoft | 0:b5d91230ff3c | 113 | if (stat & 0x0202) _adc_data[1] = LPC_ADC->ADDR1; |
jksoft | 0:b5d91230ff3c | 114 | if (stat & 0x0404) _adc_data[2] = LPC_ADC->ADDR2; |
jksoft | 0:b5d91230ff3c | 115 | if (stat & 0x0808) _adc_data[3] = LPC_ADC->ADDR3; |
jksoft | 0:b5d91230ff3c | 116 | if (stat & 0x1010) _adc_data[4] = LPC_ADC->ADDR4; |
jksoft | 0:b5d91230ff3c | 117 | if (stat & 0x2020) _adc_data[5] = LPC_ADC->ADDR5; |
jksoft | 0:b5d91230ff3c | 118 | if (stat & 0x4040) _adc_data[6] = LPC_ADC->ADDR6; |
jksoft | 0:b5d91230ff3c | 119 | if (stat & 0x8080) _adc_data[7] = LPC_ADC->ADDR7; |
jksoft | 0:b5d91230ff3c | 120 | } |
jksoft | 0:b5d91230ff3c | 121 | |
jksoft | 0:b5d91230ff3c | 122 | int HighSpeedAnalogIn::get_channel(PinName pin) { |
jksoft | 0:b5d91230ff3c | 123 | int ch; |
jksoft | 0:b5d91230ff3c | 124 | switch (pin) { |
jksoft | 0:b5d91230ff3c | 125 | case p15:// =p0.23 of LPC1768 |
jksoft | 0:b5d91230ff3c | 126 | ch = 0; |
jksoft | 0:b5d91230ff3c | 127 | break; |
jksoft | 0:b5d91230ff3c | 128 | case p16:// =p0.24 of LPC1768 |
jksoft | 0:b5d91230ff3c | 129 | ch = 1; |
jksoft | 0:b5d91230ff3c | 130 | break; |
jksoft | 0:b5d91230ff3c | 131 | case p17:// =p0.25 of LPC1768 |
jksoft | 0:b5d91230ff3c | 132 | ch = 2; |
jksoft | 0:b5d91230ff3c | 133 | break; |
jksoft | 0:b5d91230ff3c | 134 | case p18:// =p0.26 of LPC1768 |
jksoft | 0:b5d91230ff3c | 135 | ch = 3; |
jksoft | 0:b5d91230ff3c | 136 | break; |
jksoft | 0:b5d91230ff3c | 137 | case p19:// =p1.30 of LPC1768 |
jksoft | 0:b5d91230ff3c | 138 | ch = 4; |
jksoft | 0:b5d91230ff3c | 139 | break; |
jksoft | 0:b5d91230ff3c | 140 | case p20:// =p1.31 of LPC1768 |
jksoft | 0:b5d91230ff3c | 141 | ch = 5; |
jksoft | 0:b5d91230ff3c | 142 | break; |
jksoft | 0:b5d91230ff3c | 143 | default: |
jksoft | 0:b5d91230ff3c | 144 | ch = 0; |
jksoft | 0:b5d91230ff3c | 145 | break; |
jksoft | 0:b5d91230ff3c | 146 | } |
jksoft | 0:b5d91230ff3c | 147 | return ch; |
jksoft | 0:b5d91230ff3c | 148 | } |
jksoft | 0:b5d91230ff3c | 149 | |
jksoft | 0:b5d91230ff3c | 150 | uint32_t HighSpeedAnalogIn::get_data(PinName pin) { |
jksoft | 0:b5d91230ff3c | 151 | // If in burst mode and at least one interrupt enabled then |
jksoft | 0:b5d91230ff3c | 152 | // take all values from _adc_data |
jksoft | 0:b5d91230ff3c | 153 | if (LPC_ADC->ADINTEN & 0x3F) { |
jksoft | 0:b5d91230ff3c | 154 | return (_adc_data[get_channel(pin)]); |
jksoft | 0:b5d91230ff3c | 155 | } else { |
jksoft | 0:b5d91230ff3c | 156 | // Return current register value or last value from interrupt |
jksoft | 0:b5d91230ff3c | 157 | switch (pin) { |
jksoft | 0:b5d91230ff3c | 158 | case p15:// =p0.23 of LPC1768 |
jksoft | 0:b5d91230ff3c | 159 | return ((LPC_ADC->ADINTEN & 0x01) ? _adc_data[0] : LPC_ADC->ADDR0); |
jksoft | 0:b5d91230ff3c | 160 | case p16:// =p0.24 of LPC1768 |
jksoft | 0:b5d91230ff3c | 161 | return ((LPC_ADC->ADINTEN & 0x02) ? _adc_data[1] : LPC_ADC->ADDR1); |
jksoft | 0:b5d91230ff3c | 162 | case p17:// =p0.25 of LPC1768 |
jksoft | 0:b5d91230ff3c | 163 | return ((LPC_ADC->ADINTEN & 0x04) ? _adc_data[2] : LPC_ADC->ADDR2); |
jksoft | 0:b5d91230ff3c | 164 | case p18:// =p0.26 of LPC1768: |
jksoft | 0:b5d91230ff3c | 165 | return ((LPC_ADC->ADINTEN & 0x08) ? _adc_data[3] : LPC_ADC->ADDR3); |
jksoft | 0:b5d91230ff3c | 166 | case p19:// =p1.30 of LPC1768 |
jksoft | 0:b5d91230ff3c | 167 | return ((LPC_ADC->ADINTEN & 0x10) ? _adc_data[4] : LPC_ADC->ADDR4); |
jksoft | 0:b5d91230ff3c | 168 | case p20:// =p1.31 of LPC1768 |
jksoft | 0:b5d91230ff3c | 169 | return ((LPC_ADC->ADINTEN & 0x20) ? _adc_data[5] : LPC_ADC->ADDR5); |
jksoft | 0:b5d91230ff3c | 170 | default: |
jksoft | 0:b5d91230ff3c | 171 | return 0; |
jksoft | 0:b5d91230ff3c | 172 | } |
jksoft | 0:b5d91230ff3c | 173 | } |
jksoft | 0:b5d91230ff3c | 174 | } |
jksoft | 0:b5d91230ff3c | 175 | |
jksoft | 0:b5d91230ff3c | 176 | // Enable or disable an HighSpeedAnalogIn pin |
jksoft | 0:b5d91230ff3c | 177 | void HighSpeedAnalogIn::setup(PinName pin, int state) { |
jksoft | 0:b5d91230ff3c | 178 | int ch = get_channel(pin); |
jksoft | 0:b5d91230ff3c | 179 | if ((state & 1) == 1) { |
jksoft | 0:b5d91230ff3c | 180 | switch (pin) { |
jksoft | 0:b5d91230ff3c | 181 | case p15:// =p0.23 of LPC1768 |
jksoft | 0:b5d91230ff3c | 182 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14); |
jksoft | 0:b5d91230ff3c | 183 | LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 14; |
jksoft | 0:b5d91230ff3c | 184 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14); |
jksoft | 0:b5d91230ff3c | 185 | LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 14; |
jksoft | 0:b5d91230ff3c | 186 | break; |
jksoft | 0:b5d91230ff3c | 187 | case p16:// =p0.24 of LPC1768 |
jksoft | 0:b5d91230ff3c | 188 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16); |
jksoft | 0:b5d91230ff3c | 189 | LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 16; |
jksoft | 0:b5d91230ff3c | 190 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16); |
jksoft | 0:b5d91230ff3c | 191 | LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 16; |
jksoft | 0:b5d91230ff3c | 192 | break; |
jksoft | 0:b5d91230ff3c | 193 | case p17:// =p0.25 of LPC1768 |
jksoft | 0:b5d91230ff3c | 194 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18); |
jksoft | 0:b5d91230ff3c | 195 | LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 18; |
jksoft | 0:b5d91230ff3c | 196 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18); |
jksoft | 0:b5d91230ff3c | 197 | LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 18; |
jksoft | 0:b5d91230ff3c | 198 | break; |
jksoft | 0:b5d91230ff3c | 199 | case p18:// =p0.26 of LPC1768: |
jksoft | 0:b5d91230ff3c | 200 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20); |
jksoft | 0:b5d91230ff3c | 201 | LPC_PINCON->PINSEL1 |= (unsigned int)0x1 << 20; |
jksoft | 0:b5d91230ff3c | 202 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20); |
jksoft | 0:b5d91230ff3c | 203 | LPC_PINCON->PINMODE1 |= (unsigned int)0x2 << 20; |
jksoft | 0:b5d91230ff3c | 204 | break; |
jksoft | 0:b5d91230ff3c | 205 | case p19:// =p1.30 of LPC1768 |
jksoft | 0:b5d91230ff3c | 206 | LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28); |
jksoft | 0:b5d91230ff3c | 207 | LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 28; |
jksoft | 0:b5d91230ff3c | 208 | LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28); |
jksoft | 0:b5d91230ff3c | 209 | LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 28; |
jksoft | 0:b5d91230ff3c | 210 | break; |
jksoft | 0:b5d91230ff3c | 211 | case p20:// =p1.31 of LPC1768 |
jksoft | 0:b5d91230ff3c | 212 | LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30); |
jksoft | 0:b5d91230ff3c | 213 | LPC_PINCON->PINSEL3 |= (unsigned int)0x3 << 30; |
jksoft | 0:b5d91230ff3c | 214 | LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30); |
jksoft | 0:b5d91230ff3c | 215 | LPC_PINCON->PINMODE3 |= (unsigned int)0x2 << 30; |
jksoft | 0:b5d91230ff3c | 216 | break; |
jksoft | 0:b5d91230ff3c | 217 | default: |
jksoft | 0:b5d91230ff3c | 218 | error("Invalid pin."); |
jksoft | 0:b5d91230ff3c | 219 | break; |
jksoft | 0:b5d91230ff3c | 220 | } |
jksoft | 0:b5d91230ff3c | 221 | // Select channel |
jksoft | 0:b5d91230ff3c | 222 | LPC_ADC->ADCR |= (1 << ch); |
jksoft | 0:b5d91230ff3c | 223 | } else { |
jksoft | 0:b5d91230ff3c | 224 | switch (pin) { |
jksoft | 0:b5d91230ff3c | 225 | case p15://=p0.23 of LPC1768 |
jksoft | 0:b5d91230ff3c | 226 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 14); |
jksoft | 0:b5d91230ff3c | 227 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 14); |
jksoft | 0:b5d91230ff3c | 228 | break; |
jksoft | 0:b5d91230ff3c | 229 | case p16://=p0.24 of LPC1768 |
jksoft | 0:b5d91230ff3c | 230 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 16); |
jksoft | 0:b5d91230ff3c | 231 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 16); |
jksoft | 0:b5d91230ff3c | 232 | break; |
jksoft | 0:b5d91230ff3c | 233 | case p17://=p0.25 of LPC1768 |
jksoft | 0:b5d91230ff3c | 234 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 18); |
jksoft | 0:b5d91230ff3c | 235 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 18); |
jksoft | 0:b5d91230ff3c | 236 | break; |
jksoft | 0:b5d91230ff3c | 237 | case p18://=p0.26 of LPC1768: |
jksoft | 0:b5d91230ff3c | 238 | LPC_PINCON->PINSEL1 &= ~((unsigned int)0x3 << 20); |
jksoft | 0:b5d91230ff3c | 239 | LPC_PINCON->PINMODE1 &= ~((unsigned int)0x3 << 20); |
jksoft | 0:b5d91230ff3c | 240 | break; |
jksoft | 0:b5d91230ff3c | 241 | case p19://=p1.30 of LPC1768 |
jksoft | 0:b5d91230ff3c | 242 | LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 28); |
jksoft | 0:b5d91230ff3c | 243 | LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 28); |
jksoft | 0:b5d91230ff3c | 244 | break; |
jksoft | 0:b5d91230ff3c | 245 | case p20://=p1.31 of LPC1768 |
jksoft | 0:b5d91230ff3c | 246 | LPC_PINCON->PINSEL3 &= ~((unsigned int)0x3 << 30); |
jksoft | 0:b5d91230ff3c | 247 | LPC_PINCON->PINMODE3 &= ~((unsigned int)0x3 << 30); |
jksoft | 0:b5d91230ff3c | 248 | break; |
jksoft | 0:b5d91230ff3c | 249 | default: |
jksoft | 0:b5d91230ff3c | 250 | error("Invalid pin."); |
jksoft | 0:b5d91230ff3c | 251 | break; |
jksoft | 0:b5d91230ff3c | 252 | } |
jksoft | 0:b5d91230ff3c | 253 | LPC_ADC->ADCR &= ~(1 << ch); |
jksoft | 0:b5d91230ff3c | 254 | } |
jksoft | 0:b5d91230ff3c | 255 | } |
jksoft | 0:b5d91230ff3c | 256 | |
jksoft | 0:b5d91230ff3c | 257 | void HighSpeedAnalogIn::interrupt_state(PinName pin, int state) { |
jksoft | 0:b5d91230ff3c | 258 | int ch = get_channel(pin); |
jksoft | 0:b5d91230ff3c | 259 | if (state == 1) { |
jksoft | 0:b5d91230ff3c | 260 | LPC_ADC->ADINTEN &= ~0x100; |
jksoft | 0:b5d91230ff3c | 261 | LPC_ADC->ADINTEN |= 1 << ch; |
jksoft | 0:b5d91230ff3c | 262 | /* Enable the HighSpeedAnalogIn Interrupt */ |
jksoft | 0:b5d91230ff3c | 263 | NVIC_EnableIRQ(ADC_IRQn); |
jksoft | 0:b5d91230ff3c | 264 | } else { |
jksoft | 0:b5d91230ff3c | 265 | LPC_ADC->ADINTEN &= ~(1 << ch); |
jksoft | 0:b5d91230ff3c | 266 | //Disable interrrupt if no active pins left |
jksoft | 0:b5d91230ff3c | 267 | if ((LPC_ADC->ADINTEN & 0xFF) == 0) |
jksoft | 0:b5d91230ff3c | 268 | NVIC_DisableIRQ(ADC_IRQn); |
jksoft | 0:b5d91230ff3c | 269 | } |
jksoft | 0:b5d91230ff3c | 270 | } |
jksoft | 0:b5d91230ff3c | 271 | |
jksoft | 0:b5d91230ff3c | 272 | float HighSpeedAnalogIn::read(PinName pin) { |
jksoft | 0:b5d91230ff3c | 273 | /* |
jksoft | 0:b5d91230ff3c | 274 | * Reset DONE and OVERRUN. |
jksoft | 0:b5d91230ff3c | 275 | * |
jksoft | 0:b5d91230ff3c | 276 | * bit 31 : DONE |
jksoft | 0:b5d91230ff3c | 277 | * bit 30 : OVERRUN |
jksoft | 0:b5d91230ff3c | 278 | */ |
jksoft | 0:b5d91230ff3c | 279 | _adc_data[get_channel(pin)] &= ~(((uint32_t)0x01 << 31) | ((uint32_t)0x01 << 30)); |
jksoft | 0:b5d91230ff3c | 280 | return (float)((get_data(pin) >> 4) & 0xFFF) / (float)0xFFF; |
jksoft | 0:b5d91230ff3c | 281 | } |
jksoft | 0:b5d91230ff3c | 282 | |
jksoft | 0:b5d91230ff3c | 283 | unsigned short HighSpeedAnalogIn::read_u16(PinName pin) { |
jksoft | 0:b5d91230ff3c | 284 | /* |
jksoft | 0:b5d91230ff3c | 285 | * Reset DONE and OVERRUN. |
jksoft | 0:b5d91230ff3c | 286 | * |
jksoft | 0:b5d91230ff3c | 287 | * bit 31 : DONE |
jksoft | 0:b5d91230ff3c | 288 | * bit 30 : OVERRUN |
jksoft | 0:b5d91230ff3c | 289 | */ |
jksoft | 0:b5d91230ff3c | 290 | _adc_data[get_channel(pin)] &= ~(((uint32_t)0x01 << 31) | ((uint32_t)0x01 << 30)); |
jksoft | 0:b5d91230ff3c | 291 | return ((get_data(pin) >> 4) & 0xFFF); |
jksoft | 0:b5d91230ff3c | 292 | } |