K64F internal ADC channels: bandgap, VREF, temperature sensor derived from teensy 3.1 firmware analog.c
K64F internal ADC channels: bandgap, VREF, temperature sensor derived from teensy 3.1 firmware analog.c
Diff: main.cpp
- Revision:
- 1:9a99de9cc5d5
- Parent:
- 0:e1a2b02c8441
- Child:
- 2:71d82e4b3777
--- a/main.cpp Wed Nov 18 18:16:43 2015 +0000 +++ b/main.cpp Thu Nov 19 12:13:06 2015 +0000 @@ -2,6 +2,7 @@ // temp sensor ADC0 26 slope 1.62mv/C 716mv @25C // bandgap ADC0 27 1.0v // VREFout ADC1 18 1.195v +// DAC0 ADC1 23 // ADC1 SIM_SCGC3 ADC0 SIM_SCGC6 // A0 PTB2 ADC0 channel 12 #include "mbed.h" @@ -19,7 +20,7 @@ #define ADC_CFG1_8BIT BF_ADC_CFG1_ADIV(1) + BF_ADC_CFG1_ADICLK(1) // 15 MHz static uint8_t analog_config_bits = 12; // 8 10 12 16 bit ADC -static uint8_t analog_num_average = 4; +static uint8_t analog_num_average = 4; // 0 4 8 16 32 static uint8_t analog_reference_internal = 0; static void adc_init() { @@ -28,6 +29,8 @@ VREF_TRM = 0x60; VREF_SC = 0xE1; // enable 1.2 volt ref PMC_REGSC |= PMC_REGSC_BGBE_MASK; // enable bandgap + + // would need to do GPIO init for external pins if (analog_config_bits == 8) { ADC0_CFG1 = ADC_CFG1_8BIT + BF_ADC_CFG1_MODE(0); @@ -60,8 +63,22 @@ } // calibrate ADCs t=tmr.read_us(); - ADC0_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(0); // average 4 - ADC1_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(0); + if (analog_num_average <=1) { + ADC0_SC3 = ADC_SC3_CAL_MASK; // no averaging + ADC1_SC3 = ADC_SC3_CAL_MASK; + } else if (analog_num_average <=4) { + ADC0_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(0); // average 4 + ADC1_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(0); + } else if (analog_num_average <=8) { + ADC0_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(1); + ADC1_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(1); + } else if (analog_num_average <=16) { + ADC0_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(2); + ADC1_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(2); + } else { + ADC0_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(3); + ADC1_SC3 = ADC_SC3_CAL_MASK + ADC_SC3_AVGE_MASK + BF_ADC_SC3_AVGS(3); + } uint16_t sum; while ((ADC0_SC3 & ADC_SC3_CAL_MASK) || (ADC1_SC3 & ADC_SC3_CAL_MASK)) ; // wait @@ -100,7 +117,7 @@ printf("\nSystemCoreClock %d %s %s\n",SystemCoreClock,__TIME__,__DATE__); tmr.start(); adc_init(); - printf("calibration %d us\n",t); + PRREG(SIM_SCGC6); PRREG(SIM_SCGC3); PRREG(VREF->TRM); @@ -112,6 +129,7 @@ PRREG(ADC0_CFG2); PRREG(ADC0->SC2); PRREG(ADC0->SC3); + printf("res %d average %d calibration %d us\n",analog_config_bits,analog_num_average,t); val = adc_read(ADC1,18); // VREF OUT Vcc = ADCmax*1.195/val; printf("VREF val %d %.2f v\n",val,Vcc); @@ -121,7 +139,7 @@ val = adc_read(ADC0,27); // bandgap Vcc = ADCmax*1.0/val; printf("bandgap val %d %.2f v\n",val,Vcc); - printf("A0 val %d\n",adc_read(ADC0,12)); + printf("A0 val %d\n",adc_read(ADC0,12)); // didn't do GPIO init for A0 t=tmr.read_us(); for(i=0;i<1000;i++) adc_read(ADC0,12); t=tmr.read_us()-t;