Nachdem es neulich problemlos klappte, ein Platinchen mit einem
ADS1015 an einem Arduino in Betrieb zu nehmen soll das jetzt auch
in Bascom programmiert werden.
Anfangs hat mich das ein bisschen "gefoppt", aber es lag nur an einer winzigen
Kleinigkeit...........
ein bisschen Info am Rande:
Vor einiger Zeit habe ich ja schon mal erfolgreich den MCP3428 (16bit I²C AD-Wandler)
in Betrieb genommen, und damit hervorragende Messergebisse erreicht.
Die ganz entscheidende Eigenschaft ist das Vorhandensein von differentiellen Eingängen!
Es wird also nicht nur gegen GND gemessen, sondern gegen einen Referenz-Pin.
Das ist die Entscheidende Eigenschaft, um mit dem LEM HASS200-S hochpräzise zu messen.
Der ADS1015(12Bit) bzw ADS1115(bis 16Bit) und seine Verwandten sind eigentlich sehr
ähnlich wie der MCP3428 und dessen Verwandte.
Im Vergleich zum MCP3428 ist der ADS1115 jedoch wesentlich schneller!
Während der MCP bei 12Bit 240Messungen, bei 14Bit 60Messungen und bei 16Bit
nur noch 15 Messungen pro Sekunde schafft macht der ADS1115 selbst im 16Bit-Modus
noch gewaltige 860 Messungen pro Sekunde!!!!!
Für den geplanten Einsatz in der "Franzbox" ist so viel Leistung gar nicht nötig, aber schaden tuts auch nicht.Mehr als 14Bit Auflösung ist hier auch gar nicht nötig.
Öfter zu messen als ca 15 Mal pro Sekunde ist auch nicht nötig.insofern ist der MCP3428
auch schon ausreichend schnell
Beide Wandler arbeiten mit einer internen Referenz von 2,048V und haben einen
jederzeit umkonfigurierbaren "Gain amplifier"
Die Referenz 2,048 sorgt für direkt verwendbare Ausgangswerte in Volt
Der Einstellbereich reicht beim ADS von 1/3 ; 1/2 ; 1x ; 2x ; 4x bis 8x
also von +-6,144V bis +-0,256V
Beim MCP ist 1x ; 2x ; 4x ; 8x einstellbar also +- 2,048 bis +- 0,256V
Es ist hierbei zu beachten, dass kein Pegel das Potential der Versorgung überschreiten darf,
also nicht unter 0V und über der Versorgungsspannung (ca2V-5,5V je nach Typ)
Der maximale Ausgangswert beträgt dabei:
12Bit: -2048 bis 2047 entspricht x 1mV
14Bit: -8192 bis 8191 entspricht x 250µV
16Bit -32768 bis 32767 entspricht x 62,5µV
....das alles bei Gain = 1
Die bestmögliche Auflösung bei 16Bit und Gain = x8 beträgt somit 7,8125µV!
Das sind 0,000007815V je Digit bei +-0,256V Messbereich
Das reicht auch jederzeit um einen Shunt direkt zu messen und auszuwerten.
Hierbei ist natürlich "galvanische Trennung" zwingend nötig, was bei I²C nicht
so ganz trivial ist. Hier wäre SPI von Vorteil.
In den meisten Bereichen hat der ADS die Nase vorn, was kann denn der MCP besser?
In erster Linie hat der MCP vier differentielle Eingänge auf acht pins während der
ADS nur vier Eingangspins hat und so entweder vier mal gegen GND
bzw pin0 gegen Pin1 und Pin2 gegen Pin3 oder Pin0 bis Pin2 gegen Pin3 messen kann.
Ausserdem ist die Ansteuerung des MCP ein bisschen einfacher.
Es müssen etwas weniger Daten übertragen werden, aber letztendlich geben beide
die gleichen Werte aus
Wie liest man denn nun den ADS1015 bzw ADS1115 in Bascom aus?
Der Einfachheit halber nur die entscheidenden Sequenzen.
(den eigentliche Programmaufbau setze ich einfach mal als bekannt voraus)
Die jeweiligen Konfigurationen sind aus meinem Programm übernommen
und können natürlich an die jeweiligen Bedürfnisse angepasst werden.
Die Einzelheiten sind im Datenblatt mehr oder weniger verständlich erklärt.
Ich will da jetzt nicht allzusehr ins Detail gehen, sondern alles nur mal
ganz einfach und verständlich beschreiben wie es grundsätzlich geht.
Ini-Sequenz:
erst mal I²C starten:
Enable Interrupts
Config Sda = Portc.4 'Ports bestimmen
Config Scl = Portc.5
I2cinit I²C starten
.........hier nur "Software-SPI" aber schon mal die Hardware-Pins beim Atmega XX8
dann Konfiguration senden:
z.B.:
I2cstart
I2cwbyte &B10010000 'Adresse senden an Schreib-Adresse
I2cwbyte &B00000001 'Config-Register ansprechen
I2cwbyte &B00000100 'MSB des Config-Register senden
I2cwbyte &B10000011 'LSB des Config-Register senden
I2cstop
wieder umschalten auf Lese-Modus
I2cstart
I2cwbyte &B10010000 'Adresse senden
I2cwbyte &B00000000 'Lese-Register ansprechen
I2cstop
I2cstart
I2cwbyte &B10010001 'Adresse senden an Lese-Adresse
I2crbyte Read1a , Ack 'MSB des Messwertes lesen
I2crbyte Read1b , Nack 'LSB des Messwertes lesen
I2cstop
.........das wars eigentlich schon.......
Die Konfiguration und das Umschalten in den Lesemodus müssen zwar nur einmalig
erfolgen, es schadet aber nicht, das gelegentlich "aufzufrischen"
Auch bei einem Wechsel des Eingangs oder sonstiger Einstellungen
ist die komplette Sequenz nötig
Umrechnen der Werte in positive und negative Zahlen
Read1a wird als Byte gelesen, ist aber für die nachfolgende Berechnung als Word definiert
Read1b im Beispiel sind als Byte definiert
Read1aint ist als Integer definiert
Die beiden Byte müssen erst mal zu einem "Word" zusammengefügt werden
"zu Fuß" geht das so: (geht auch eleganter, ist dann aber nicht so verständlich)
Read1a = Read1a * 256 'High-Byte nach oben schieben
Read1a = Read1a + Read1b 'Low-Byte einfügen
Read1aint = Read1a 'Word in Integer ergibt Vorzeichen
Fertig! Der Messwert kann nun weiterverarbeitet werden
Der selbe Lesevorgang bei einem MCP3426
Konfiguration senden:
I2cstart
I2cwbyte &B11010000 'Adresse senden an Schreib-Adresse
I2cwbyte &B00010000 'Konfiguration senden (hier: Kanal1, 12Bit)
I2cstop
......Hier gibt es nur ein (1) Kofigurationsbyte!
Umschalten in Lesemodus ist hier nicht nötig!
Lesen:
I2cstart
I2cwbyte &B11010001 'Adresse senden an Lese--Adresse
I2crbyte Read1a , Ack 'MSB des Messwertes lesen
I2crbyte Read1b , Ack 'LSB des Messwertes lesen
I2crbyte Read1c , Nack 'Konfigurationsbyte lesen
I2cstop
..........Beim Lesen gibt es hier auch noch ein drittes Byte
Inhalt: Konfiguration und ein "Ready-Bit" das muss nicht immer
ausgewertet werden, ist z.B. nützlich bei Einzelmessungen um sicher zu gehen, dass
der Wert aktuell ist
Zusammenfügen der Byte zu einem Integer-Wert wie oben beim ADS
Diese AD-Wandler (MCP und ADS) kann man jederzeit während des Betriebs "umparametrieren"
Man kann da also schön spielen! z.B. die Auflösung bei niedrigen Analogwerten
erhöhen etc......
Bis demnächst mal wieder!
Franz