ADC test for DiscoTech PCB

Dependencies:   Terminal adc mbed

Committer:
flash_ahaa
Date:
Wed Sep 25 09:16:47 2013 +0000
Revision:
0:5c21b4de143f
ADC test for DiscoTech PCB

Who changed what in which revision?

UserRevisionLine numberNew contents of line
flash_ahaa 0:5c21b4de143f 1 /* ADC Test
flash_ahaa 0:5c21b4de143f 2 *
flash_ahaa 0:5c21b4de143f 3 * Project: DiscoTech
flash_ahaa 0:5c21b4de143f 4 * HDK/ SDK Eng: Tobias Wulf
flash_ahaa 0:5c21b4de143f 5 * Date: 21.09.2013
flash_ahaa 0:5c21b4de143f 6 *
flash_ahaa 0:5c21b4de143f 7 */
flash_ahaa 0:5c21b4de143f 8
flash_ahaa 0:5c21b4de143f 9 #include "mbed.h"
flash_ahaa 0:5c21b4de143f 10 #include "Terminal.h"
flash_ahaa 0:5c21b4de143f 11
flash_ahaa 0:5c21b4de143f 12 #include "adc.h"
flash_ahaa 0:5c21b4de143f 13
flash_ahaa 0:5c21b4de143f 14
flash_ahaa 0:5c21b4de143f 15 #include "stdlib.h"
flash_ahaa 0:5c21b4de143f 16
flash_ahaa 0:5c21b4de143f 17 #define SAMPLE_RATE 48000 //Hz
flash_ahaa 0:5c21b4de143f 18 #define ADC_BIAS 1.65 //Volts
flash_ahaa 0:5c21b4de143f 19 #define ULSB 3.3 / 4095
flash_ahaa 0:5c21b4de143f 20 #define RESOLUTION 256
flash_ahaa 0:5c21b4de143f 21
flash_ahaa 0:5c21b4de143f 22 #define MASK 0x07 // for shift register
flash_ahaa 0:5c21b4de143f 23
flash_ahaa 0:5c21b4de143f 24 #define NUMBER_OF_SAMPLES 1024
flash_ahaa 0:5c21b4de143f 25
flash_ahaa 0:5c21b4de143f 26 /* declair your functions
flash_ahaa 0:5c21b4de143f 27 * isr routine doesn't have to be declaired
flash_ahaa 0:5c21b4de143f 28 */
flash_ahaa 0:5c21b4de143f 29 void mainInit();
flash_ahaa 0:5c21b4de143f 30
flash_ahaa 0:5c21b4de143f 31
flash_ahaa 0:5c21b4de143f 32 ADC adc(SAMPLE_RATE, 1);
flash_ahaa 0:5c21b4de143f 33
flash_ahaa 0:5c21b4de143f 34 /* Serial communication via usb uplink to pc
flash_ahaa 0:5c21b4de143f 35 * to display what ever you want in the terminal
flash_ahaa 0:5c21b4de143f 36 * or to send what ever you want from the terminal
flash_ahaa 0:5c21b4de143f 37 */
flash_ahaa 0:5c21b4de143f 38 Terminal usbPC(USBTX, USBRX);
flash_ahaa 0:5c21b4de143f 39
flash_ahaa 0:5c21b4de143f 40
flash_ahaa 0:5c21b4de143f 41 /* global variables to work in the adc interrupt
flash_ahaa 0:5c21b4de143f 42 * service routine to get the data from interrupt
flash_ahaa 0:5c21b4de143f 43 */
flash_ahaa 0:5c21b4de143f 44
flash_ahaa 0:5c21b4de143f 45 double newSample;
flash_ahaa 0:5c21b4de143f 46
flash_ahaa 0:5c21b4de143f 47 bool save;
flash_ahaa 0:5c21b4de143f 48
flash_ahaa 0:5c21b4de143f 49 double adcMin;
flash_ahaa 0:5c21b4de143f 50 double adcMax;
flash_ahaa 0:5c21b4de143f 51 double adcAverage;
flash_ahaa 0:5c21b4de143f 52 double adcSavings[NUMBER_OF_SAMPLES];
flash_ahaa 0:5c21b4de143f 53
flash_ahaa 0:5c21b4de143f 54 int main() {
flash_ahaa 0:5c21b4de143f 55
flash_ahaa 0:5c21b4de143f 56 usbPC.printf("...start program\n");
flash_ahaa 0:5c21b4de143f 57 wait(0.2);
flash_ahaa 0:5c21b4de143f 58
flash_ahaa 0:5c21b4de143f 59 mainInit();
flash_ahaa 0:5c21b4de143f 60 usbPC.printf("...init completed\n");
flash_ahaa 0:5c21b4de143f 61 wait(0.2);
flash_ahaa 0:5c21b4de143f 62
flash_ahaa 0:5c21b4de143f 63
flash_ahaa 0:5c21b4de143f 64 while(1) {
flash_ahaa 0:5c21b4de143f 65
flash_ahaa 0:5c21b4de143f 66 if(save == false) {
flash_ahaa 0:5c21b4de143f 67
flash_ahaa 0:5c21b4de143f 68 usbPC.locate(0,0);
flash_ahaa 0:5c21b4de143f 69 usbPC.cls();
flash_ahaa 0:5c21b4de143f 70 usbPC.printf("Max = %1.4f\tMin = %1.4f\nAverage = %1.4f\tact. Sample = %1.4f\n", adcMax, adcMin, adcAverage, newSample);
flash_ahaa 0:5c21b4de143f 71
flash_ahaa 0:5c21b4de143f 72 for(int i=0; i<NUMBER_OF_SAMPLES; i++)
flash_ahaa 0:5c21b4de143f 73 usbPC.printf("%1.4f\n",adcSavings[i]);
flash_ahaa 0:5c21b4de143f 74 }
flash_ahaa 0:5c21b4de143f 75
flash_ahaa 0:5c21b4de143f 76 if(save == false) break;
flash_ahaa 0:5c21b4de143f 77
flash_ahaa 0:5c21b4de143f 78 }
flash_ahaa 0:5c21b4de143f 79 }/* end main */
flash_ahaa 0:5c21b4de143f 80
flash_ahaa 0:5c21b4de143f 81
flash_ahaa 0:5c21b4de143f 82
flash_ahaa 0:5c21b4de143f 83
flash_ahaa 0:5c21b4de143f 84 /* interrupt service routine from adc object
flash_ahaa 0:5c21b4de143f 85 * here should be done the data processing
flash_ahaa 0:5c21b4de143f 86 * variable and output updates
flash_ahaa 0:5c21b4de143f 87 */
flash_ahaa 0:5c21b4de143f 88 void getADC(int chan, uint32_t value) {
flash_ahaa 0:5c21b4de143f 89 //static double adcMax_temp;
flash_ahaa 0:5c21b4de143f 90 //static double adcMin_temp; //volts max value value
flash_ahaa 0:5c21b4de143f 91 static double adcTotal = 0.0;
flash_ahaa 0:5c21b4de143f 92 static double adcSample;
flash_ahaa 0:5c21b4de143f 93 static long cycleCounter = 0;
flash_ahaa 0:5c21b4de143f 94
flash_ahaa 0:5c21b4de143f 95 adcSample = (double) adc.read(p15);
flash_ahaa 0:5c21b4de143f 96 adcSample = adcSample * ULSB; // - ADC_BIAS;
flash_ahaa 0:5c21b4de143f 97
flash_ahaa 0:5c21b4de143f 98 adcTotal += adcSample;
flash_ahaa 0:5c21b4de143f 99 cycleCounter++;
flash_ahaa 0:5c21b4de143f 100
flash_ahaa 0:5c21b4de143f 101 if (adcSample < adcMin)
flash_ahaa 0:5c21b4de143f 102 adcMin = adcSample;
flash_ahaa 0:5c21b4de143f 103
flash_ahaa 0:5c21b4de143f 104 if (adcSample > adcMax)
flash_ahaa 0:5c21b4de143f 105 adcMax = adcSample;
flash_ahaa 0:5c21b4de143f 106
flash_ahaa 0:5c21b4de143f 107
flash_ahaa 0:5c21b4de143f 108 if(cycleCounter < NUMBER_OF_SAMPLES) {
flash_ahaa 0:5c21b4de143f 109 adcSavings[cycleCounter] = adcSample;
flash_ahaa 0:5c21b4de143f 110 if((cycleCounter == NUMBER_OF_SAMPLES-1) && save) {
flash_ahaa 0:5c21b4de143f 111 save = false;
flash_ahaa 0:5c21b4de143f 112
flash_ahaa 0:5c21b4de143f 113 newSample = adcSample;
flash_ahaa 0:5c21b4de143f 114 //adcMax = adcMax_temp;
flash_ahaa 0:5c21b4de143f 115 adcAverage = (double)(adcTotal / cycleCounter);
flash_ahaa 0:5c21b4de143f 116 //adcMin = adcMin_temp;
flash_ahaa 0:5c21b4de143f 117 adcMax = 0.0;
flash_ahaa 0:5c21b4de143f 118 adcMin = 3.3;
flash_ahaa 0:5c21b4de143f 119 adcTotal = 0.0;
flash_ahaa 0:5c21b4de143f 120 cycleCounter = 0;
flash_ahaa 0:5c21b4de143f 121 }
flash_ahaa 0:5c21b4de143f 122 }
flash_ahaa 0:5c21b4de143f 123 }
flash_ahaa 0:5c21b4de143f 124
flash_ahaa 0:5c21b4de143f 125 /* function to initialize the main program, objects and
flash_ahaa 0:5c21b4de143f 126 * implement all variables
flash_ahaa 0:5c21b4de143f 127 */
flash_ahaa 0:5c21b4de143f 128 void mainInit() {
flash_ahaa 0:5c21b4de143f 129
flash_ahaa 0:5c21b4de143f 130 save = true;
flash_ahaa 0:5c21b4de143f 131
flash_ahaa 0:5c21b4de143f 132 adcMin = 3.3;
flash_ahaa 0:5c21b4de143f 133 adcMax = 0.0;
flash_ahaa 0:5c21b4de143f 134 adcAverage = 0.0;
flash_ahaa 0:5c21b4de143f 135
flash_ahaa 0:5c21b4de143f 136 for (int i = 0; i < NUMBER_OF_SAMPLES; i++)
flash_ahaa 0:5c21b4de143f 137 adcSavings[i] = 0.0f;
flash_ahaa 0:5c21b4de143f 138
flash_ahaa 0:5c21b4de143f 139
flash_ahaa 0:5c21b4de143f 140
flash_ahaa 0:5c21b4de143f 141 usbPC.printf("...variables implemented\n");
flash_ahaa 0:5c21b4de143f 142 wait(0.2);
flash_ahaa 0:5c21b4de143f 143
flash_ahaa 0:5c21b4de143f 144
flash_ahaa 0:5c21b4de143f 145 /* setup adc input
flash_ahaa 0:5c21b4de143f 146 */
flash_ahaa 0:5c21b4de143f 147 adc.append(&getADC);
flash_ahaa 0:5c21b4de143f 148
flash_ahaa 0:5c21b4de143f 149 adc.startmode(0,0);
flash_ahaa 0:5c21b4de143f 150 adc.burst(1);
flash_ahaa 0:5c21b4de143f 151
flash_ahaa 0:5c21b4de143f 152 adc.setup(p15,1);
flash_ahaa 0:5c21b4de143f 153 adc.setup(p16,0);
flash_ahaa 0:5c21b4de143f 154 adc.setup(p17,0);
flash_ahaa 0:5c21b4de143f 155 adc.setup(p18,0);
flash_ahaa 0:5c21b4de143f 156 adc.setup(p19,0);
flash_ahaa 0:5c21b4de143f 157 adc.setup(p20,0);
flash_ahaa 0:5c21b4de143f 158
flash_ahaa 0:5c21b4de143f 159 adc.interrupt_state(p15,1);
flash_ahaa 0:5c21b4de143f 160
flash_ahaa 0:5c21b4de143f 161
flash_ahaa 0:5c21b4de143f 162 usbPC.printf("%u, %u, %u, %u\n", adc.setup(p15),
flash_ahaa 0:5c21b4de143f 163 adc.burst(),
flash_ahaa 0:5c21b4de143f 164 adc.interrupt_state(p15),
flash_ahaa 0:5c21b4de143f 165 adc.actual_sample_rate());
flash_ahaa 0:5c21b4de143f 166
flash_ahaa 0:5c21b4de143f 167 usbPC.printf("...ADC initialized\n");
flash_ahaa 0:5c21b4de143f 168 wait(0.2);
flash_ahaa 0:5c21b4de143f 169
flash_ahaa 0:5c21b4de143f 170
flash_ahaa 0:5c21b4de143f 171 }