I2C-Analog-Input 4 Kanäle / 18 Bit mit MCP3424

Bei dieser Karte haben wir einen AD-Wandler von Microchip verbaut. Dieser kann 4 Analogwerte mit einer Auflösung von maximal 18 Bit einlesen.
Folgende Messbereiche sind möglich:

  • 0..10V
  • ±10V
  • ±2V
  • ±20mA

Durch ändern der Vorwiderständen lassen sich auch andere Messbereiche z.B. 0-30V zur Überwachung von Bordspannungen im KFZ, Boot oder Caravan realisieren.

 

Hardware

Der AD-Wandler MCP3424 von Microcip hat folgende Eigenschaften:

  • 4 Analogkanäle
  • On-Board Referenzspannung 2,048V ± 0.05%
  • On-Board programmierbarer Verstärker
  • Programmierbare Abtastraten
    3.75 SPS (18 bits)
    15 SPS (16 bits)
    60 SPS (14 bits)
    240 SPS (12 bits)

Weitere Einzelheiten entnehmen Sie bitte dem Datenblatt MCP3424 (830 kB)

Wir haben den MCP3424 auf eine Leiterplatte mit vier Spannungsteilern und vier 500 Ohm Widerständen gepackt.

Mit Jumpern kann für jeden Kanal der gewünschte Messbereich gewählt werden.

 Downloads

Datenblatt   Schaltplan

 

I2C-Adresse

Die Adressierung des MCP3424 erfolgt mit Jumpern auf der Karte.

A0 A1 8-Bit dezimal 8-Bit hex 7-Bit dezimal 7-Bit hex
L L 208 0xD0 104 0x68
L F 210 0xD02 105 0x69
H L 212 0xD4 106 0x6A
H F 214 0xD6 107 0x6B
L H 216 0xD8 108 0x6C
F L 218 0xDA 109 0x6D
H H 220 0xDC 110 0x6E
F H 222 0xDE 111 0x6F

 

Programmierung

Um einen Analogwert aus dem MCP3424 muss vorher das Register eingestellt werden. Dies erfolgt über das Steuerregisterwelches mit einem Schreibbefehl zum AD-Wandler gesendet wird.

Bit Funktion Erklärung
0+1 Verstärkung
(Gain)
00 = x1 (Default)
01 = x2
10 = x4
11 = x8
2+3 Auflösung
(Sample Rate)
00 = 240 SPS (12 bits) (Default)
01 = 60 SPS (14 bits)
10 = 15 SPS (16 bits)
11 = 3.75 SPS (18 bits)
4 Wandlungsart
(Conversion Mode)
1 = Continuous Conversion Mode (Default).
0 = One-Shot Conversion Mode.
5+6 Kanalauswahl
(Channel Selection)
00 = Select Channel 1 (Default)
01 = Select Channel 2
10 = Select Channel 3
11 = Select Channel 4
7 Wandlung start / fertig
(Ready Bit)
One-Shot mode:
1 = Initiate a new conversion.Conversion mode:
0 = No effect

 

Programmbeispiel für I2C-USB-Modem oder i2C-Modem-2

STBy = 0 'Kanal 0 (Bit 5+6)

Select Case Combo_GAIN.Text 'Verstärkung (Bit 0+1)
 Case 1
    STBy = STBy + 0 ' 1x = 0 0
 Case 2
    STBy = STBy + 1 ' 2x = 0 1
 Case 4
    STBy = STBy + 2 ' 4x = 1 0
 Case 8
    STBy = STBy + 3 ' 8x = 1 1
End Select
 
Select Case Combo_RATE.Text 'Auflösung (Bit 2+3)
 Case 12
    STBy = STBy + 0 ' 12 Bit = 0 0
 Case 14
    STBy = STBy + 4 ' 14 Bit = 0 1
 Case 16
    STBy = STBy + 8 ' 16 Bit = 1 0
 Case  18
    STBy = STBy + 12 ' 18 Bit = 1 1
End Select
 
'Startbit setzten (Bit 7)
STBy = STBy + 128

'Steuerbyte in Textbox ausgeben
TextBox_STEUERBYTE_WRITE.Text = Dec2Bin(STBy)

'Steuerbyte übertragen
SENDBYTE (51) 'Befehl 51 = Daten senden
SENDBYTE (3) 'Frame Anzahl = 3
SENDBYTE (Adr) 'Bus-Adresse des MCP3424
SENDBYTE (0) 'Adresse MSB
SENDBYTE (STBy) 'Steuerbyte
SENDBYTE (4) 'Endekennung

Anschließend kann der Analogwert über einen Lesebefehl geholt werden.

