adc mit mcp3008 – · 2018. 7. 22. · adc mit mcp3008 – seite 2 adc mit mcp3008 er esp32 bring...
TRANSCRIPT
ADC mit MCP3008 – https://erik-bartmann.de/
ESP32 Pico-Board
ESP32 Addon
ADC- mit dem
MCP3008
Vers. 1.0
© by Erik Bartmann, Juli 2018
ADC mit MCP3008 – https://erik-bartmann.de/ Seite 2
ADC mit MCP3008
er ESP32 bring von Hause aus
schon eine Analog/Digital-
Wandlung mit. Ich hatte es in meinem
ESP32-Praxisbuch [1] in Hack 10 ab
Seite 150 schon beschrieben.
Dennoch kann es
sinnvoll sein, einen
externen
Analog/Digital-
Wandler, wie z.B. den
MCP3008 [2] mit einer 10-Bit-
Auflösung oder den MCP3208
mit einer 12-Bit-Auflösung zu
verwenden. Die Gründe dafür können
unterschiedlich sein. Viele kennen diese
beiden Bausteine vielleicht
vom Arduino- bzw.
Raspberry Pi-Umfeld und
wissen, wie sie zu
handhaben sind. Die
Programmierung kann
aus den Arduino-Sketchen
sehr einfach übernommen werden.
Ich möchte in diesem Addon den
MCP3008 zur Sprache bringen und
einige Beispiele anführen.
D
ADC mit MCP3008 – https://erik-bartmann.de/
3 Analog/Digital-Wandlung mit dem MCP3008
Die MCP3008-Library er MCP3008 und auch der MCP3208 wird über den SPI-Bus betrieben bzw.
angesteuert. Natürlich verfügt der ESP32 über einen derartigen Bus. Die
hardwareseitigen Pins sind auf der folgenden Abbildung zu sehen. Sie befinden sich an
IO 19, IO23, IO18 und IO05.
Abbildung 1 Die IO-Pins des SPI-Bus (IO19, IO23, IO 18 und IO05)
Zu Nutzung des MCP3008 über den SPI-Bus kann eine fertige MCP3008-Library [3]
genutzt werden, die von Adafruit zur Verfügung gestellt wird. Diese Library unterstützt
die Verwendung aller IO-Pins, die nicht für den SPI-Busbetrieb vorgesehen sind.
Nähere Hinweise sind aus den vorhandenen Beispielen der Library zu ersehen. In
unserem Addon nutzen wir jedoch IO 19, IO23, IO18 und IO05.
Der MCP3008 Kommen wir nun zum MCP3008. Es handelt sich um einen integrierten Schaltkreis, der
in einem DIL-Gehäuse (Dual-In-Line) untergebracht ist und 16 Beinchen besitzt. Er
übermittelt seine Messwerte über die sogenannte SPI-Schnittstelle. Diese Abkürzung
steht für Serial Parallel Interface und ist ein von Motorola entwickeltes Bus-System, um
zwischen integrierten Schaltkreisen mit möglichst wenigen Leitungen Daten
auszutauschen. SPI bezeichnet nicht nur den Bus, sondern auch das Protokoll. Die
Übertragung ist ein synchron-serielles Verfahren, wie es z.B. auch beim I2C (Inter-
Interchanged Circuit) verwendet wird. Sehen wir uns dazu einmal das Prinzip an,
wonach der SPI-Bus arbeitet.
D
ADC mit MCP3008 – https://erik-bartmann.de/
4 Analog/Digital-Wandlung mit dem MCP3008
Abbildung 2 Das Master-Slave-Prinzip des SPI-Busses
Es existieren 4 Leitungen, die vom Master zum Slave oder auch mehreren Slaves
führen. Dieser integrierte Baustein besitzt 8 unabhängig voneinander arbeitende
Eingänge, die jeweils eine Auflösung von 10-Bits besitzen. Das ist schon eine Menge an
Funktionalität, die so ein Baustein bereitstellt und das alles wird über 4 Leitungen
gehandhabt. Ist ein Datentransfer nur in eine Richtung notwendig, kann die
Kommunikation über 3 statt 4 Leitungen erfolgen. Wie aber funktioniert SPI? Damit
eine Kommunikation zustande kommt, müssen Daten in beide Richtungen fließen. Also
vom Master zum Slave und umgekehrt. Das alles erfolgt über zwei getrennte
Leitungen.
MOSI (Master-Out-Slave-In)
MISO (Master-In-Slave-Out)
Für jede Richtung wird eine einzige Leitung benötigt. Die Datenübertragung erfolgt
zwischen den beiden Busteilnehmern - wie schon erwähnt - synchron und seriell. Da
der Master der Hauptverantwortliche bei dieser Kommunikation ist, wird die MOSI-
Signalleitung auch als Serial-Data-Out, kurz DO bezeichnet, wobei die MISO-
Signalleitung im Gegensatz dazu als Serial-Data-In, kurz DI arbeitet. Nun können diese
Signale nicht einfach so auf den Bus gelegt werden. Es fehlt eine
Synchronisationsinstanz, damit alle wissen, wann welche Signale kommen bzw. wann
sie zeitlich beginnen bzw. enden. Aus diesem Grund gibt es noch die SCLK-Leitung
(Serial-Clock), die quasi den Schiebetakt vom Master zum Slave und umgekehrt
vorgibt, vergleichbar mit dem Paukenschlag auf einer Galeere. Mit jedem Clock-Impuls
wird ein Datenbit über die MOSI-Leitung vom Master zum Slave bzw. auf der MISO-
Leitung vom Slave zum Master übertragen. Zu guter Letzt müssen noch die am Bus
angeschlossenen Teilnehmer (Slave) ausgewählt werden, damit klar ist, zu wem eine
Kommunikation aufgebaut werden soll. Wir nutzen in unserem Beispiel nur einen
einzigen Slave. Dafür ist die CS-Leitung (Chip-Select), die auch in manchen Fällen SS-
ADC mit MCP3008 – https://erik-bartmann.de/
5 Analog/Digital-Wandlung mit dem MCP3008
Leitung (Slave-Select) genannt wird, verantwortlich. Sehen wir uns doch zunächst
einmal den integrierten Baustein MCP3008 aus der Nähe an.
Abbildung 3 Die Pinbelegung des Analog(Digital-Wandlers MCP3008
Der integrierte Schaltkreis ist schön symmetrisch aufgebaut, so dass sich die analogen
Eingänge aus dieser Sicht allesamt auf der linken Seite befinden. Auf der rechten Seite
müssen wir die Spannungsversorgung und die Steuerleitungen anschließen. Das ist
aber absolut kein Hexenwerk. Schauen wir uns zunächst die Leitungen auf der rechten
Seite des Bausteins an:
VDD (Spannungsversorgung: 3.3V)
VREF (Referenzspannung: 3.3V)
AGND (Analoge Masse)
(S)CLK (Clock)
DOUT (Data-Out vom MCP3008)
DIN (Data-In vom ESP32)
CS (Chip-Select, LOW-Aktiv)
DGND (Digitale Masse)
Die eigentliche Kommunikation findet über die beiden Leitungen DOUT und DIN statt.
Die analogen Eingänge befinden sich auf der linken Seite des Bausteins, wobei die
einzelnen Pins die Bezeichnung CH0 bis CH7 besitzen. Es handelt sich um die 8 Kanäle
des AD-Wandlers. Wie wir die Kanäle ansteuern, sehen wir gleich im Schaltplan. Der
Pin VREF wurde bei uns mit 3.3V versehen, so dass die Eingangsspannung von 0V bis
3.3V schwanken darf. Die Frage, die sich uns sicherlich an dieser Stelle aufdrängt ist die
Folgende: „Wenn wir eine 10-Bit Auflösung haben, wie groß bzw. klein ist die
Spannung pro Bit?“ Schauen wir zuerst einmal, wie viele unterschiedliche
Bitkombinationen wir mit 10-Bits erreichen können.
ADC mit MCP3008 – https://erik-bartmann.de/
6 Analog/Digital-Wandlung mit dem MCP3008
Dies wird über die folgende Formel berechnet:
𝐴𝑛𝑧𝑎ℎ𝑙 𝑑𝑒𝑟 𝐵𝑖𝑡𝑘𝑜𝑚𝑏𝑖𝑛𝑎𝑡𝑖𝑜𝑛𝑒𝑛 = 2𝐴𝑛𝑧𝑎ℎ𝑙 𝑑𝑒𝑟 𝐵𝑖𝑡𝑠
𝐴𝑛𝑧𝑎ℎ𝑙 𝑑𝑒𝑟 𝐵𝑖𝑡𝑘𝑜𝑚𝑏𝑖𝑛𝑎𝑡𝑖𝑜𝑛𝑒𝑛 = 210 = 1.024
Wenn wir jetzt die Referenzspannung von 3.3V durch diesen Wert dividieren, dann
erhalten wir den Spannungswert pro Bit-Sprung.
𝑈 = 𝑈𝑅𝐸𝐹
1024=
3,3𝑉
1024= 0,003222𝑉 = 3,2𝑚𝑉
In der folgenden Grafik habe ich das einmal versucht, grafisch darzustellen.
Jedes, der einzelnen Unterteilungseinheiten entspricht einem Spannungswert von
3.22mV. Wenn wir nun die anliegende Spannung berechnen möchten, dann müssen
wir lediglich den ermittelten Wert, der sich zwischen 0 und 1023 bewegen kann, mit
3.2mV multiplizieren. Hier ein kleines Beispiel dazu. Das Programm, das wir uns gleich
anschauen werden, liefert z.B. einen Wert von 512 zurück, was bedeutet, dass wir
folgenden Spannungswert am analogen Eingang anliegen haben:
𝐵𝑒𝑟𝑒𝑐ℎ𝑛𝑒𝑡𝑒 𝑆𝑝𝑎𝑛𝑛𝑢𝑛𝑔 = 512 ∙ 3,22𝑚𝑉 = 1,65𝑉
Und hey... das ist genau die Hälfte von UREF, denn 2-mal 1.65V entsprechen 3.3V.
Warum? Ganz einfach: 512 ist auch genau die Hälfte von 1024. Doch nun haben wir
erst einmal genug gerechnet.
ADC mit MCP3008 – https://erik-bartmann.de/
7 Analog/Digital-Wandlung mit dem MCP3008
Bevor wir uns der Programmierung widmen, werfen wir einen Blick auf den Schaltplan.
Abbildung 4 Der Schaltplan zur Ansteuerung des MCP3008
Auf der rechten Seite sehen wir unseren A/D-Wandler MCP3008, der über die
Spannungsversorgungs- als auch Kommunikationsleitungen mit dem ESP32 verbunden
ist. Des Weiteren habe ich ein 10 KΩ Potentiometer mit dem Kanal 0 des Bausteins
verbunden. Das Potentiometer arbeitet wie ein variabler Spannungsteiler, der in
Abhängigkeit von der Schleiferposition zwischen den beiden Potentialen Masse bzw.
VDD vermittelt und das Signal an den analogen Eingang legt. Ein einfacher
Spannungsteiler wird wie folgt mit 2 Widerständen aufgebaut.
Abbildung 5 Der Spannungsteiler
ADC mit MCP3008 – https://erik-bartmann.de/
8 Analog/Digital-Wandlung mit dem MCP3008
In Abhängigkeit des Widerstandsverhältnisses wird die Eingangsspannung U an den
beiden Widerständen R1 und R2 aufgeteilt und liegt als Ausgangsspannung U2 am
Widerstand R2 an. Die Ausgangsspannung berechnet sich wie folgt:
𝑈2 = 𝑅2
𝑅1 + 𝑅2 ∙ 𝑈
Ein Potentiometer kann als variabler Spannungsteiler angesehen werden, der die
Widerstände R1 und R2 in Abhängigkeit der Schleiferposition verändert.
Abbildung 6 Das Potentiometer als variabler Spannungsteiler
Übertragen auf die festen Widerstände R1 bzw. R2 verhält sich das Potentiometer wie
folgt.
Abbildung 7 Die Widerstandsverhältnisse bei zwei Potentiometerstellungen
Wir sehen, dass uns dieses Bauteil eine wunderbare Möglichkeit bietet, eine
vorhandene Spannung in den gegebenen Grenzen zwischen Masse und VDD zu regeln.
ADC mit MCP3008 – https://erik-bartmann.de/
9 Analog/Digital-Wandlung mit dem MCP3008
Der ESP32-Code ür einen ersten Test können wir den folgenden Sketch verwenden, der nicht weiter
kompliziert ist und wie folgt ausschaut.
#include <Adafruit_MCP3008.h>
Adafruit_MCP3008 adc;
void setup()
Serial.begin(9600); // Init Serial
adc.begin(); // MCP3008 initialisieren
void loop()
Serial.println(adc.readADC(0));
delay(100); // Kurze Pause
Natürlich müssen wir vor der Verwendung ganz zu Beginn die Adafruit-MCP3008-
Library einbinden. Im Anschluss erfolgt über die Zeile
Adafruit_MCP3008 adc;
eine Instanziierung des Adafruit_MCP3008-Objekts mit dem Namen adc. In der setup-
Funktion werden die serielle Schnittstelle und das adc-Objekt über die begin-Methode
initialisiert. Nun kann innerhalb der kontinuierlich aufgerufenen loop-Funktion die
readADC-Methode mit der Angabe des verwendeten Kanals - bei uns CH0 - aufgerufen
werden, um darüber den analogen Wert am Kanal 0 zu ermitteln. Wir lassen uns den
zeitlichen Verlauf des analogen Wertes über den Serial-Plotter der Arduino-IDE
anzeigen, der über den folgenden Menüpunkt aufgerufen wird.
F
ADC mit MCP3008 – https://erik-bartmann.de/
10 Analog/Digital-Wandlung mit dem MCP3008
Abbildung 8 Der Aufruf des Seriellen Plotters
Ich habe ein wenig an meinem Potentiometer gespielt und verschiedene Positionen
angefahren. Das Ergebnis schaute wie folgt aus.
Abbildung 9 Der zeitliche Verlauf an einem analogen Eingang
Auf diese Weise können natürlich alle 8 zur Verfügung stehenden analogen Eingänge
des MCP3008 abgefragt werden.
ADC mit MCP3008 – https://erik-bartmann.de/
11 Analog/Digital-Wandlung mit dem MCP3008
Der Schaltungsaufbau auf dem
Discoveryboard Der Schaltungsaufbau auf dem Discoveryboard ist denkbar einfach und schnell
umgesetzt.
Abbildung 10 Der Schaltungsaufbau mit dem MCP3008 auf dem Discoveryboard
Es muss nur auf die richtige Ausrichtung anhand der Einkerbung des DIL-Gehäuses des
MCP3008 geachtet werden. Andernfalls nimmt das IC Schaden und kann zerstört
werden.
Frohes Frickeln
ADC mit MCP3008 – https://erik-bartmann.de/
12 Analog/Digital-Wandlung mit dem MCP3008
Das ESP32-Praxisbuch
[1] https://www.elektor.de/das-esp32-praxisbuch
[2] https://cdn-shop.adafruit.com/datasheets/MCP3008.pdf
[3] https://github.com/adafruit/Adafruit_MCP3008
https://www.erik-bartmann.de/