Forum: PC Hard- und Software Raspberry Pi Zero W A/D Wandler


von Jörg (Gast)


Lesenswert?

Ich hätt an euch mal eine Frage.

Und zwar habe ich es geschafft mit meinem Raspberry Pi zero w den A/D 
Wandler ADS 1115 anzuschließen und auszulesen.
Ich habe die entsprechende Bibliothek heruntergeladen und mit "import 
Adafruit_ADS1x15" eingebunden. Anschließend mit adc = 
Adafruit_ADS1x15ADS1115() abgespeichert. Alles soweit kein Problem.


Jetzt habe ich jedoch folgenden A/D Wandler:

https://www.mouser.de/ProductDetail/Analog-Devices/LTC2485CDDPBF?qs=hVkxg5c3xu8JeTDO2icw%2Fw%3D%3D

da gibt es jetzt ja keine passende Bibliothek bzw. wenn ja wo finde ich 
diese.

Wenn nicht könnte mir jemand anhand von diesem Beispiel jemand erklären 
(am besten mit Code) wie es jetzt mit diesem funktioniert, habe glaub 
das Prinzip noch nicht ganz verstanden ? :)

Vielen Dank schonmal :D

von Rainer S. (enevile) Benutzerseite


Lesenswert?

Über I²C und die Adresse richtig angeben. Ich mache es mir oft leicht 
und mache vorher einen I²C Scanner dann weiß ich ganz genau welche 
Adresse ich ansprechen muss.

Im Datenblatt steht ab S.12 beschrieben wie das gemacht wird.

: Bearbeitet durch User
von Rainer S. (enevile) Benutzerseite


Lesenswert?

Im Prinzip muss du erstmal den I²C initalisieren. Dann soll er die 
Eingänge lesen und dir die Ergebnisse liefern. Ist einfach gesagt, aber 
nicht so leicht umgesetzt.

Jörg schrieb:
> (am besten mit Code)

Welche Sprache? Java? C#? Pascal?

Jörg schrieb:
> da gibt es jetzt ja keine passende Bibliothek bzw. wenn ja wo finde ich
> diese.

braucht doch nur I²C Bibliothek mehr nicht.

: Bearbeitet durch User
von Burkhard K. (buks)


Lesenswert?

Rainer S. schrieb:
> und mache vorher einen I²C Scanner

IIRC heisst das Paket für RaspOS "i2ctools" und das Binary i2cdetect".

von Burkhard K. (buks)


Lesenswert?

Jörg schrieb:
> Jetzt habe ich jedoch folgenden A/D Wandler:

Hallo Jörg, das sind zwei unterschiedlich schnelle Wandler:
 ADS1115: 16bit / 868 Sp/s
 LTC2485: Delta-Signa 32bit Output pro 15Sp/s

Für Raspi kenne ich jetzt nichts, für Arduino habe ich auf die Schnelle 
etwas auf GitHub gefunden: 
https://github.com/jlewallen/ltc2485/blob/master/ltc2485. (Keine Ahnung 
ob dass passt).

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

Linux hat einen nativen Treiber für den Chip,

drivers/iio/adc/ltc2485.c

aktiverbar mit
1
modprobe ltc2485
2
echo ltc2485 0x?? > /sys/bus/i2c/devices/i2c-0/new_device

(Statt ?? natürlich die richtige I²C-Adresse angeben, falls es nicht der 
erste Bus ist, statt i2c-0 den richtigen Bus angeben)

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

im Link fehlen die "pp" am Ende
https://github.com/jlewallen/ltc2485/blob/master/ltc2485.cpp

Aber er hat immer noch nicht die Programmiersprache verraten. Auch die 
funktionierende Bibliothek von Adafruit "Adafruit_ADS1x15" gibt es für 
mehrere.

: Bearbeitet durch User
von Jörg (Gast)


Lesenswert?

Rainer S. schrieb:
> Welche Sprache? Java? C#? Pascal?



Christoph db1uq K. schrieb:
> Aber er hat immer noch nicht die Programmiersprache verraten.


Ohh entschuldige die Sprach ist Python :D

oke dann werde ich es mal versuchen danke für eure Hilfe.

von Jörg (Gast)


Lesenswert?

Habe jetzt ziemlich lange probiert aber ist als Anfänger glaube ich 
einfach nicht zu schaffen :DDD

Mein Code:

import time
import smbus
import math

i2c = smbus.SMBus(0)

def readI2c(i2cDeviceAddr, channel)
     wert = i2c.read_byte_data(i2cDeviceAddr, channel)
     time.sleep(0.01)
     wert = i2c.read_byte_data(i2cDeviceAddr, channel)
     return wert

while True:
     value = readI2c(0x26, 1)

     print value
     time.sleep(1)

Der A/D Wandler hat die Adresse 26 das weiß ich aber es funktioniert 
nicht, danke für eure Hilfe schonmal

von mh (Gast)


Lesenswert?