Bei einer Auflösung von 12-Bit, 14-Bit oder 16-Bit müssen 3 Bytes vom MCP3424 gelesen werden.

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 (3) '3 Byte lesen
SENDBYTE (4) 'Endekennung

Bei einer Auflösung von 18-Bit müssen 4 Bytes vom MCP3424 gelesen werden.

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 (3) '4 Byte lesen
SENDBYTE (4) 'Endekennung

Der Messwert kann danach abhängig der Auflösung berechnet werden

 Select Case Combo_RATE.Text
 
 Case 12 ' 12 Bit = 1mV / Digit ( 0-10V = 0-4000 dez.) 
    TextBox_AIN1.Text = byte2Dec(d(1), d(2))
    'Spannung = Digitalwert * 1 [mV]
    TextBox_T1.Text = (TextBox_AIN1.Text * 1) / 1000 & " V" 'Spannung am Pin
    TextBox_S1.Text = (TextBox_AIN1.Text * 5) / 1000 & " V" '0-10V Wert
 
 Case 14 ' 14 Bit = 250 μV / Digit ( 0-10V = 0-8000 dez.) 
    TextBox_AIN1.Text = byte2Dec(d(1), d(2))
    'Spannung = Digitalwert * 250 [μV]
    TextBox_T1.Text = (TextBox_AIN1.Text * 250) / 1000000 & " V" 'Spannung am Pin
    TextBox_S1.Text = (TextBox_AIN1.Text * 1250) / 1000000 & " V" '0-10V Wert
 
 Case 16 ' 16 Bit = 62,5 μV / Digit ( 0-10V = 0-32000 dez.) 
    TextBox_AIN1.Text = byte2Dec(d(1), d(2))
    'Spannung = Digitalwert * 62.5 [μV]
    TextBox_T1.Text = (TextBox_AIN1.Text * 62.5) / 1000000 & " V" 'Spannung am Pin
    TextBox_S1.Text = (TextBox_AIN1.Text * 312.5) / 1000000 & " V" '0-10V Wert
 
 Case 18 ' 18 Bit = 15,625 μV / Digit( 0-10V = 0-256000 dez.) 
    TextBox_AIN1.Text = byte2Dec(d(1), d(2), d(3))
    'Spannung = Digitalwert * 15.625 [μV]
    TextBox_T1.Text = (TextBox_AIN1.Text * 15.625) / 1000000 & " V" 'Spannung am Pin
    TextBox_S1.Text = (TextBox_AIN1.Text * 78.125) / 1000000 & " V" '0-10V Wert
 
 End Select

 

Private Function byte2Dec(ParamArray By() As Variant) As Long
' Wandelt bis zu vier Bytes in eine positive oder negative Dezimalzahl um.
' Ist das erste Byte negativ also größer als 127, dann ist die ganze Zahl negativ.

 Dim v As Variant
 Dim i, h, neg
 
 For Each v In By
   h = h & Right("0" & Hex(v), 2)
   i = i + 1
   If i = 1 Then
     If v > 127 Then neg = 1
   End If
 Next v
 
 If neg = 1 Then
   byte2Dec = CLng("&H" & Right("FFFFFF" & h, 8))
 Else
   byte2Dec = CLng("&H" & Right("000000" & h, 8))
 End If

End Function

 

Excel-Makro

In diesem Excel-Makro ist die prinzipielle Funktion der Analogen Eingangskarte 4-Kanal 18-Bit dargestellt.

Excel-Makro zum MCP3424 für I2C-USB-Modem und I2C-SR232-Modem 2 (1289 Downloads)

 

 

 

 

Speichere in deinen Favoriten diesen permalink.

