K64F internal ADC channels: bandgap, VREF, temperature sensor derived from teensy 3.1 firmware analog.c

Dependencies:   mbed

K64F internal ADC channels: bandgap, VREF, temperature sensor derived from teensy 3.1 firmware analog.c

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;