Jared Baxter
/
Impedance_Fast_Circuitry
Fork of DSP_200kHz by
adc.cpp
- Committer:
- timmey9
- Date:
- 2015-01-29
- Revision:
- 39:82dc3daecf32
- Child:
- 40:bd6d8c35e822
File content as of revision 39:82dc3daecf32:
#include "adc.h" void analog_initialization(PinName pin, Serial &pc) { // Turn on the ADC0 and ADC1 clocks SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK; SIM_SCGC3 |= SIM_SCGC3_ADC1_MASK; ADC0->CFG1 |= ADC_CFG1_ADLPC_MASK; // high power mode for faster frequencies // Configure System Integration Module for defaults as far as ADC SIM_SOPT7 &= ~(SIM_SOPT7_ADC1ALTTRGEN_MASK | // selects PDB not ALT trigger SIM_SOPT7_ADC1PRETRGSEL_MASK | SIM_SOPT7_ADC0ALTTRGEN_MASK | // selects PDB not ALT trigger SIM_SOPT7_ADC0ALTTRGEN_MASK) ; SIM_SOPT7 = SIM_SOPT7_ADC0TRGSEL(0); // applies only in case of ALT trigger, in which case PDB external pin input trigger for ADC SIM_SOPT7 = SIM_SOPT7_ADC1TRGSEL(0); // same for both ADCs // enable the DMA ADC0->SC2 |= ADC_SC2_DMAEN_MASK; //ADC1->SC2 |= ADC_SC2_DMAEN_MASK; // calibrate ADC ADC0->SC3 = 0; // Reset SC3 //ADC1->SC3 = 0; // Reset SC3 /*do { ADC0->SC3 |= (1<<7); // start calibration while(ADC0->SC3&(1<<7)) {} // wait for calibration to complete if((ADC0->SC3)&(1<<6)) pc.printf("Calibration Failed\r\n"); } while(ADC0->SC3&(1<<6)); */ // the calibration may be failing because ADC0_SC2 has the Vref set to external pins ADC0->CFG1 |= ADC_CFG1_ADLPC_MASK; // high power mode for faster frequencies ADCName adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC); // MBED_ASSERT(adc != (ADCName)NC); uint32_t instance = adc >> ADC_INSTANCE_SHIFT; clock_manager_set_gate(kClockModuleADC, instance, true); uint32_t bus_clock; clock_manager_get_frequency(kBusClock, &bus_clock); uint32_t clkdiv; for (clkdiv = 0; clkdiv < 4; clkdiv++) { if ((bus_clock >> clkdiv) <= MAX_FADC) break; } if (clkdiv == 4) { clkdiv = 0x7; //Set max div } // adc is enabled/triggered when reading. adc_hal_set_clock_source_mode(instance, (adc_clock_source_mode_t)(clkdiv >> 2)); adc_hal_set_clock_divider_mode(instance, (adc_clock_divider_mode_t)(clkdiv & 0x3)); adc_hal_set_reference_voltage_mode(instance, kAdcVoltageVref); adc_hal_set_resolution_mode(instance, kAdcSingleDiff16); adc_hal_configure_continuous_conversion(instance, false); // true=continuous conversion mode, false = single conversion mode adc_hal_configure_hw_trigger(instance, true); // true=hw trigger, false=sw trigger adc_hal_configure_hw_average(instance, false); adc_hal_set_hw_average_mode(instance, kAdcHwAverageCount4); adc_hal_set_group_mux(instance, kAdcChannelMuxB); // only B channels are avail pinmap_pinout(pin, PinMap_ADC); pc.printf("ADC0_SC1a: %08x\r\n",ADC0_SC1A); // module disabled pc.printf("ADC0_SC1b: %08x\r\n",ADC0_SC1B); // module disabled pc.printf("ADC0_CFG1: %08x\r\n",ADC0_CFG1); // alternate clock2 selected, 16-bit 2's complement selected, short sample time, clock divide ration is input/8, low power mode selected pc.printf("ADC0_CFG2: %08x\r\n",ADC0_CFG2); // ADxxa channels selected pc.printf("ADC0_RA: %08x\r\n",ADC0_RA); pc.printf("ADC0_RB: %08x\r\n",ADC0_RB); pc.printf("ADC0_SC2: %08x\r\n",ADC0_SC2); // hw trigger and dma enabled. Compare function disabled and Vref set to external pin pc.printf("ADC0_SC3: %08x\r\n\n",ADC0_SC3); }