Automatic commit at Wed Jul 25 15:50:05 WST 2012
[matches/honours.git] / research / TCS / apparatus / source_code / adc.c
1 /*\r
2  * @file adc.c\r
3  * @author Sam Moore - adapted from ATMEL AVR Butterfly ADC example\r
4  * @purpose Analogue to Digital Conversion\r
5  */\r
6 \r
7 #include "main.h"\r
8 #include "adc.h"\r
9 #include "setup.h"\r
10 #include "LCD_functions.h"\r
11 #include "timer.h"\r
12 \r
13 /*****************************************************************************\r
14 *\r
15 *   Function name : ADC_read\r
16 *\r
17 *   Returns :       int ADC\r
18 *\r
19 *   Parameters :    None\r
20 *\r
21 *   Purpose :       Do a Analog to Digital Conversion\r
22 *\r
23 *****************************************************************************/\r
24 float ADC_read(uint8 input)\r
25 {\r
26         \r
27         ADMUX = input;\r
28         if (input == 1)\r
29         {\r
30                 ADMUX |= (1<<REFS0) | (1<<REFS1);\r
31                 while (SCK_ON);\r
32                 while (SCK_OFF);\r
33         }\r
34         else\r
35         {\r
36                 ADMUX |= (1<<REFS0);\r
37                 ADMUX &= ~(1<<REFS1);\r
38         }\r
39         \r
40     uint i;\r
41     float ADC_temp;\r
42         float mean = 0;\r
43         float delta = 0;\r
44         float M2 = 0;\r
45  //   uint32 ADCr = 0;\r
46         \r
47 \r
48     ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); \r
49 \r
50     //do a dummy readout first\r
51     ADCSRA |= (1<<ADSC);        // do single conversion\r
52     while(!(ADCSRA & 0x10));    // wait for conversion done, ADIF flag active\r
53         \r
54     for(i=0;i<setup.adc_averages;i++)            // do several ADC conversions, for averaging\r
55     {\r
56         ADCSRA |= (1<<ADSC);        // do single conversion\r
57         while(!(ADCSRA & 0x10));    // wait for conversion done, ADIF flag active\r
58         \r
59         ADC_temp = ADCL;            // read out ADCL register\r
60         ADC_temp += (ADCH << 8);    // read out ADCH register        \r
61 \r
62         delta = ADC_temp - mean;\r
63         mean = mean + delta/(i+1);\r
64         M2 = M2 + delta*(ADC_temp - mean);\r
65 \r
66        // ADCr += ADC_temp;      // accumulate result\r
67     }\r
68    // ADCr = ADCr / setup.adc_averages;     // average the samples\r
69         \r
70 \r
71             \r
72     ADCSRA &= ~(1<<ADEN);      // disable the ADC\r
73 \r
74         setup.adc_values[input] = mean;\r
75         if (M2 < 0)\r
76                 M2 = -M2;\r
77         setup.adc_variance[input] = M2/setup.adc_averages;\r
78 //\r
79         return (setup.adc_values[input]);\r
80 }\r

UCC git Repository :: git.ucc.asn.au