Forum: Mikrocontroller und Digitale Elektronik LTC2440 misst nicht wenn Vin > Vref / 2


von Felix (Gast)


Lesenswert?

Guten Abend liebe Forumsgemeinde,

ich habe eine Schaltung mit dem LTC2440 ADC und der LTC1027 
Spannungsreferenz (5V). Ausgelesen wird der ADC von einem Arduino Uno 
(Code weiter unten). Ich kann aber irgendwie nicht über 2,5V messen. Der 
ADC kann doch bis zu seiner Spannungsreferenz messen oder nicht?

Das erste von der ADC zum Arduino übertragende byte ist 110000, die drei 
danach beinhalten nur nullen wenn ich versuche >2,5V zu messen.

Hat jemand eine Idee warum das so ist?

Viele Grüße!

Code auf Arduino:
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
}

von Christian L. (cyan)


Lesenswert?

Felix schrieb:
> Der
> ADC kann doch bis zu seiner Spannungsreferenz messen oder nicht?

Nein, kann er nicht. Schau ins Datenblatt anstatt zu raten. Dort steht 
eindeutig, dass die Eingangsdifferenzspannung nur zwischen -Vref/2 bis 
Vref/2 sein darf.

von Felix (Gast)


Lesenswert?

Christian L. schrieb:
> Nein, kann er nicht. Schau ins Datenblatt anstatt zu raten. Dort steht
> eindeutig, dass die Eingangsdifferenzspannung nur zwischen -Vref/2 bis
> Vref/2 sein darf.

Habe ich bis jetzt noch nicht entdeckt, könntest du mir vielleicht die 
Seite nennen? In den Absolute Maximum Ratings wird die Analog Input 
Spannung mit maximal Vcc + 0,3V angegeben.

von Christian L. (cyan)


Lesenswert?

Ach komm. Das Datenblatt ist voll mit dem Hinweis. Auf Seite 3 steht es 
unter Vin. Und an nahezu jeder Grafik des ICs gibt es den Hinweis. Auch 
im Kapitel Input Voltage Range steht es.

Felix schrieb:
> In den Absolute Maximum Ratings wird die Analog Input
> Spannung mit maximal Vcc + 0,3V angegeben.

Die Absolute maximum Ratings sind auch nur die Zerstörgrenze des ICs und 
haben mit dem Normalbetrieb nichts zu tun.

: Bearbeitet durch User
von Felix (Gast)


Lesenswert?

Danke! Keine Ahnung wie ich das übersehen konnte ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.