I2C-Analog Input 5 Kanäle 0-10V 10 Bit

Wir haben unser Produktspektrum um zwei neue I2C-Baugruppen zum aufschnappen auf die Norm-Hutschiene erweitert. Die Abmessungen der Leiterplatten sind 45,5 mm x 65,5 mm und passen in die WAGO Montagesockel für Kleinplatinen, die auf Standard-DIN-Schienen montiert werden können.

Die Karten gibt es im Onlineshop Horter-Shop. Artikel I2HAE

 

Analoge Eingabekarte mit 5 Kanälen und 10 Bit Auflösung (I2HAE)

I2C-ADC 5 CH 10 Bit

I2C-Analog Input card 5 Chanel 10 Bit

 

Allgemeines

Die Analog-In Karte verfügt über insgesamt 5 A/D Wandler mit einer Auflösung von 10 Bit. Die Analog-In Karte ist komplett Register gesteuert. Alle Daten werden in les- und schreibbaren Registern gespeichert.

 

Hardware

Gesteuert werden alle Vorgänge auf der Karte von einem Mikrokontroller (PIC 18F13K22). Dieser stellt die Verbindung zwischen dem I2C-Bus und den A/D-Wandlern her. Er sorgt dafür dass die Daten in den Registern mit einer Frequenz von 80 Hz aktualisiert werden..
Der minimale Wert eines Registers liegt bei 0x0000 (dec. 0) der Maximale  0x03FF (dec. 1023). Die A/D-Wandler messen gegen eine interne Referenzspannung von 2,048 Volt. Somit entspricht der maximale Wert einer messbaren Spannung von 2,048 Volt am Eingang. Mit entsprechenden Eingangswiderständen lässt sich der Messbereich der Karte erweitern.

 

I2C-Adresse

Wie bei allen Karten kann man die I2C-Adresse innerhalb eines gewissen Rahmens wählen.

I2C-Adressen sind immer als 7+1 Bit Adressen aufgebaut. Das letzte Bit entscheidet darüber ob der Master lesen oder schreiben will.
Auf gerade I2C-Adressen wird immer geschrieben – von ungeraden Adressen wird immer gelesen.

Beim Raspberry muss die 7-Bit Adresse angegeben werden. Die Umschaltung des letzten Adress-Bits wird vom PI selbst gesteuert.

Analog IN 8-Bit dez 8-Bit hex 7-Bit dez 7-Bit hex
OFF OFF OFF OFF 16 10 8 08
OFF OFF OFF  ON 18 12 9 09
OFF OFF  ON  OFF 20 14 10 0A
OFF OFF  ON    ON 22 16 11 0B
OFF  ON  OFF OFF 24 18 12 0C
OFF  ON  OFF  ON 26 1A 13 0D
OFF  ON  ON  OFF 28 1C 14 0E
OFF  ON  ON  ON 30 1E 15 0F
 ON  OFF OFF OFF 48 30 24 18
 ON  OFF OFF  ON 50 32 25 19
 ON  OFF  ON  OFF 52 34 26 1A
 ON  OFF  ON  ON 54 36 27 1B
 ON  ON  OFF OFF 56 38 28 1C
 ON  ON  OFF  ON 58 3A 29 1D
 ON  ON  ON OFF 60 3C 30 1E
 ON  ON  ON  ON 62 3E 31 1F

 

Datenübertragung

Eigentlich ist die Karte zum Messen da und zum Auslesen der gemessenen Spannungen. Es gibt aber einen Wert den man schreiben kann, den Register-Zeiger. Mit ihm ist es möglich einen bestimmten Kanal auszulesen. er ist 1 Byte lang.

Nach Spannung ein ist das Register auf Null gestellt. Somit werden die Analogwerte ab Kanal 0 gelesen.

Bei der Datenübertragung können beliebig viele Bytes gelesen werden.

  • die Anzahl der Bytes muss immer ungerade sein (1, 3, 5 usw.)
  • alle Registerwerte werden mit dem LSB voran gelesen
  • alle überflüssigen Leseoperationen werden ignoriert.

Im einfachsten Fall liest man immer 11 Bytes von der Analogeingabekarte und bekommt so alle Werte wie folgt in einem Datenarray abgelegt

Byte 1     Zeiger
Byte 2    Analogwert 1 Low Byte
Byte 3    Analogwert 1 High Byte
Byte 4    Analogwert 2 Low Byte
Byte 5    Analogwert 2 High Byte
Byte 6    Analogwert 3 Low Byte
Byte 7    Analogwert 3 High Byte
Byte 8    Analogwert 4 Low Byte
Byte 9    Analogwert 4 High Byte
Byte 10  Analogwert 5 Low Byte
Byte 11   Analogwert 5 High Byte

 

