ADC Spike2

Dependencies:   mbed

Committer:
simonb
Date:
Tue Mar 09 15:58:33 2010 +0000
Revision:
0:db49fab3bd78
Child:
1:0d866e3f26ab

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simonb 0:db49fab3bd78 1
simonb 0:db49fab3bd78 2 #define SAMPLE_RATE 150000
simonb 0:db49fab3bd78 3
simonb 0:db49fab3bd78 4 #include "mbed.h"
simonb 0:db49fab3bd78 5 #include "adc.h"
simonb 0:db49fab3bd78 6
simonb 0:db49fab3bd78 7 //Initialise ADC to maximum SAMPLE_RATE and cclk divide set to 1
simonb 0:db49fab3bd78 8 ADC adc(SAMPLE_RATE, 1);
simonb 0:db49fab3bd78 9
simonb 0:db49fab3bd78 10 uint32_t adc_max[6], adc_av[6], adc_min[6];
simonb 0:db49fab3bd78 11 int snap = 0;
simonb 0:db49fab3bd78 12
simonb 0:db49fab3bd78 13 void min_max_av(int chan, uint32_t value) {
simonb 0:db49fab3bd78 14 static uint64_t adc_tot[6], counter = 0;
simonb 0:db49fab3bd78 15 uint32_t adc_max_tmp[6], adc_av_tmp[6], adc_min_tmp[6];
simonb 0:db49fab3bd78 16
simonb 0:db49fab3bd78 17
simonb 0:db49fab3bd78 18 int i, adc_value;
simonb 0:db49fab3bd78 19
simonb 0:db49fab3bd78 20 for (i=0; i<6; i++) {
simonb 0:db49fab3bd78 21 adc_value = adc.read(adc.channel_to_pin(i));
simonb 0:db49fab3bd78 22 //Update min, max and average records and totals
simonb 0:db49fab3bd78 23 if (adc_value > adc_max_tmp[i]) adc_max_tmp[i] = adc_value;
simonb 0:db49fab3bd78 24 if (adc_value < adc_min_tmp[i]) adc_min_tmp[i] = adc_value;
simonb 0:db49fab3bd78 25 adc_tot[i] += adc_value;
simonb 0:db49fab3bd78 26 counter++;
simonb 0:db49fab3bd78 27 //If snapshot requested then sample data and reset average
simonb 0:db49fab3bd78 28 if (snap) {
simonb 0:db49fab3bd78 29 adc_av[i] = (int)(adc_tot[i] / counter);
simonb 0:db49fab3bd78 30 adc_max[i] = adc_max_tmp[i];
simonb 0:db49fab3bd78 31 adc_av[i] = adc_av_tmp[i];
simonb 0:db49fab3bd78 32 adc_min[i] = adc_min_tmp[i];
simonb 0:db49fab3bd78 33 adc_max_tmp[i] = 0;
simonb 0:db49fab3bd78 34 adc_min_tmp[i] = 0xFFFF;
simonb 0:db49fab3bd78 35 adc_av_tmp[i] = 0;
simonb 0:db49fab3bd78 36 }
simonb 0:db49fab3bd78 37 }
simonb 0:db49fab3bd78 38 if (snap) counter = 0;
simonb 0:db49fab3bd78 39 snap = 0;
simonb 0:db49fab3bd78 40 }
simonb 0:db49fab3bd78 41
simonb 0:db49fab3bd78 42 //Show a bargraph of ADC value
simonb 0:db49fab3bd78 43 void bar(int value) {
simonb 0:db49fab3bd78 44 int i, j;
simonb 0:db49fab3bd78 45
simonb 0:db49fab3bd78 46 j = (value * 50) / 4096;
simonb 0:db49fab3bd78 47
simonb 0:db49fab3bd78 48 if (j > 50) j = 50;
simonb 0:db49fab3bd78 49 if (j < 0) j = 0;
simonb 0:db49fab3bd78 50
simonb 0:db49fab3bd78 51 for (i = 0; i < j; i++)
simonb 0:db49fab3bd78 52 printf("=");
simonb 0:db49fab3bd78 53 printf("\n");
simonb 0:db49fab3bd78 54 }
simonb 0:db49fab3bd78 55
simonb 0:db49fab3bd78 56 int main() {
simonb 0:db49fab3bd78 57 int i;
simonb 0:db49fab3bd78 58
simonb 0:db49fab3bd78 59 printf("\nRequested max sample rate is %u, actual max sample rate is %u.\n",
simonb 0:db49fab3bd78 60 SAMPLE_RATE, adc.actual_sample_rate());
simonb 0:db49fab3bd78 61 adc.append(min_max_av);
simonb 0:db49fab3bd78 62
simonb 0:db49fab3bd78 63 //Prepare for burst mode on all ADC pins
simonb 0:db49fab3bd78 64 adc.startmode(0,0);
simonb 0:db49fab3bd78 65 adc.burst(1);
simonb 0:db49fab3bd78 66 adc.setup(p20,1);
simonb 0:db49fab3bd78 67 adc.setup(p19,1);
simonb 0:db49fab3bd78 68 adc.setup(p18,1);
simonb 0:db49fab3bd78 69 adc.setup(p17,1);
simonb 0:db49fab3bd78 70 adc.setup(p16,1);
simonb 0:db49fab3bd78 71 adc.setup(p15,1);
simonb 0:db49fab3bd78 72 //For burst mode, only one interrupt is required
simonb 0:db49fab3bd78 73 //which can be on any enabled pin. We have enabled all
simonb 0:db49fab3bd78 74 //of them here.
simonb 0:db49fab3bd78 75 adc.interrupt_state(p15,1);
simonb 0:db49fab3bd78 76
simonb 0:db49fab3bd78 77 printf("Burst mode, printing once per second...\n");
simonb 0:db49fab3bd78 78 while (1) {
simonb 0:db49fab3bd78 79 snap = 1;
simonb 0:db49fab3bd78 80 wait(0.5);
simonb 0:db49fab3bd78 81 for (i=0; i<6; i++) {
simonb 0:db49fab3bd78 82 printf ("CH %u Min :", i);
simonb 0:db49fab3bd78 83 bar(adc_min[i]);
simonb 0:db49fab3bd78 84 printf ("CH %u Av :", i);
simonb 0:db49fab3bd78 85 bar(adc_av[i]);
simonb 0:db49fab3bd78 86 printf ("CH %u Max :", i);
simonb 0:db49fab3bd78 87 bar(adc_max[i]);
simonb 0:db49fab3bd78 88 printf("\n");
simonb 0:db49fab3bd78 89 }
simonb 0:db49fab3bd78 90 printf("......................................................\n");
simonb 0:db49fab3bd78 91 wait(0.5);
simonb 0:db49fab3bd78 92 }
simonb 0:db49fab3bd78 93 }