Unsere analoge Eingangskarte haben wir weiterentwickelt.
Folgende Verbesserungen haben wir in das neue Design einfließen lassen
- Acht Eingangskanäle je 10 Bit
- Abtastrate 250 Hz
- Busanschluss-Stecker
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 250 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.
Downloads
Allgemeines
Die neue Analog-In Karte verfügt über insgesamt 8 AD Wandler mit einer Auflösung von 10 Bit. Die Analog-In Karte ist komplett Register gesteuert. Alle Daten werden in lese- und schreibbaren Registern gespeichert.
Außerdem hat die Karte zwei Stecker für den Busverbinder bekmmen.
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 17 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
Byte 12 Analogwert 6 Low Byte
Byte 13 Analogwert 6 High Byte
Byte 14 Analogwert 7 Low Byte
Byte 15 Analogwert 7 High Byte
Byte 16 Analogwert 8 Low Byte
Byte 17 Analogwert 8 High Byte
Beispiel für I2C-RS232-Modem 2 oder I2C-USB-Modem
Im Beispiel wird mit dem Befehl 51 das Auslesen der 17 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 (17) '17 Byte lesen
SENDBYTE (4) 'Endekennung
If Modem_Antwort = True Then
'Analogwerte eintragen
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)
TextBox_AIN6.Text = D(13) * 256 + D(12)
TextBox_AIN7.Text = D(15) * 256 + D(14)
TextBox_AIN8.Text = D(17) * 256 + D(16)
Else
MsgBox ("Fehler bei I2C-AIN")
End If
End Sub
Hallo Herr Horter,
Ich arbeite mit einen RaspberryB Python3 und smBus Modul
Die Eingangsbaugruppen mit dem PCF8574 kann abfragen und das klappt sehr gut
Probleme habe ich bei der abfrage de Analogeingänge der 8kanal 10bit Baugr.
hardware scheint in ordnung zu sein (wird als adr hex08 erkannt und die geteilte spannung liet am IC(I2C-AE8-PIC) an
Mit welchen kommandos kann ich den PIC in PHYTON3/SMbus füttern/abfragen
Gibt es Programmbeispiele in PHyton3 zum „abkupfern“
Vielen Dank für Ihre Mühe
Hans Günter
Hallo Hans Günter,
hier finden Sie Beispiele für Phyton I2C-Analog-Input-Modul mit Python und TkInter
Die 8-Kanal Input Baugruppe läuft prinzipiell genau wie die 5 kanalige.
Sie müssen anstatt 11 Bytes nur 17 Bytes lesen und entsprechend aus multiplizieren.
Leider kann es bei Phyton vorkommen, dass der erste Kanal nicht richtig eingelesen wird. Wir hatten erst Clock-Stretching in Verdacht aber der Analogbaustein macht kein Clock-Stretching mehr, sondern stellt die Analogwerte eigentlich sofort zur Verfügung.
Unter C scheint es keine Probleme zu geben. Nur die smBus-lib hat hier Probleme. Wir suchen noch nach der Ursache.
Funktioniert die 8*12 bit Karte identisch zur 8*10 bit Karte (evtl. abgesehen von der Skalierung)?
Funktioniert mit der Karte das C Programm „I2C-Analog Input am PI mit C einlesen“?
Momentan bricht das Programm bei mir immer ab mit
(program exited with code: 1)
Die Karte selbst finde ich mit i2cdetect unter der Adresse 16#8
Die Datenstruktur ist bei der 12-Bit Analog-IN Karte (I2AE8C) die gleiche wie bei der 10-Bit (I2AE8)
Können Sie mal versuchen die Register mit dem Befehl
i2cdump -y 1 0x08
zu lesen
Hallo Herr Horter,
Wir haben die Analogbaugruppe auf einer Autarken Hütte in Betrieb um sämtliche Daten zu erfassen. Nun würde gerne an einem Analogeingang 0-60V messen. Was für Eingangswiderständen müsste ich einbauen?
Mit freundlichen Grüßen
Dominik
Hallo Dominik,
Die Spannung am Eingang des PICs mus 0-2,048V Betragen.
Du brauchst theoretisch einen Spannungsteiler 60:2.
In der Widerstandsreiche E24 gibt es aber keine exakt passenden Werte
Mit 300k und 10k kommt man auf einen Spannungsbereich von 0..2000 = 0-62V
Du kannst aber auch die Widerstände 0-10V drin lassen und einen Spannungsteiler 1:6 von den Eingang machen.
Das wären dann 100k und 20k
Bei 60V am Spannungsteiler fallen genau 10V am 20k Widerstand ab.
Gruß, JH
Hallo Herr Horter,
auch ich bin stolzer Besitzer eines I2AE8 mit 8 analogen EIngängen und würde mich freuen, wenn Sie mir einen FB schicken würden, mit dem ich in Codesys die Karte auslesen kann.
Mit freundlichen Grüßen
Achim Kern
hab ich geschickt 🙂
Hallo Herr Horter,
Würde mich ebenfalls sehr über den Baustein FB_I2AE8 für codesys freuen.
Können Sie mir ihn zuschicken?
Danke im voraus.
Grüße
Rolf
Hallo Herr Horter,
gibt es für die I2C-Analog Input 8 Kanäle 0-10V 10 Bit eine Codesys Unterstützung oder wie kann man das Device I2HAE für codesys von 5 auf 8 Kanäle ändern?
Viele Grüße
Volker
Hallo Volker,
einen Funktionsbaustein für die Analoge Eingangskarte schicke ich Ihnen per Mail.
Den können Sie dann ganz einfach in Ihr Programm einbauen und parametrieren.
Sehr geehrter Herr Horter,
ich hätte auch sehr gern den Funktionsbaustein. Ich bedanke mich schonmal im Voraus.
Mit freundlichem Gruß
Marcel
Hallo Herr Horter,
ich habe auch das Problem das ich nur die ersten 5 Eingänge des Moduls auslesen kann.
Könnten sie mir bitte auch den Funktionsbaustein zusenden.
Vielen Dank im voraus.
Hallo,
ich hab das Demo-Projekt per Mail geschickt.
Gruß, JH