Beispiel für I2C-RS232-Modem 2 oder I2C-USB-Modem

Im Beispiel wird mit dem Befehl 51 das Auslesen der 11 Bytes von der Analogkarte angest0ßen. Die empfangenen Daten werden in das Array D(x) abgelegt.

Aus dem Byte D(2) und D(3) wird dann der erste Analogwert berechnet indem man das High-Byte mit 255 multipliziert und das Low-Byte einfach hinzuaddiert. Eine Multiplikation mit 255 entspricht ein links schieben um 8 Bitstellen.

Option Explicit
'Globale Variablen anlegen, die in der Funktion "Modem_Antwort"
'beschrieben werden

Dim FB           'Frame Befehl
Dim FA           'Frame Anzahl
Dim FE           'Frame Ende
Dim D(1 To 128)  'Daten

 
Private Sub Command_LESEN_Click()
'Der Befehl I2C-Data 33 hex = 51 dez.
'liest oder schreibt bis zu 128 Bytes vom I2C-Slave
Dim Adr
Adr = Combo_AIN_Adresse   'Adresse aus Cobo-Box

SENDBYTE (51)       'Befehl 51 = I2C-DATA
SENDBYTE (3)        'Frame Anzahl = 3
SENDBYTE (Adr + 1)  'Bus-Adresse des I2C-ADC zum Lesen
SENDBYTE (0)        'Adresse MSB
SENDBYTE (11)       '11 Byte lesen
SENDBYTE (4)        'Endekennung

If Modem_Antwort = True Then
    TextBox_AIN1.Text = D(3) * 256 + D(2)
    TextBox_AIN2.Text = D(5) * 256 + D(4)
    TextBox_AIN3.Text = D(7) * 256 + D(6)
    TextBox_AIN4.Text = D(9) * 256 + D(8)
    TextBox_AIN5.Text = D(11) * 256 + D(10)
Else
    MsgBox ("Fehler bei I2C-AIN")
End If

End Sub

 

Speichere in deinen Favoriten diesen permalink.