53 Kommentare

  1. Hallo Herr Horter,

    ich bin dabei einen Signal aus zu werten 4-20mA. Bekomme aber irgendwie einen falschen Wert ausgegeben.
    Bei dem WTS Wägetransmitter (Aktuell 15kg) messe ich mit dem Multimeter 4.7mA. Beim auslesen von mcp3424 gibt folgendes aus: 7.56mA und den Digitalen Wert 29197 bei der Auflösung RAW_MAX_18 (131072).

    Ich benutze folgende Library https://github.com/alxyng/mcp3424

    Anleitung von der WTS https://www.bosche.eu/media/pdf/d1/de/3d/WTS_manual_de.pdf
    Dort steht geschrieben:
    Alle Analog-Ausgänge des Instruments sind des Typs AKTIV und SINGLE ENDED,
    weshalb nur Empfängergeräte des Typs PASSIV angeschlossen werden können.
    Die für Spannung-Ausgänge zulässige Mindestlast liegt bei 10 kohm, die
    Höchstlast für die Strom-Ausgänge bei 300 ohm.

    • Ich denke ich habe den Fehler gefunden.
      Der mcp3424 gibt bei der Auflösung (18) 0 – 131072 die Werte 0-20mA.

      Jedoch benutze ich die MAP-Function und gebe als to_min=4mA
      #define MAP(val, from_min, from_max, to_min, to_max) \
      ((val – from_min) * ((to_max – to_min) / (from_max – from_min))) + to_min

  2. Harikumar Perumalsamy

    Hello Mr. Horter,

    I have a connectivity issue regarding I2AE18 – Analog input board.

    I have connected my board on Raspberry (Pi 4 Model B) but I am unable to detect the address of the board using the code i2cdetect -y 1. I did the following but still no success

    – sudo apt-get install python3-smbus
    – sudo apt-get install -y i2c-tools
    – dtparam=i2c_arm=on
    – Enabled i2c in configuration
    – Made sure that the cables are connected properly
    – tried different jumper positions on A1 and A0
    – I also tried connecting I2HAA (Analog output board)

    Just to make sure if the board works, I have connected it to Arduino and it worked. I was able to read the address of the connection.

    do you have any solution/recommendation which I can try?

    • Hello,
      do you use our repeater on the Raspberry Pi4?
      Can you measure the voltage between SDA and GND and between DCL and GND. There must be 5V here.

  3. Der Kopf des Python-Beispiels (https://www.horter.de/blog/i2c-mcp3424-analog-in-18bit-modul-mit-python-und-tkinter/) passt nicht mehr.
    Er sollte lauten:

    try:
    #Python 2.x
    from TKinter import *
    import ttk
    except:
    #Python 3.x
    from tkinter import *
    from tkinter.ttk import *

    Des Weiteren funktioniert im Beispiel die Abfrage mit 18bit-Auswahl unter Python 2.7 nicht. Dort gibt es immer einen Fehler (Zeile 65 und 68).

  4. Hallo Herr Horter,

    ich finde Ihre Bausteine toll und würde ein Beispiel für die I2C-Analog-Input 4 Kanäle / 18 Bit Karte und FHEM auf einen Raspberry Pi suchen.
    Mit FHEM würde ich gerne 4-20 mA Signale mit hoher Auflösung (18 Bit) aufzeichnen und darstellen.
    Ich würde zum Beispiel einen Sauerstoffwert, pH Wert und die Temperatur im Wasser messen wollen und mit FHEM via WLAN abrufbar machen.

    Meine Erfahrungen mit FHEM sind nicht besonders groß, aber ich denke mit einem Beispiel für FHEM würde ich mich durchwurschteln können…

    Eventuell haben Sie ein Beispiel wie man das umsetzen kann?
    Würde mich freuen 🙂

    Herzliche Grüße,
    Thomas

  5. Hallo Zusammen,

    ich habe mir 3 Karten „I2C-Analog-Input 4 Kanäle / 18 Bit mit MCP3424“ bestellt und habe mit der Adressen davon ein Problem.
    Ich habe für jede Karte eine Adresse ausgewählt und wenn ich sie alle anschließen, und nach I2C-Devices scannen (I2Cdetect -y 1) bekommen unterschiedliche und mehr als drei Adressen obwohl nur drei Karten Angeschlossen sind.
    Wenn ich sie einzeln anschließen kann ich zwar ich eine Adresse sehen aber wenn ich sie ändere (ein andere Jumper-Kombination) ändert sich die Adresse nicht !!.
    hat jemanden schonmal sowas gehabt ?

    Vielen Dank .

    • Hallo,
      Sie müssen auf jeden Fall einen Power-ON machen, wenn Sie die Jumper umstecken. Sonst erkennt der MCP3424 die neue Adresse nicht.
      Wir hatten bei ein paar Platinen mal einen falschen Bestückungsaufdruck bei den Adressen. Aber mit I2Cdetect -y 1 müssten Sie auf jeden Fall die richtigen Adressen finden können.
      Gruß, JH

  6. Hallo,

    ich würde gerne mit der Karte einen Sensirion SDP2000-L einlesen, dieser gibt maximal 4V aus. Jedoch steht im Datenblatt unter Punkt 2.2, dass die kapazitive Last am Ausgang 200pF nicht überschreiten darf. Die Karte verwendet jedoch 0,1uF wenn ich es richtig sehe.

    Meine Frage ist nun ob es möglich ist den Kodensator C1 wegzulassen und den Widerstand R11 auf 120k Ohm zu ändern um einen Maximalen Messbereich von 4.096V zu erhalten?
    Alternativ nur den Kondensator zu entfernen und nur 4 der maximalen 10V zu nutzen?
    Da der Sensor nur einen Ausgang liefert würde ich ebenfalls gerne den Jumper „M“ setzen, jedoch steht im Schaltplan das man dies bei +-10V Messungen nicht machen soll?

    Mit freundlichem Gruß
    Thomas S.

  7. Hallo,

    ich würde dieses Eingabemodul gerne auf einem RaspberryPi mit CodesysControl verwenden, bekomme es selber aber leider nicht zum laufen.
    Ich würde mich sehr freuen, wenn Sie mir den CodesysFB zuschicken könnten.

    Mit freundlichen Grüßen
    Sven K.

  8. Hallo,
    Ich würde gerne die I2C-Analog-Input Karte (18 Bit mit dem MCP3424) in mein Codesys-Projekt
    einbinden. In dem „Horter & Karb Raspberry Support Package (V1.0)“ wird dieses Gerät jedoch nicht aufgelistet. Könnten Sie mir bitte bei der Einbindung dieser Karte behilflich sein?
    Danke
    Lg
    Leo H.

  9. Thomas Jonischkies

    Hallo Herr Horter,
    kann ich mit dieser Karte auch Wechselstrom/-Spannung messen?
    Die Überlegung ist, einen SCT-013 Stromsensor zur Messung
    der Stromaufnahme einer Pumpe im 230V-Netz zu nutzen.

    MfG
    T.Jonischkies

    • so wie ich das sehe gibt der Wandler eine Gleichspannung von 1V aus.
      z.B. der SCT-013-005 liefert 1V bei 5A.
      Im Messbereich 2V der I2AE18 können Sie die Spannung gut messen.

  10. Michael Rowland

    Hello,

    I really love your products that I bought in your store. I have made some projects with Codesys and Raspberry PI.
    Can you please send me by mail a copy of the FB for Codesys for 18-bit card with the MCP3424.

    I really appreciate you help.
    Kind Regards,
    Michael.

    • I have sent you the FB by mail.
      You may use and copy the FB for your own projects.
      Please do not post the code on the internet or in forums.
      Thank you

  11. Hallo,

    zunächst einmal vielen Dank für die ganzen Informationen und Beispiele!

    Ich möchte, so wie mit der AI-Karte möglich, mit dem MCP3424 4-20mA Sensoren einlesen.
    Muss hierzu nur der Jumper bei MA gesteckt sein, oder zusätzlich noch jener bei RS?
    Das ist mir aus dem Datenblatt nicht ganz klar geworden und ich bin darin auch noch nicht so versiert.

    Viele Grüße

    • wenn Sie 0-20mA Messen wollen, dann können Sie den Jumper M stecken wenn der Fühler und der GND das gleiche Potential haben.

      • Hallo,
        Kann man 4-20mA Sensoren mit 24V direkt an CHn+ und CHn- verbinden? Wie soll ich der Jumper stecken? Vielen Dank!
        Viele Grüße

        • Hallo,
          hier eine Skizze wie 2-Draht oder auch 4-Draht Sensoren mit 0-20mA oder 4-20mA Ausgangssignal an der I2C-Analogkarte mit dem MCP3424 angeschlossen werden.
          Die Jumper mA und RS setzten.
          2-Draht oder 4-Draht Sensoren am MCP3424

  12. Hallo Hr. Horter,
    würde mich freuen, wenn Sie mir den Codesys-FB für den MC3424 zuschicken könnten.
    Danke!

  13. Moin, wie müsste Ihr FB (und eventuell der Vorwiderstand?) geändert werden, wenn ich einen PT100-Fühler (Messbereich -50..+400°C) direkt auslesen wollen würde?

    • Hallo,
      mit einem PT100 wird das nichts, weil der Spannungsabfall am PT100 bei einem Messstrom von 1mA zu klein ist, als dass man ihn ohne Messverstärker auswerten kann.
      Setzen Sie besser einen PT1000 für Ihr Vorhaben ein.
      Folgende Werte hat der PT1000 bei den genannten Temperaturen lt. Tabelle:

      -40°C =>  842,707 Ohm 
      +400°C => 2470,920 Ohm

      Daraus ergibt sich ein Spannungsabfall bei einem PT1000-Messstrom von 1mA

      -40°C => 0,84 V  
      +400°C => 2,48 V 

      Wenn Sie den 2V Spannungsbereich am I2AE18 Modul einstellen können Sie nicht bis 400°C messen sondern nur bis ca. 260°C.
      Wenn 400°C tatsächlich benötigt werden, muss der Spannungsteiler 120k / 30k (1:5) geändert werden. z.B. auf 1:1,25
      Das ist sogar relativ einfach, weil man die beiden Widerstände einfach vertauschen muss 🙂

        R1  R11  Verhältnis 
       120k   30k      5 : 1 
        30k  120k   1,25 : 1 

      Der Messbereich ist dann 0-2,5V

      Eine Konstantstromquelle kann man relativ einfach mit einem LM317 bauen.
      Am ADJ braucht der 1,25V Ein 1,25 kOhm Widerstand als Rv bringt genau 1mA Messstrom für den PT1000.
      Es wäre auch möglich den Messstrom noch etwas kleiner zu machen, so dass der Spannungsabfall am PT1000 unter 2V bei 400°C liegt.

      Ich poste bei Gelegenheit mal einen Schaltungsvorschlag wie eine Konstantstromquelle mit dem LM317 aussehen könnte.

  14. Hallo zusammen,
    ich würde das Modul gerne in Kombination mit einem Raspberry pi 3 b+ (mit Repeater) und Python als Programmiersprache nutzen. Hat jemand so etwas schon mal programmiert, bzw. gibt es dazu mittlerweile Beispiele die mir den Einstieg etwas erleichtern? Google hilft mir leider nur wenig.
    Vielen Dank
    Grüße Christian

  15. Hallo,
    kann man die I2C-Analog-Input 4 Kanäle / 18 Bit mit MCP3424 auch mit Codesys verwenden?

    • Hallo Klaus,

      für die 18-Bit Karte mit dem MCP3424 habe ich einen Codesys-FB programmiert, den ich dir per Mail zuschicken kann.
      Einfach in dein Projekt kopieren, Adresse parametrieren und die gewünschte Auflösung am linken Fuß des FBs parametrieren.
      Wenn due einen Kanal nicht verwendest einfach 0 eintragen.

      Codesys-Funktionsbaustein für Analogeingabe 4-Kanal I2AE18 mit MCP3424

      • Guten abend,
        Ich würde mich freuen wenn sie ir den Baustein zuschicken können,
        damit ich es einfacher habe.
        Mit freundlichen Grüßen
        Stefan H.

        • Hab ich Ihnen per Mail zukommen lassen.
          Viel Erfolg 🙂

          • Würde mich anschließen, würdest du den Baustein weitergeben? Das wäre großartig. Ich sitze seit Tagen an dem ADS1115 von Adafruit und verzweifle, würde mir dann einfach den MCP3424 bestellen und hätte das Thema vom Tisch. Vielen Dank und liebe Grüße!

          • klar gebe ich den Baustein weiter.
            Bitte bei der Online-Bestellung im Feld „Bemerkungen“ eintragen.

      • Hallo
        auch ich möchte die „I2C-Analog-Input 4 Kanäle / 18 Bit mit MCP3424“ mit Codesys verwenden.
        Kann ich die Karte direkt mit dem Codesys-FB auslesen oder braucht es noch einen Treiber?
        Ich würde mich freuen wenn Sie mir den Codesys-FB ebenfalls zuschicken könnten.
        Gruss EF

      • Hallo Herr Horter

        Unter Excel 2019 laufen die Makros nicht mehr.

        Declare Function OPENCOM Lib "Port.dll" (ByVal A$) As Integer
        Declare Sub CLOSECOM Lib "Port.dll" ()
        Declare Sub SENDBYTE Lib "Port.dll" (ByVal b%)
        Declare Function READBYTE Lib "Port.dll" () As Integer
        Declare Sub DELAY Lib "Port.dll" (ByVal b%)

        (64Bit- Problem)

        Ich kann im Internet nicht finden.
        Haben Sie dafür eine Lösung?

  16. Ich finde dies „I2C-Analog-Input 4 Kanäle / 18 Bit mit MCP3424“ leider nicht im Shop.
    Gibt es das Teil, was kostet es, und gibt es ein Beispiel für Arduino?

  17. Hallo,

    schade das bei dieser Platine der MCP3424 nicht verlötet ist. Bei den anderen Platinen sind die SMD Bauteile bereits aufgelötet.

    • Hallo,
      bitte sprechen Sie das der Bestellung im Onlineshop im Feld Bemerkungen an. Dann löte ich Ihnen den Baustein auf.
      Vielleicht mache ich auch eine Option im Shop wie beim I2C-iplexer / I2C-Switch.

  18. Gibt es einen Sketch für Arduino?

Schreibe einen Kommentar

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