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
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?
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!!
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.