Contiki 3.x
adc.c
1 /* Copyright Robert Olsson */
2 
3 #include <avr/pgmspace.h>
4 #include <avr/fuse.h>
5 #include <avr/eeprom.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <dev/watchdog.h>
9 #include "params.h"
10 #include "rss2.h"
11 #include "contiki.h"
12 #include "adc.h"
13 #include "rss2.h"
14 
15 uint16_t
16 adc_read(uint8_t pin)
17 {
18  uint16_t volt = 0;
19  int i;
20 
21  ADMUX = pin; /* ADC pin PA0-PA7 -> 0-7 */
22  ADCSRB &= ~(1 << MUX5); /* Needs to write before ADMUX pp 418 */
23  ADMUX |= (1 << REFS1) | (1 << REFS0); /* 1.6 */
24 
25  /* Maximal Track and Hold time */
26 
27  ADCSRA = (1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0); /* Prescaler /32 */
28  ADCSRA |= (1 << ADEN); /* Enable the ADC */
29 
30  while(!(ADCSRB & (1 << AVDDOK))) ; /* Wait for AVDD ok */
31  while(!(ADCSRB & (1 << REFOK))) ; /* Wait for ref ok */
32 
33  /* Ignore first result */
34 
35  ADCSRA |= (1 << ADSC);
36  while(ADCSRA & _BV(ADSC)) {
37  }
38 
39  ADCW = 0;
40 #define RES 4
41 
42  for(i = 0; i < RES; i++) {
43 
44  /* Start the conversion */
45  ADCSRA |= (1 << ADSC);
46 
47  /* Wait for conversion */
48  while(ADCSRA & (1 << ADSC)) {
49  }
50 
51  volt += ADCW;
52  }
53  ADMUX = 0; /* turn off internal vref */
54  volt = volt / RES;
55 
56  /* Disable the ADC to save power */
57  ADCSRA &= ~_BV(ADEN);
58 
59  return volt;
60 }
61 double
62 adc_read_v_in(void)
63 {
64  /* Special treatment for v_in. Schottky voltage drop add */
65  return ((double)adc_read(AV_IN)) * V_IN_FACTOR_SCHOTTKY + SCHOTTKY_DROP;
66 }
67 double
68 adc_read_a1(void)
69 {
70  return ((double)adc_read(A1)) * V_IN_FACTOR;
71 }
72 double
73 adc_read_a2(void)
74 {
75  return ((double)adc_read(A2)) * V_IN_FACTOR;
76 }