Class similar to AnalogIn that uses burst mode to run continious background conversions so when the input is read, the last value can immediatly be returned.

Fork of FastAnalogIn by Erik -

Obsolete!

Has been already merged with Erik's original repository => take the original!

  • Added support for LPC4088.
  • Fixed linker error (missing definition of static member "channel_usage")
Committer:
frankvnk
Date:
Sat Mar 08 16:01:36 2014 +0000
Revision:
3:a9b753c25073
Parent:
2:9b61d0792927
Child:
5:55274430c8df
Doxygen correction and removed obsolete code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 2:9b61d0792927 1 #ifdef TARGET_KLXX
frankvnk 2:9b61d0792927 2
frankvnk 2:9b61d0792927 3 #include "FastAnalogIn.h"
frankvnk 2:9b61d0792927 4 #include "clk_freqs.h"
frankvnk 2:9b61d0792927 5
frankvnk 2:9b61d0792927 6 #define MAX_FADC 6000000
frankvnk 2:9b61d0792927 7 #define CHANNELS_A_SHIFT 5
frankvnk 2:9b61d0792927 8
frankvnk 2:9b61d0792927 9 FastAnalogIn::FastAnalogIn(PinName pin, bool enabled)
frankvnk 2:9b61d0792927 10 {
frankvnk 2:9b61d0792927 11 ADCnumber = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
frankvnk 2:9b61d0792927 12 if (ADCnumber == (ADCName)NC) {
frankvnk 2:9b61d0792927 13 error("ADC pin mapping failed");
frankvnk 2:9b61d0792927 14 }
frankvnk 2:9b61d0792927 15
frankvnk 2:9b61d0792927 16 SIM->SCGC6 |= SIM_SCGC6_ADC0_MASK;
frankvnk 2:9b61d0792927 17
frankvnk 2:9b61d0792927 18 uint32_t port = (uint32_t)pin >> PORT_SHIFT;
frankvnk 2:9b61d0792927 19 SIM->SCGC5 |= 1 << (SIM_SCGC5_PORTA_SHIFT + port);
frankvnk 2:9b61d0792927 20
frankvnk 2:9b61d0792927 21 uint32_t cfg2_muxsel = ADC_CFG2_MUXSEL_MASK;
frankvnk 2:9b61d0792927 22 if (ADCnumber & (1 << CHANNELS_A_SHIFT)) {
frankvnk 2:9b61d0792927 23 cfg2_muxsel = 0;
frankvnk 2:9b61d0792927 24 }
frankvnk 2:9b61d0792927 25
frankvnk 2:9b61d0792927 26 // bus clk
frankvnk 2:9b61d0792927 27 uint32_t PCLK = bus_frequency();
frankvnk 2:9b61d0792927 28 uint32_t clkdiv;
frankvnk 2:9b61d0792927 29 for (clkdiv = 0; clkdiv < 4; clkdiv++) {
frankvnk 2:9b61d0792927 30 if ((PCLK >> clkdiv) <= MAX_FADC)
frankvnk 2:9b61d0792927 31 break;
frankvnk 2:9b61d0792927 32 }
frankvnk 2:9b61d0792927 33 if (clkdiv == 4) //Set max div
frankvnk 2:9b61d0792927 34 clkdiv = 0x7;
frankvnk 2:9b61d0792927 35
frankvnk 2:9b61d0792927 36 ADC0->SC1[1] = ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT));
frankvnk 2:9b61d0792927 37
frankvnk 2:9b61d0792927 38 ADC0->CFG1 = ADC_CFG1_ADIV(clkdiv & 0x3) // Clock Divide Select: (Input Clock)/8
frankvnk 2:9b61d0792927 39 | ADC_CFG1_MODE(3) // (16)bits Resolution
frankvnk 2:9b61d0792927 40 | ADC_CFG1_ADICLK(clkdiv >> 2); // Input Clock: (Bus Clock)/2
frankvnk 2:9b61d0792927 41
frankvnk 2:9b61d0792927 42 ADC0->CFG2 = cfg2_muxsel // ADxxb or ADxxa channels
frankvnk 2:9b61d0792927 43 | ADC_CFG2_ADACKEN_MASK // Asynchronous Clock Output Enable
frankvnk 2:9b61d0792927 44 | ADC_CFG2_ADHSC_MASK; // High-Speed Configuration
frankvnk 2:9b61d0792927 45
frankvnk 2:9b61d0792927 46 ADC0->SC2 = ADC_SC2_REFSEL(0); // Default Voltage Reference
frankvnk 2:9b61d0792927 47
frankvnk 2:9b61d0792927 48 pinmap_pinout(pin, PinMap_ADC);
frankvnk 2:9b61d0792927 49
frankvnk 2:9b61d0792927 50 //Enable channel
frankvnk 2:9b61d0792927 51 running = false;
frankvnk 2:9b61d0792927 52 enable(enabled);
frankvnk 2:9b61d0792927 53 }
frankvnk 2:9b61d0792927 54
frankvnk 2:9b61d0792927 55 void FastAnalogIn::enable(bool enabled)
frankvnk 2:9b61d0792927 56 {
frankvnk 2:9b61d0792927 57 //If currently not running
frankvnk 2:9b61d0792927 58 if (!running) {
frankvnk 2:9b61d0792927 59 if (enabled) {
frankvnk 2:9b61d0792927 60 //Enable the ADC channel
frankvnk 2:9b61d0792927 61 ADC0->SC3 |= ADC_SC3_ADCO_MASK; // Enable continuous conversion
frankvnk 2:9b61d0792927 62 ADC0->SC1[0] = ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT)); //Start conversion
frankvnk 2:9b61d0792927 63 running = true;
frankvnk 2:9b61d0792927 64 } else
frankvnk 2:9b61d0792927 65 disable();
frankvnk 2:9b61d0792927 66 }
frankvnk 2:9b61d0792927 67 }
frankvnk 2:9b61d0792927 68
frankvnk 2:9b61d0792927 69 void FastAnalogIn::disable( void )
frankvnk 2:9b61d0792927 70 {
frankvnk 2:9b61d0792927 71 //If currently running
frankvnk 2:9b61d0792927 72 if (running) {
frankvnk 2:9b61d0792927 73 ADC0->SC3 &= ~ADC_SC3_ADCO_MASK; // Disable continuous conversion
frankvnk 2:9b61d0792927 74 }
frankvnk 2:9b61d0792927 75 running = false;
frankvnk 2:9b61d0792927 76 }
frankvnk 2:9b61d0792927 77
frankvnk 2:9b61d0792927 78 uint16_t FastAnalogIn::read_u16()
frankvnk 2:9b61d0792927 79 {
frankvnk 2:9b61d0792927 80 if (!running)
frankvnk 2:9b61d0792927 81 {
frankvnk 2:9b61d0792927 82 // start conversion
frankvnk 2:9b61d0792927 83 ADC0->SC1[0] = ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT));
frankvnk 2:9b61d0792927 84 // Wait Conversion Complete
frankvnk 2:9b61d0792927 85 while ((ADC0->SC1[0] & ADC_SC1_COCO_MASK) != ADC_SC1_COCO_MASK);
frankvnk 2:9b61d0792927 86 }
frankvnk 2:9b61d0792927 87 if(running && ((ADC0->SC1[0]&ADC_SC1_ADCH_MASK) != (ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT)))))
frankvnk 2:9b61d0792927 88 {
frankvnk 2:9b61d0792927 89 running = false;
frankvnk 2:9b61d0792927 90 enable();
frankvnk 2:9b61d0792927 91 while ((ADC0->SC1[0] & ADC_SC1_COCO_MASK) != ADC_SC1_COCO_MASK);
frankvnk 2:9b61d0792927 92 }
frankvnk 2:9b61d0792927 93 // Return value
frankvnk 2:9b61d0792927 94 return (uint16_t)ADC0->R[0];
frankvnk 2:9b61d0792927 95 }
frankvnk 2:9b61d0792927 96
frankvnk 2:9b61d0792927 97 #endif //defined TARGET_KLXX
frankvnk 2:9b61d0792927 98