Was bedeutet "aber es funktioniert nicht" genau?
Warum liest Du zweimal 1(?) Byte?
Schonmal ins Datenblatt geschaut? Da ist sogar Beispielcode drin...

von Jörg (Gast)


Lesenswert?

Also habs jetzt nochmal ganz leicht gemacht:

import time
import smbus

bus = smbus.SMBus(1)

while True:
     data = bus.read_byte_data(0x26, 0)
     print data
     time.sleep(1)

mh schrieb:
> Was bedeutet "aber es funktioniert nicht" genau?

1. Es kommen nur 2 Werte, dann kommt die Fehlermeldung Remote I/O error
2. Ich habe 24 Bit Auflösung mit diesem Teil, warum spielen sich die 
Werte, nur zwischen 67 und 160 ab und dann bin ich bei 0-3V an der 
Aussteuerung. Ich kapier das Prinzip iwie noch nicht ganz.

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Der ADC hat sein Resultat in einem 32-Bit-Register. Wenn du davon nur 8 
Bit liest, stehen da keine 24 Bit drinnen.

Schau doch einfach in das Datenblatt vom LTC2485. Da ist das alles 
beschrieben. Auch mit Status-Diagram. "Stop or read 32 Bits". Du machst 
"read 8 bits", was nirgendwo vorgesehen ist.

Tipp: Statt "read_byte_data" hat die smbus-Bib auch Funktionen um mehr 
als 8 Bit zu lesen.

von Jörg (Gast)


Lesenswert?

Εrnst B. schrieb:
> Statt "read_byte_data" hat die smbus-Bib auch Funktionen um mehr
> als 8 Bit zu lesen.

Ahhh oke ich hab jetzt erst mal "read word data" verwendet, waren dann 
schon 16, anschließend mit "read block data" jedoch gibt es mir hier 
wieder eine Fehlermeldung aus.

Code:

import time
import smbus

bus = smbus.SMBus(1)

while True:
     data = []
     data = bus.read_block_data(0x26, 0)
     print data
     time.sleep(1)


Fehlermeldung:
" I/O Error: Errno71 Protocol error"
Also passt ja was mit der "Art" von data nicht :/ aber es muss doch eine 
Liste sein oder ? weil ohne die [] geht es auch nicht

Danke für eure Hilfe

von Jörg (Gast)


Lesenswert?

Und was ich auch noch nicht verstehe, ich habe bei diesem Wandler ja nur 
einen Kanal, aber der zweite Index in der Klammer bezieht sich auf die 
Kanalnummer. Muss der dann schon auf Null gesetzt werden ?

von Jörg (Gast)


Lesenswert?

Habe es jetzt so gemacht:

Code:

import time
import smbus

bus = smbus.SMBus(1)

while True:

     data = bus.read_i2c_block_data(0x26, 0)
     print data
     time.sleep(1)

Jetzt kommt in der Ausgabe :

[187,12,153,119,255,255,255,255,255,255,255,255,255,255,255,....]

der erste Wert ändert sich wenn ich dass Analogsignal ändere die 
nächsten drei ändern sich willkürlich :D . Der Rest bleibt bei 255 kann 
mir das jemand erklären ? Danke :)

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Kaum zu glauben, aber nur die Wenigsten kennen diesen Geheimtipp: 32 Bit 
sind 4 Bytes.

von Jörg (Gast)


Lesenswert?

Aber warum ändern sich die einen Werte ständig und der vorderste nur 
zwischen 128 und 192

sorry für die Fragen aber verstehe es einfach noch nicht

von Jörg (Gast)


Lesenswert?

Εrnst B. schrieb:
> Angehängte Dateien:
>
ahhhh das hilft mir bisschen weiter

von Εrnst B. (ernst)


Lesenswert?

Jörg schrieb:
> Aber warum ändern sich die einen Werte ständig und der vorderste nur
> zwischen 128 und 192

Εrnst B. schrieb:
> Schau doch einfach in das Datenblatt vom LTC2485. Da ist das alles
> beschrieben.

>>  The LTC2485 output data stream is 32 bits long, [...]
>>  The first bit is the conversion result sign bit (SIG), [...]
>>  The second bit is the most significant bit (MSB) of the result. [...]

>> The next 24 bits contain
>> the conversion results in binary two’s complement format.
>> The remaining six bits are Sub LSBs below the 24-bit level.




P.S: Sorry dass ich dir das so Scheibchenweise vorwerfe, aber der 
Lerneffekt ist einfach besser wenn du dir solche Sachen selber 
erarbeitest.

: Bearbeitet durch User
von Jörg (Gast)


Lesenswert?

Kein Problem hast ja Recht aber jetzt hab ichs kapiert :DDDDD

bin nur bisschen verwirrt dass die hinteren Bits so schwanken aber dann 
ist meine Spannungsquelle halt nicht so gut und schwankt ein wenig  :DD#



Vielen Dank für deine Hilfe !!

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.