12
ESP32 Pico-Board ESP32 Addon ADC- mit dem MCP3008 Vers. 1.0 © by Erik Bartmann, Juli 2018

ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

ADC mit MCP3008 – https://erik-bartmann.de/

ESP32 Pico-Board

ESP32 Addon

ADC- mit dem

MCP3008

Vers. 1.0

© by Erik Bartmann, Juli 2018

Page 2: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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

Page 3: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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

Page 4: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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-

Page 5: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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.

Page 6: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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.

Page 7: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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

Page 8: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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.

Page 9: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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

Page 10: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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.

Page 11: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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

Page 12: ADC mit MCP3008 –  · 2018. 7. 22. · ADC mit MCP3008 – Seite 2 ADC mit MCP3008 er ESP32 bring von Hause aus schon eine Analog/Digital-Wandlung mit. Ich hatte es in meinem ESP32-Praxisbuch

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/