
ADC Spike2
Diff: main.cpp
- Revision:
- 0:db49fab3bd78
- Child:
- 1:0d866e3f26ab
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 09 15:58:33 2010 +0000 @@ -0,0 +1,93 @@ + +#define SAMPLE_RATE 150000 + +#include "mbed.h" +#include "adc.h" + +//Initialise ADC to maximum SAMPLE_RATE and cclk divide set to 1 +ADC adc(SAMPLE_RATE, 1); + +uint32_t adc_max[6], adc_av[6], adc_min[6]; +int snap = 0; + +void min_max_av(int chan, uint32_t value) { + static uint64_t adc_tot[6], counter = 0; + uint32_t adc_max_tmp[6], adc_av_tmp[6], adc_min_tmp[6]; + + + int i, adc_value; + + for (i=0; i<6; i++) { + adc_value = adc.read(adc.channel_to_pin(i)); + //Update min, max and average records and totals + if (adc_value > adc_max_tmp[i]) adc_max_tmp[i] = adc_value; + if (adc_value < adc_min_tmp[i]) adc_min_tmp[i] = adc_value; + adc_tot[i] += adc_value; + counter++; + //If snapshot requested then sample data and reset average + if (snap) { + adc_av[i] = (int)(adc_tot[i] / counter); + adc_max[i] = adc_max_tmp[i]; + adc_av[i] = adc_av_tmp[i]; + adc_min[i] = adc_min_tmp[i]; + adc_max_tmp[i] = 0; + adc_min_tmp[i] = 0xFFFF; + adc_av_tmp[i] = 0; + } + } + if (snap) counter = 0; + snap = 0; +} + +//Show a bargraph of ADC value +void bar(int value) { + int i, j; + + j = (value * 50) / 4096; + + if (j > 50) j = 50; + if (j < 0) j = 0; + + for (i = 0; i < j; i++) + printf("="); + printf("\n"); +} + +int main() { + int i; + + printf("\nRequested max sample rate is %u, actual max sample rate is %u.\n", + SAMPLE_RATE, adc.actual_sample_rate()); + adc.append(min_max_av); + + //Prepare for burst mode on all ADC pins + adc.startmode(0,0); + adc.burst(1); + adc.setup(p20,1); + adc.setup(p19,1); + adc.setup(p18,1); + adc.setup(p17,1); + adc.setup(p16,1); + adc.setup(p15,1); + //For burst mode, only one interrupt is required + //which can be on any enabled pin. We have enabled all + //of them here. + adc.interrupt_state(p15,1); + + printf("Burst mode, printing once per second...\n"); + while (1) { + snap = 1; + wait(0.5); + for (i=0; i<6; i++) { + printf ("CH %u Min :", i); + bar(adc_min[i]); + printf ("CH %u Av :", i); + bar(adc_av[i]); + printf ("CH %u Max :", i); + bar(adc_max[i]); + printf("\n"); + } + printf("......................................................\n"); + wait(0.5); + } +}