1 | /*
|
2 |
|
3 | LTC2440 Communication Code
|
4 |
|
5 | LTC2440 <-> Arduino
|
6 | 10: /EXT : ground (use serial clock from uC)
|
7 | 11: /CS <- digital pin 10 (SS pin)
|
8 | 7: MOSI <- to digital pin 11 (MOSI pin)
|
9 | 12: MISO -> digital pin 12 (MISO pin)
|
10 | 13: SCLK <- digital pin 13 (SCK pin)
|
11 | 15: BUSY -> digital pin 9 (low when result ready)
|
12 |
|
13 | */
|
14 |
|
15 | #include <SPI.h> // include the SPI library
|
16 |
|
17 | #define VREF (5.0) // ADC voltage reference
|
18 | #define SSPIN 10 // digital pin 10 for CS/
|
19 | #define BUSYPIN 9 // digital pin 9 for BUSY or READY/
|
20 |
|
21 |
|
22 | // ==================================================
|
23 | // Read from ADC function
|
24 |
|
25 | float ReadADC(void) {
|
26 |
|
27 | byte b1orig;
|
28 | byte b1;
|
29 | byte b2;
|
30 | byte b3;
|
31 | byte b4;
|
32 | long result = 0;
|
33 | byte sig = 0; // sign bit
|
34 | float v;
|
35 |
|
36 | while (digitalRead(BUSYPIN) == HIGH); {
|
37 | // do nothing / wait for BUSYPIN to be LOW
|
38 | }
|
39 |
|
40 | digitalWrite(SSPIN, LOW); // select the Chip
|
41 |
|
42 | b1 = SPI.transfer(0xFF);
|
43 | if ((b1 & 0x20) == 0) sig = 1; // is input negative ?
|
44 | b1orig = b1;
|
45 | b1 &= 0x1f; // discard bits 25..31
|
46 | result = b1;
|
47 | result <<= 8;
|
48 |
|
49 | b2 = SPI.transfer(0xFF);
|
50 | result |= b2;
|
51 | result = result << 8;
|
52 |
|
53 | b3 = SPI.transfer(0xFF);
|
54 | result |= b3;
|
55 | result = result << 8;
|
56 |
|
57 | b4 = SPI.transfer(0xFF);
|
58 | result |= b4;
|
59 |
|
60 | digitalWrite(SSPIN, LOW); // deselect the Chip / start new conversion
|
61 |
|
62 | Serial.print("Bitstream: ( ");
|
63 | Serial.print(b1orig, BIN);
|
64 | Serial.print(" ");
|
65 | Serial.print(b2, BIN);
|
66 | Serial.print(" ");
|
67 | Serial.print(b3, BIN);
|
68 | Serial.print(" ");
|
69 | Serial.print(b4, BIN);
|
70 | Serial.println(" )");
|
71 |
|
72 | // VOLTAGE CALC
|
73 | if (sig) result |= 0xf0000000; // if input is negative, insert sign bit (0xf0.. or 0xe0... ?)
|
74 | v = result;
|
75 | v = v / 16.0; // scale result down , last 4 bits are "sub-LSBs"
|
76 | v = v * VREF / (2 * 16777216); // +Vfullscale = +Vref/2, max scale (2^24 = 16777216)
|
77 | return (v);
|
78 |
|
79 | }
|
80 |
|
81 | // Read from ADC function END
|
82 | // ==================================================
|
83 |
|
84 | void setup() {
|
85 |
|
86 | Serial.begin(115200);
|
87 |
|
88 | pinMode(SSPIN, OUTPUT);
|
89 | pinMode(BUSYPIN, INPUT);
|
90 |
|
91 | digitalWrite(SSPIN, LOW); // take the SS pin low to select the chip
|
92 | digitalWrite(SSPIN, HIGH); // take the SS pin high to start new ADC conversion
|
93 |
|
94 | SPI.begin(); // initialize SPI, covering MOSI,MISO,SCK signals
|
95 | SPI.setBitOrder(MSBFIRST); // data is clocked in MSB first
|
96 | SPI.setDataMode(SPI_MODE0); // SCLK idle low (CPOL=0), MOSI read on rising edge (CPHI=0)
|
97 | SPI.setClockDivider(SPI_CLOCK_DIV16); // set SPI clock at 1 MHz
|
98 |
|
99 | Serial.println("");
|
100 | Serial.println("LTC2440 Interface");
|
101 | Serial.print("Vref = ");
|
102 | Serial.println(VREF);
|
103 | Serial.println("[Initialized]");
|
104 |
|
105 | delay(1000);
|
106 | }
|
107 |
|
108 | void loop() {
|
109 |
|
110 | float V;
|
111 |
|
112 | Serial.println("[WAITING FOR NEW READING ...]");
|
113 | V = ReadADC();
|
114 | Serial.print("Calculated Voltage: ");
|
115 | Serial.print(V, 10);
|
116 | Serial.println(" V");
|
117 |
|
118 | }
|