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