Forum: Mikrocontroller und Digitale Elektronik LTC1865 Halber Messbereich


von Julian (gurkenfresser)


Angehängte Dateien:

Lesenswert?

Moin!
Ich nutze einen LTC1865 im SO-8-Package in Kombination mit einem ESP32. 
Der LTC1865 wird mit 5 V an VCC versorgt und hängt mit seinem GND-Pin 
auf GND. Die SO-8-Variante besitzt keinen gesonderten VRef-Pin, 
stattdessen nutzt er die Versorgungsspannung als Referenz. (Siehe 
Datenblatt S. 10, Pin VCC oder S. 14, Reference Input) Er hat zwei 
Messeingänge die entweder gegen GND oder gegeneinander gemessen werden 
können (Siehe S. 14, Table 1) Insgesamt hat er eine Auflösung von 16 
Bit, wobei der maximale ADC-Wert 0xffff einer Spannung von VRef=VCC 
entspricht. (Siehe S. 15, Figure 5)

Ich nutze den folgenden Code, um eine ADC-Messung zu triggern und das 
Ergebnis auszulesen:

    uint16_t LTC1865::Read(uint8_t _Channel) {
      SPI.begin();
      SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE1));

      if (_Channel)
        _Channel = 1;

      // New channel is not the last read channel, do dummy conversion 
to change channel
      if (_Channel != PreviousChannel) {
        digitalWrite(Pin_Conv, HIGH);
        delayMicroseconds(ADC_CONVERSION_TIME); // 4us
        digitalWrite(Pin_Conv, LOW);
        SPI.write16(0x8000 | (_Channel ? 0x4000 : 0));
        PreviousChannel = _Channel;
      }

      // Do conversion
      digitalWrite(Pin_Conv, HIGH);
      delayMicroseconds(ADC_CONVERSION_TIME); // 4us
      digitalWrite(Pin_Conv, LOW);

      const uint16_t result = SPI.transfer16(0x8000 | (_Channel ? 0x4000 
: 0));
      SPI.endTransaction();
      Serial.println(result);
      return result;
    }

Der an den ADC übertragene Code: 0x8000 | (_Channel ? 0x4000 : 0) 
aktiviert die Spannungsmessung im Single-Ended-Mode, d.h. Minus liegt 
auf GND, + auf dem Eingang _Channel. (Siehe S. 14)

Gebe ich nun auf einen der Eingänge eine Spannung von 2,5 V, so erhalte 
ich result ≈ 65000, also ungefähr dem maximalen Wert, den der ADC 
ausgeben kann. Erwarten würde ich hingegen einen Wert im Bereich 32500. 
Gebe ich eine Spannung höher als 2,5 V drauf, so erhalte ich einen 
"Überlauf", d.h. result fängt wieder bei 0 an aufwärts zu zählen. Die 
Ergebnisse sind an beiden Eingängen identisch. Ich habe die Spannungen 
an VCC sowie dem gemessenen Eingang mittels Multimeter und Oszi 
überprüft. Soweit keine Auffälligkeiten.

Grundsätzlich leistet der ADC soweit auch einen guten Dienst, nur eben 
im Bereich 0-2,5 V und nicht im Bereich 0-5 V. Woran liegt das? Verstehe 
ich das Datenblatt falsch? Ist am Code etwas falsch?

Beste Grüße
Julian

: Bearbeitet durch User
von Achim S. (Gast)


Lesenswert?

Julian schrieb:
> rwarten würde ich hingegen einen Wert im Bereich 32500.
> Gebe ich eine Spannung höher als 2,5 V drauf, so erhalte ich einen
> "Überlauf", d.h. result fängt wieder bei 0 an aufwärts zu zählen.

Klingt irgendwie danach, als würde dein SPI-Zugriff "ein Bit zu viel 
durchschieben", so dass das MSB aus deinem uint16 rausfällt.

Julian schrieb:
> Ich habe die Spannungen
> an VCC sowie dem gemessenen Eingang mittels Multimeter und Oszi
> überprüft. Soweit keine Auffälligkeiten.

Und mit dem Oszi an SCK und SDO hast du wirklich gesehen, dass das MSB 
auf dem seriellen Bus schon gesetzt ist, wenn Vin noch knapp unter 
Vref/2 liegt?

von Julian (gurkenfresser)


Angehängte Dateien:

Lesenswert?

Achim S. schrieb:
> Klingt irgendwie danach, als würde dein SPI-Zugriff "ein Bit zu viel
> durchschieben", so dass das MSB aus deinem uint16 rausfällt.
Interessanter Gedanke! Da hätte ich durchaus auch mal drauf kommen 
können... Ich habe die These mit dem Oszi überprüft und du hast Recht! 
Das dort angezeigte Signal zeigt definitiv den um 1 Bit verschobenen 
Wert an! Interessant ist, dass das MOSI-Signal immer zur steigenden 
Clock-Flange wechselt, während das MISO-Signal mit der fallenden 
Clock-Flanke wechselt. (Siehe Anhang)

Durch eine Erhöhung der Baudrate auf 10 MHz ist das Problem 
verschwunden. (Eine Verringerung der Baudrate half nicht) Das Signal 
sieht auf dem Oszi dann nicht mehr allzu brauchbar aus, allerdings ist 
es mit 50 MHz Bandbreite auch am Limit.

Misst der ESP32 möglicherweise zur fallenden Flanke und dadurch das der 
LTC1865 mit der fallenden Flanke sein Datensignal ändert, misst der ESP 
immer ein LTC-Bit später? Durch die Erhöhung der Baudrate ist der LTC 
"zu langsam", sodass der ESP32 noch das richtige Bit ausließt?

So oder so: Vielen Dank für deine Hilfe!!

von Achim S. (Gast)


Lesenswert?

Julian schrieb:
> Durch die Erhöhung der Baudrate ist der LTC "zu langsam", sodass der
> ESP32 noch das richtige Bit ausließt?

kann gut sein. die eigentliche Lösung wäre dann, den richtigen SPI Mode 
zu verwenden.

https://www.analog.com/en/analog-dialogue/articles/introduction-to-spi-interface.html

von Kai B. (kaib) Benutzerseite


Lesenswert?

Im Init Code nutzt du SPI Mode 1. Laut Datenblatt will der ADC mit 
steigender Flanke Daten Übernehmen. Somit wäre für den  ADC aber wohl 
eher MODE 3 Ideal bzw MODE 0 dürfte auch funktionieren.

: Bearbeitet durch User
von Julian (gurkenfresser)


Angehängte Dateien:

Lesenswert?

Vielen Dank für eure Beiträge!

Das der LTC1865 mit höherer Frequenz korrekt kommunizierte, war 
tatsächlich Zufall und lag daran, dass das Oszi genügend Kapazität auf 
die Leitungen gab, sodass sich das Signal ausreichend verzögert. Ohne 
Oszi funktionierte es nicht!

Aufgrund meines Oszi-Bildes würde ich ebenfalls Mode 3 wählen. Nach dem 
angehängten Bild (Datenblatt S. 14, Figure 4) zu urteilen (und Achims 
Link) hätte ich Mode 2 gewählt:

    "Data sampled on the rising edge and shifted out on the falling 
edge")

und

    "Clock Polarity in Idle State: Logic High"

Allerdings funktioniert es mit Mode 2 nicht, aber mit Mode 0 und 3. Habe 
somit nun auf Mode 3 gewechselt. Entsprechend scheint die 
Datenblatt-Grafik falsch zu sein -.-

Auf jeden Fall: Vielen Dank für eure Hilfe und die Erweiterung meines 
SPI-Horizonts!

: Bearbeitet durch User
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.