Raspberry Pi Zero W A/D Wandler

Gast #6421928
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
Persönliche Seite #6421944
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.
#6422047
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).
Gast #6424204
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
Gast #6424498
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.
#6424664
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.
Angehängte Dateien:
Gast #6425238
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
Gast #6425602
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 :)
#6425662
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren