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.
Dependents: KL25Z_FFT_Demo test_armmath KL25Z_FFT_Demo_tony KL25Z_FFT_Demo_tony ... more
FastAnalogIn_KLXX_K20D50M.cpp
00001 #if defined(TARGET_KLXX) || defined(TARGET_K20D50M) 00002 00003 #include "FastAnalogIn.h" 00004 #include "clk_freqs.h" 00005 00006 #define MAX_FADC 6000000 00007 #define CHANNELS_A_SHIFT 5 00008 00009 #ifdef TARGET_K20D50M 00010 static const PinMap PinMap_ADC[] = { 00011 {PTC2, ADC0_SE4b, 0}, 00012 {PTD1, ADC0_SE5b, 0}, 00013 {PTD5, ADC0_SE6b, 0}, 00014 {PTD6, ADC0_SE7b, 0}, 00015 {PTB0, ADC0_SE8, 0}, 00016 {PTB1, ADC0_SE9, 0}, 00017 {PTB2, ADC0_SE12, 0}, 00018 {PTB3, ADC0_SE13, 0}, 00019 {PTC0, ADC0_SE14, 0}, 00020 {PTC1, ADC0_SE15, 0}, 00021 {NC, NC, 0} 00022 }; 00023 #endif 00024 00025 FastAnalogIn::FastAnalogIn(PinName pin, bool enabled) 00026 { 00027 ADCnumber = (ADCName)pinmap_peripheral(pin, PinMap_ADC); 00028 if (ADCnumber == (ADCName)NC) { 00029 error("ADC pin mapping failed"); 00030 } 00031 00032 SIM->SCGC6 |= SIM_SCGC6_ADC0_MASK; 00033 00034 uint32_t port = (uint32_t)pin >> PORT_SHIFT; 00035 SIM->SCGC5 |= 1 << (SIM_SCGC5_PORTA_SHIFT + port); 00036 00037 uint32_t cfg2_muxsel = ADC_CFG2_MUXSEL_MASK; 00038 if (ADCnumber & (1 << CHANNELS_A_SHIFT)) { 00039 cfg2_muxsel = 0; 00040 } 00041 00042 // bus clk 00043 uint32_t PCLK = bus_frequency(); 00044 uint32_t clkdiv; 00045 for (clkdiv = 0; clkdiv < 4; clkdiv++) { 00046 if ((PCLK >> clkdiv) <= MAX_FADC) 00047 break; 00048 } 00049 if (clkdiv == 4) //Set max div 00050 clkdiv = 0x7; 00051 00052 ADC0->SC1[1] = ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT)); 00053 00054 ADC0->CFG1 = ADC_CFG1_ADIV(clkdiv & 0x3) // Clock Divide Select: (Input Clock)/8 00055 | ADC_CFG1_MODE(3) // (16)bits Resolution 00056 | ADC_CFG1_ADICLK(clkdiv >> 2); // Input Clock: (Bus Clock)/2 00057 00058 ADC0->CFG2 = cfg2_muxsel // ADxxb or ADxxa channels 00059 | ADC_CFG2_ADACKEN_MASK // Asynchronous Clock Output Enable 00060 | ADC_CFG2_ADHSC_MASK; // High-Speed Configuration 00061 00062 ADC0->SC2 = ADC_SC2_REFSEL(0); // Default Voltage Reference 00063 00064 pinmap_pinout(pin, PinMap_ADC); 00065 00066 //Enable channel 00067 running = false; 00068 enable(enabled); 00069 } 00070 00071 void FastAnalogIn::enable(bool enabled) 00072 { 00073 //If currently not running 00074 if (!running) { 00075 if (enabled) { 00076 //Enable the ADC channel 00077 ADC0->SC3 |= ADC_SC3_ADCO_MASK; // Enable continuous conversion 00078 ADC0->SC1[0] = ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT)); //Start conversion 00079 running = true; 00080 } else 00081 disable(); 00082 } 00083 } 00084 00085 void FastAnalogIn::disable( void ) 00086 { 00087 //If currently running 00088 if (running) { 00089 ADC0->SC3 &= ~ADC_SC3_ADCO_MASK; // Disable continuous conversion 00090 } 00091 running = false; 00092 } 00093 00094 uint16_t FastAnalogIn::read_u16() 00095 { 00096 if (!running) 00097 { 00098 // start conversion 00099 ADC0->SC1[0] = ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT)); 00100 // Wait Conversion Complete 00101 while ((ADC0->SC1[0] & ADC_SC1_COCO_MASK) != ADC_SC1_COCO_MASK); 00102 } 00103 if(running && ((ADC0->SC1[0]&ADC_SC1_ADCH_MASK) != (ADC_SC1_ADCH(ADCnumber & ~(1 << CHANNELS_A_SHIFT))))) 00104 { 00105 running = false; 00106 enable(); 00107 while ((ADC0->SC1[0] & ADC_SC1_COCO_MASK) != ADC_SC1_COCO_MASK); 00108 } 00109 // Return value 00110 return (uint16_t)ADC0->R[0]; 00111 } 00112 00113 #endif //defined TARGET_KLXX 00114
Generated on Wed Jul 13 2022 22:48:29 by 1.7.2