1 | #ifndef __AD7719_ADC_H
|
---|
2 | #define __AD7719_ADC_H
|
---|
3 | //-----------------------------------------------------------------------------
|
---|
4 |
|
---|
5 | #include "typedefs.h"
|
---|
6 | #include "application.h"
|
---|
7 | #include "num_conversion.h"
|
---|
8 | //-----------------------------------------------------------------------------
|
---|
9 | // SPI INTERFACE of AD7719
|
---|
10 | // SCLK:
|
---|
11 | // SCLK HIGH & LOW cycle min 100ns --> 5MHz maximum SCLK frequency
|
---|
12 | // FSC runs at 8MHz CPU clock ... so 4MHz SPI clock is the theoretocal maximum anyway.
|
---|
13 | // SCLK should idle high --> mode 3
|
---|
14 | //
|
---|
15 | // CS falling edge & SCLK falling edge, may be at the same time ...
|
---|
16 | //
|
---|
17 |
|
---|
18 | // There is a delay in all communications between AD7719 and ATmega.
|
---|
19 | // I guess this is not needed at all.
|
---|
20 | // This switch is able to get them in again
|
---|
21 | #define AD7719_COM_DELAY_NEEDED
|
---|
22 |
|
---|
23 | // Bit Definitions
|
---|
24 | #define ADC_RDY PD6
|
---|
25 | #define ADC_RST PD7
|
---|
26 | #define AD7719_IS_READY() (!(PIND & (1<<PD6))) // TRUE if PD6=0 AD_RDY is inverted logic.
|
---|
27 |
|
---|
28 | // Port Definitions
|
---|
29 | #define ADC_PRT PORTD
|
---|
30 | #define ADC_DDR DDRD
|
---|
31 | #define ADC_PIN PIND
|
---|
32 |
|
---|
33 |
|
---|
34 | // ON CHIP REGISTER ADDRESSES
|
---|
35 | #define STATUS_RD 0x40
|
---|
36 |
|
---|
37 | #define MODE_WR 0x01
|
---|
38 | #define MODE_RD 0x41
|
---|
39 |
|
---|
40 | #define AD0CON_WR 0x02
|
---|
41 | #define AD0CON_RD 0x42
|
---|
42 |
|
---|
43 | #define AD1CON_WR 0x03
|
---|
44 | #define AD1CON_RD 0x43
|
---|
45 |
|
---|
46 | #define FILTER_WR 0x04
|
---|
47 | #define FILTER_RD 0x44
|
---|
48 |
|
---|
49 | #define AD0DAT_RD 0x45
|
---|
50 | #define AD1DAT_RD 0x46
|
---|
51 |
|
---|
52 | #define IOCON_WR 0x07
|
---|
53 | #define IOCON_RD 0x47
|
---|
54 |
|
---|
55 | #define AD0OFS_WR 0x08
|
---|
56 | #define AD0OFS_RD 0x48
|
---|
57 |
|
---|
58 | #define AD1OFS_WR 0x09
|
---|
59 | #define AD1OFS_RD 0x49
|
---|
60 |
|
---|
61 | #define AD0GAIN_WR 0x0A
|
---|
62 | #define AD0GAIN_RD 0x4A
|
---|
63 |
|
---|
64 | #define AD1GAIN_WR 0x0B
|
---|
65 | #define AD1GAIN_RD 0x4B
|
---|
66 |
|
---|
67 | #define ID_RD 0x4F
|
---|
68 |
|
---|
69 | // REGISTER INIT VALUES
|
---|
70 |
|
---|
71 | //Init Configure and Initialize AD7719
|
---|
72 | //http://designtools.analog.com/dt/adc/codegen/ad7719.html
|
---|
73 |
|
---|
74 | #define IOCON_INIT_HIGH 0x03 //0000.0011 // I-sources I1 and I2 are switched on, thats all
|
---|
75 | #define IOCON_INIT_LOWBYTE 0x00
|
---|
76 |
|
---|
77 | #define FILTER_INIT 0x52 //0x52 euro use 50Hz = -171dB and 60Hz = -58dB Rejectjon Updaterate = 4Hz
|
---|
78 | // 0x52=82 decimal. f_ADC=16.6Hz; t_ADC=60ms; t_settle = 120ms
|
---|
79 |
|
---|
80 | #define AD1CON_INIT 0x31 //0011.0001
|
---|
81 | // AD1EN is set --> AUX ADc is used for Temp measurement.
|
---|
82 | // ACH = 011 --> Tempsensor
|
---|
83 | // U/#B = 0 --> bipolar, but i'm not entirely sure if this is correct.
|
---|
84 | // ARN = 1 --> input range is REFIN2 , but when tempsensor is chosen, internal ref is used ...
|
---|
85 |
|
---|
86 | #define AD0CON_INIT 0x8E // 1000.1110
|
---|
87 | // AD0EN is set --> main ADC is swtiched on
|
---|
88 | // WL is cleared --> 24bit
|
---|
89 | // CH = 00 --> AIN1 , AIN2 used
|
---|
90 | // U/#B = 1 --> unipolar
|
---|
91 | // RN=110 --> input range = +-1.28V --> whatever this means in ratiometric measurements.
|
---|
92 |
|
---|
93 |
|
---|
94 | #define MODE_IDLE 0x01
|
---|
95 | #define MODE_SINGLE 0x02
|
---|
96 | #define MODE_CONT 0x03
|
---|
97 | #define MODE_INTERNAL_ZERO_CAL 0x04 // not tested
|
---|
98 | #define MODE_INTERNAL_FULL_CAL 0x05 // not tested
|
---|
99 |
|
---|
100 | // since the ADC is chopped, one should wait 3 conversions
|
---|
101 | // after the muxer was switched, until the reading is okay.
|
---|
102 | #define READINGS_UNTIL_AD7719_SETTLED 3
|
---|
103 |
|
---|
104 | void ad7719_init(void);
|
---|
105 | void startconv(U08 continuous);
|
---|
106 | void stopconv(void);
|
---|
107 | U32 read_adc(void);
|
---|
108 | //-----------------------------------------------------------------------------
|
---|
109 | #endif
|
---|