ライントレーサPD制御 ロボット製作セミナー演習ex

Dependencies:   mbed

Committer:
jksoft
Date:
Sat Aug 10 04:13:15 2013 +0000
Revision:
0:b5d91230ff3c
Rev1

Who changed what in which revision?

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