
ESP32 Kapazitätsmessung
Elektronik-Labor Projekte Mikrocontroller

Unter
den besonderen Eigenschaften des ESP32 findet man die Touch-Sensoren.
Insgesamt gibt es zehn Eingänge dafür, sodass man zehn Berührungstasten
bauen könne. Mich hat interessiert, wie sie arbeiten.
Man braucht nur eine Zeile, um einen solchen Touch-Eingang
abzufragen. Irgendeine Art von Initialisierung ist dazu nicht nötig.
Hier wird TOUCH_0 an GPIO4 abgefragt.
Serial.println(touchRead(4));
Als Ergebnis erhält man irgendwelche Zahlen, die deutlich kleiner
werden, wenn man den Pin oder einen Draht daran berührt. Wie das
funktioniert zeigt ein Blick auf das Oszillokop.
Einmal in etwa 2,5 ms sieht man eine Serie Dreiecksimpulse. In
diesem Fall zähle ich 24 Impulse. Und genau dieses Ergebnis zeigt auch
die Abfrage per Software. Aus der Kurvenform wird erkennbar, was
dahinter steckt: Ein RC-Generator mit einem invertierenden
Schmitt-Trigger und einem Widerstand oder entsprechenden FETs. Die
Hysterese ist mit ca. 2 V sehr groß, und die Ergebnisse sind sehr
stabil. Die zeitliche Länge des Impulspakets beträgt immer ca. 90 µs.
Bei 24 Impulsen bedeutet das, dass die Frequenz ca. 270 kHz war.
Ohne alle Verbindungen bekomme ich laufend Messwerte von 85. Wenn ich
nur ein offenes Kabel von 10 cm anstecke, sinken die Werte bereits auf
77. Mit dem Oszilloskop (10 :1) komme ich auf ca. 24. Das Ergebnis
sinkt also mit der Kapazität.
Dann habe ich einen Kondensator mit 120 pF angeschlossen und bekam das
Ergebnis 8. Also 8 * 120 = 960, aufgerundet 1000. Um den Messwert in
die Kapazität umzurechnen ändere ich die Ausgabe:
Serial.println(1000 / touchRead(4));
Im Monitor sehe ich jetzt 125, also 125 pF. Wenn ich allerdings den
Kondensator entferne, bleiben noch 11 pF übrig. Das ist offensichtlich
die innere Kapazität des Ports und die Kapazität der
Steckboard-Kontakte. Diesen Offset muss ich also noch abziehen.
Serial.println(1000 / touchRead(4)-11);
Mein 120pF-Kondensator wird jetzt nur noch mit 116 pF angezeigt, aber
die Auflösung ist in diesem Bereich nur noch gering, da muss man
zufrieden sein. Bei sehr kleinen Kapazitäten ist das Messgerät
dagegen sehr gut. Der Nullpunkt ist stabil, und ein Kondensator mit 6,8 pF wird
mit 7 pF gemessen. Weitere Messungen: Das kurze Kabel hat frei in der
Luft 1 pF. Die Oszi-Messspitze hat in der Einstellung 10:1 20 pF und
bei 1:1 ca. 180 pF, die hautsächlich auf das Kabel zurückgehen. Und
eine kleine LED zeigt in Sperrrichtung 5 pF.
Für die Entwicklung habe ich diesmal Visual Studio Code mit
PlatformIO verwendet, weil das Kompilieren wesentlich schneller und
problemloser funktioniert als mit der Arduino IDE.
#include <Arduino.h>
// Touch Sensor
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print(1000 / touchRead(4)-11);
Serial.println(" pF");
delay (1000);
}
Elektronik-Labor Projekte Mikrocontroller