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

 

 

 

 

12 Kommentare

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

Schreibe einen Kommentar

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