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
10 = 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
    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 yV / Digit
    TextBox_AIN1.Text = byte2Dec(d(1), d(2))
    'Spannung = Digitalwert * 250 [yV]
    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 ' 14 Bit = 62,5 yV / Digit
    TextBox_AIN1.Text = byte2Dec(d(1), d(2))
    'Spannung = Digitalwert * 62.5 [yV]
    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 ' 14 Bit = 15,625 yV / Digit
    TextBox_AIN1.Text = byte2Dec(d(1), d(2), d(3))
    'Spannung = Digitalwert * 15.625 [yV]
    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 begative 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 (281 Downloads)

 

 

 

 

35 Kommentare

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

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

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

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

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

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