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.

Diese I2C-Module wird es ab Mitte Februar im Onlineshop zu kaufen geben.

 

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

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

 

21 Kommentare

  1. 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

  2. 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 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

  3. 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.

    • 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.

  4. 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

  5. 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

Schreibe einen Kommentar

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