31 Kommentare

  1. Hallo,
    ich habe das Problem, das das LB des Eingang 1 immer 0 ist. Alle anderen Eingänge funktionieren einwandfrei und die Messung ist sehr Präzise.
    Außerdem passen die gelesenen bytes nicht zur Beschreibung.
    Byte 1 > immer 0
    Byte 2 > HB IN 1
    Byte 3 > LB IN 2
    Byte 4 > HB IN 2
    ….
    Byte 9 > LB IN 5
    Byte 10 > HB IN 5
    Die Berechnung funktioniert einwandfrei für die Eingänge 2-5 mit der angegeben Reihenfolge.

    • Hallo Timo,
      das liegt an der Python-Version oder am OS.
      Manche PIs haben ein Problem mit dem Clock-Stretch.
      Wir konnten aber noch nicht genau ergründen wie es dazu kommt. Mit C tritt der Fehler nicht auf.

    • Hallo Timo,
      das liegt an der Python-Version und an der OS-Version vom PI.
      Manche Konstellationen haben Probleme mit dem Clock-Stretch.
      Unter C tritt das Problem nicht auf.

  2. Sehr geehrter Herr Horter,

    ich habe vor kurzem den Bausatz I2HAE „Analoge Eingangskarte 5 Kanal 10 Bit“ bestellt.

    Jetzt habe ich leider ein kleines Problem damit!
    Und zwar liefert der Controller am Raspberry Pi4 keine Daten und wenn ich die Karten an einen Raspberry Pi2 anschließe liefert der 1. Kanal falsche Daten.

    So wie es aussieht werden die Daten um 1 Byte verschoben in die Register gelegt.

    Beispiel:
    Lese i2c_block_Daten mit python smbus Library:
    Spannung an den Kanälen 1,2,5 = 0VDC
    Daten byteweise
    0,0,0,0,0,0,0,0,0,0,255

    Spannung an den Kanälen 1,2,5 = 3,3VDC
    Daten byteweise
    0,1,66,1,0,0,0,0,66,1,255

    Spannung an den Kanälen 1,2,5 = 5,3VDC
    Daten byteweise
    0,2,10,2,0,0,0,0,10,2,255

    Spannung an den Kanälen 1,2,5 = 7,6VDC
    Daten byteweise
    0,2,225,2,0,0,0,0,255,2,255

    Spannung an den Kanälen 1,2,5 = 10VDC
    Daten byteweise
    0,3,203,3,0,0,0,0,203,3,255

    Kann es sein, dass ich hier was falsch mache, oder haben wir hier ggf ein Firmware-Problem??

    Vielen Dank für Ihre Hilfe

    Mit freundlichen Grüßen
    Stefan A.

  3. Hallo,
    Gibt es für das Modul einen Beispiel Code für Arduino bzw. ESPxx ?

    Mit freundlichen Grüßen
    Ricardo

  4. Hallo,
    Sie haben anhand von Beispielen dargestellt, wie man die digitalen I2C Karten in FHEM einbinden kann.
    Haben Sie solch tolle Beispiele auch für Ihre analogen Karten (ein -und Ausgabe) ?
    Vielen Dank im voraus.
    Mit freundlichen Grüßen
    Theo Klein

  5. Hallo,

    ich habe das I²C-Analog-Input 5 Kanal 0-10 V 10 Bit Modul gekauft und es an einen Raspberry Pi angeschlossen, um eine Spannung von 5-10 V zu messen. An dem Kanal 1 habe ich eine Gleichspannung von 8 V angeschlossen. Beim Auslesen (i2cget -y 1 0x1f) des Moduls mit dem Raspberry Pi wird immer der Wert „0“ bzw. „0X00“ zurückgeliefert. Auch beim Ändern der Eingangsspannung ändert sich der Rückgabewert nicht. Woran kann dies liegen, was wird von mir falsch gemacht?

    Vielen Dank im Voraus.

    Gruß Ricardo

    • Hallo Ricardo,
      der Befehl i2cget -y 1 0x1f liest nur ein Byte vom I2C-Slave.
      Bei der Analog-Eingangskarte ist das erste Byte der Zeiger. Dieser steht im Normalfall auf 0
      Also stimmt die Antwort, die Sie erhalten.
      Um Analogwerte zu lesen müssen Sie mindestens 3 Bytes zusammenhängend lesen.
      Das geht meines Wissens in der Konsole nicht. Das muss mit Phyton oder C gemacht werden.
      Im Beitrag oben ist der Aufbau der Register beschrieben.
      Beispiel mit Phyton: I2C-Analog-Input-Modul mit Python und TkInter
      und ein Beispiel für C: I2C-Analog Input am PI mit C einlesen

  6. Hallo Herr Horter,

    ich habe zwei Fragen:
    1. Es ist beim einem Pt100 Sensor, der 4..20mA ausgibt, sinnvoller einen Messwandler einzusetzen oder nach dieser Methode https://www.horter.de/blog/20ma-sensor-an-i2c-analogkarte/ zu verfahren?
    2. Gibt es ein Beispielprogramm in Python zum Auslesen eines 0..10V Sensors und zum adresssieren eines Aktors mit der Analog-Output-Karte?

    Mit freundlichen Grüßen
    S. Ehrismann

    • Hallo,
      1. die über einen Messwandler bekommen Sie bessere Ergebnisse, weil Sie einen Bestimmten Temperaturbereich auf 0-10V skalieren können.
      bei der Schaltung mit dem Spannungsteiler haben Sie immer einen kleineren Analogbereich zur Verfügung und büßen damit Genauigkeit ein.

      2. Python-Programmbeispiele habe ich im Blog veröffentlicht:
      I2C-Analog-Input-Modul mit Python und TkInter
      I2C-Analog-Output-Modul mit Python und TkInter

      • Hallo Herr Horter,
        beim Betrieb des Sensors über den Messwandler an der Inputkarte ist ein Problem aufgetreten. Der Messwandler (http://brodersencontrols.com/images/PXC-10_11.pdf) gibt das Ausgangssignal über zwei Drähte aus. Zwischen diesen beiden kann ich 0-10V messen, allerdings nicht zwischen einem der Drähte und Ground der Inputkarte. Nun habe ich versucht, zwei Groundpins der Karte zu isolieren, indem ich die Leiterbahnen ein bisschen manipuliert habe, um beiden Drähte des Messwandlers anschließen zu können. Leider brachte dies nicht den gewünschten Erfolg.
        Ist Ihnen so ein Problem schon einmal untergekommen oder haben Sie noch eine Idee, wie man dem Problem bei kommt?
        Mit freundlichen Grüßen
        S.Ehrismann

        • Hallo,

          die GND-Leitung vom Messwandler muss mit dem GND der Analogkarte verbunden werden, sonst kann die nicht messen.
          Wenn das nicht geht oder Sie das nicht machen wollen brauchen Sie einen Trennverstärker.

          Gruß, JH

  7. Hallo,
    ich habe das Analog – Input – Modul zusammen mit dem I2C – Repeater am Raspberry angebracht. Allerdings scheint da was nicht zu stimmen, das Tool i2cdetect liefert ein device mit Adresse 0x08. Die Jumper auf dem Modul sind so eingestellt, dass es die Adresse 0x10 hat. Auch ein Wechsel auf Adresse 0x30 änderte daran nix. Wenn ich o.g. Bytefolge zum Auslesen aller 5 Kanäle sende, bekomme ich 0xFFFFFFFF zurück. Ich kann via i2cset und get 1 Byte schreiben und auch wieder auslesen (wobei die angenommenen Werte zwischen 0 und 5 liegen, höhere Werte werden immer als 5 gespeichert). Muss ich evtl. dem Repeater zuerst eine bestimmte Bytefolge schicken sodass ich das AD – Modul ansprechen kann oder ist der Repeater diesbezüglich „durchsichtig“?
    PS: Am Eingang des AD-Moduls hängt ein PT1000 Messumwandler und liefert (gemessen) 0-10 Volt.

    Für Ihre Unterstützung bin ich sehr dankbar.
    Mit freundlichen Grüßen
    Stefan Z.

  8. Hallo,
    gibt es eine einfache möglichkeit einen PT 1000 Fühler an den Analog Eingängen zu betreiben ?

    • Hallo,

      Die beste Lösung ist einen Messwandler PT1000 / 0-10V einzusetzten.
      Die gibt’s relativ günstig im Netz.

      Wenn’s nicht allzu genau werden muss kann man den PT1000 über einen Spannungsteiler an die Analogkarte anschließen.
      Dabei sollte der Strom durch den Widerstand nicht mehr als 2mA betragen, weil der sich sonst selbst erwärmt und die Messung noch mehr verfälscht.

      Hier mal die Widerstandswerte vom PT100 (R-PT1000) zwischen -40 .. +150 °C
      Nimmt man einen Vorwiderstand von 8,87 kOhm und hängt dann den Spannungsteiler an 12V ergibt sich ein Mess-Strom (Imess) von ca. 1,2 mA der wiederum einen Spannungsabfall am PT1000 von 1,04 und 1,8V zur Folge hat.

      Eine Spannung bis 2,048V kann direkt am PIC angeschlossen und gemessen werden.

      Dazu am entsprechenden Kanal den Vorwiderstand z.B. R1 brücken und den anderen Widerstand z.B. R11 nicht bestücken.

  9. Hallo.

    Wir haben in unserer Wasserversorgung noch einen alten Registrierempfänger mit alten Farbnadeln die die Kurven plotten auf Papier. Ich möchte diesen durch modernere Technik ersetzen. Der „Drucker“ hat 0-10V Eingänge was natürlich hier gleich passen würde. Ich würde jedoch aber 15 Eingänge benötigen. Kann man mittels ändern der Adressen 3 Boards gleichzeitig nutzen?

    Vielen Dank und Grüsse aus der Schweiz

    • Hallo,
      Sie können von den analogen Eingangskarten bis zu 16 Stück am I2C-Bus anschließen.
      Drei Karten sind also überhaupt kein Problem.

      Grüße in die Schweiz

  10. Hallo,
    Ich habe ein I2AE Modul von Ihnen welches auch einwandfrei funktioniert. Jetzt würde ich aber gerne einen Honeywell Feuchtigkeitssensor an dem Modul nutzen. Das Problem ist nun, dass der Sensor bei 50% Luftfeuchte nur 0,5V als Signal ausgibt. Lassen sich solche kleinen Spannungen mit dem Modul zuverlässig messen?
    Gruß,
    Stefan L.

    • Hallo Stefan,

      der Analogeingang am PIC ist für Werte zwischen 0 und 2,048V ausgelegt.
      Mit den Widerständen 120k und 30k wird die 0-10V Messspannung auf diesen Wert heruntergeteilt (Spannungsteiler 1:5)

      Sie können bei dem gewünschten Kanal einfach den 30kOhm Widerstand auslöten und den 120k überbrücken.
      z.B. für Kanal 1

      R1 brücken
      R11 auslöten

      Dann macht der Kanal 0..2V anstatt 0..10V.

      null

      • Hallo Stefan,
        ich habe eine ähnlich gelagerte Frage.
        Der zu messende Bereich liegt zwischen 0 und 3,5V – wie müsste ich die Widerstände anpassen, dass.die Schaltung sauber funktioniert?
        Danke für eine kurze Antwort.
        Viele Grüße
        Carsten

        • bei 0-3,5V braucht es wieder einen Spannungsteiler.
          Die Formel ist Ue = (2V:R11)*(R1+R11)

          0-3,5V mit R1=120k und R11=160k
          0-4,0V mit R1=100k und R11=100k
          0-5,0V mit R1=150k und R11=100k
          0-10V mit R1=120k und R11=30k (Standard)
          0-22V mit R1=120k und R11=12k

  11. Hello,

    I love it .
    I want 10 pieces of I2C analog input 5 kanale 0..10V 10bit.
    How can i buy them? how much are they?
    Please help me get them.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert