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 (595 Downloads)

 

 

 

 

41 Kommentare

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

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

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

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

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

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

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

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

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

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

    • 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

          • 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

Schreibe einen Kommentar

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