Listing 1
Messprogramm
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import time
import ioexpander
PIN_CHARGE = 1
PIN_DISCHARGE = 6
PIN_ADC = 13
R = 1000000 # 1MOhm
def init():
global ioe
print("initializing...")
ioe = ioexpander.IOE()
ioe.set_mode(PIN_CHARGE,ioexpander.PIN_MODE_PP)
ioe.output(PIN_CHARGE,0)
ioe.set_mode(PIN_DISCHARGE,ioexpander.IN)
ioe.set_mode(PIN_ADC,ioexpander.ADC)
ioe.set_adc_vref(3.3)
def discharge():
print("discharging...")
ioe.output(PIN_CHARGE,0)
ioe.set_mode(PIN_DISCHARGE,ioexpander.PIN_MODE_PP)
ioe.output(PIN_DISCHARGE,0)
while True:
u = ioe.input(PIN_ADC)
print(" {0:5.2f}: {1:5.4f}".format(time.monotonic(),u))
if u < 0.001:
break
time.sleep(1)
ioe.set_mode(PIN_DISCHARGE,ioexpander.IN)
def meter():
print("metering...")
start = time.monotonic()
ioe.output(PIN_CHARGE,1)
while True:
u = ioe.input(PIN_ADC)
t = time.monotonic()
print(" {0:5.2f}: {1:5.4f}".format(t,u))
if u > 2.086:
# 2.086/3.3 = 0.6321
break
ioe.output(PIN_CHARGE,0)
t2 = t - start
print("elapsed time: {0:5.4f}".format(t2))
return t2/R
if __name__ == '__main__':
init()
while True:
discharge()
c = meter()
print("capacity: %r" % c)
time.sleep(3)
Den Bypass für die Schnellentladung über den Entlade-Pin steuert das Programm in der Methode discharge(), in dem es den Pin entweder als Output (Wert Low, Zeile 34) oder als Input setzt (Zeile 42). In letzterem Fall bekommt der Pin eine hohe Impedanz, womit die Spannung nicht abfließt.
Die Messung findet in der Methode meter() ab Zeile 44 statt. Sobald die Spannung über den Wert von 2,086 steigt, bricht die Messung ab, berechnet die benötigte Zeit und daraus die Kapazität. Die Abfolge von discharge() und meter() im Hauptprogramm in einer Schleife benötigen wir deshalb, weil zumindest die erste Messung zu unzuverlässig ausfällt und eine mehrmalige Wiederholung und Mittelwertbildung (im Programm nicht implementiert) die Genauigkeit erhöht.
Defizite des RasPi
Auch wenn das Programm aus Listing 1 funktioniert, arbeitet es aus zwei Gründen nicht optimal. Zum einen laufen auf einem RasPi viele Programme gleichzeitig. Die gemessene Zeit enthält somit womöglich Fehler, da das Betriebssystem dem Messprogramm seine Zeitscheiben nicht deterministisch zuteilt.
Der zweite Grund liegt am verwendeten IO-Expander. Darauf sitzt ein Mikrocontroller, der die Pins bereitstellt und die eigentliche Messung vornimmt. Die Kommunikation und der Overhead der Bibliothek sorgen für eine vergleichsweise schlechte zeitliche Auflösung von 0,023 Sekunden auf einem RasPi Zero.
Besser eignen sich Mikrocontroller, wie man sie aus der Arduino-Welt kennt, oder ein Chip, der CircuitPython unterstützt. Der Trinket-M0 für unter 10 Euro wäre dafür eine gute Wahl. Das Programm läuft darauf mit minimalen Änderungen, der Gewinn an zeitlicher Auflösung steigt enorm. Im Gegensatz zu den 42 Messungen pro Sekunde beim IO-Expander schafft der Trinket über 7000. Das Programm für den Trinket, das auch die Ausgabe schöner formatiert, finden Sie im Github-Projekt des Autors [2] im Unterverzeichnis cap-meter/. Je nach Kapazität gibt es den gemessenen Wert skaliert mit passendem Postfix wie nF oder µF aus.
Mit ein paar Anpassungen der Pin-Nummern läuft das Programm auch auf dem brandneuen Pico, für den es ebenfalls einen CircuitPython-Port gibt. Dessen RP2040-Chip, ein Dualcore Cortex-M0+ mit 133 MHz, ist eng verwandt mit dem Chip auf dem Trinket – dort werkelt ein Singlecore Cortex-M0+ mit 48 MHz. Das schlägt sich auch in der zeitlichen Auflösung nieder. Der Pico schafft über 60 000 Messungen pro Sekunde, wobei die Zahl im Test erratisch schwankte und teilweise doppelt so hoch lag.
Weitere Alternativen finden Sie in Form von ADCs wie dem MCP3002 oder MCP3008, die ihre Messwerte per SPI liefern. Das Einrichten samt Python-Programm erklärt der Artikel “Laboreinsatz” aus RPG 05-06/2018 [3]. Dort ging es um das Messen von Spannung und Stromstärke mittels ADCs.
Experimente
Dieses einfache Messgerät weckt den Forschergeist und eröffnet Möglichkeiten für weitere interessante Experimente. Das Datenblatt [4] der beliebten Z5U-Keramikkondensatoren etwa zeigt in einer Grafik die Alterung der Bauteile (Abbildung 5). Das Datenblatt erklärt auch, dass eine Erhitzung auf 150 Grad Celsius für 1,5 Stunden oder 125 Grad Celsius für 2 Stunden die volle Kapazität wiederherstellt. Aber Vorsicht: Elektrolytkondensatoren sollten Sie auf keinen Fall so behandeln.

Abbildung 5: Abnahme der Kapazität mit der Zeit. Das Diagramm verläuft logarithmisch, der größte Verlust findet am Anfang statt. (Quelle: https://www.kemet.com)
In einer unbeaufsichtigten Stunde wanderten also ein paar der Vielschichtkondensatoren in den Ofen, dann folgten die Messungen (Abbildung 6). Zum Zeitpunkt -1,5h, also vor der Wärmebehandlung, sticht vor allem der schlechte Wert von 64 nF des Sortimentskondensators heraus. Dieser profitiert dann auch am meisten von der Auffrischung: Direkt nach dem Abkühlen gemessen, erreichte er tatsächlich 100 nF.

Abbildung 6: Die Ergebnisse von vier Kondensatoren mit der Nennkapazität von 100nF, neben drei Z5U-Varianten auch ein Kerko nach dem Erhitzen.
Die anderen Kondensatoren liegen über diesem Wert. Hier trimmten die Hersteller die Produktion darauf, nach 10 Stunden den Sollwert zu erreichen. Der weitere Verlauf bestätigt die Kurve aus dem Datenblatt, wobei der Billigheimer sein Level am schnellsten wieder verliert.
Fazit
Mit wenig Aufwand gebaut, vermittelt unser Kapazitätsmesser Einsichten in die Elektronik von Kondensatoren. Auch wenn die Messung nicht wissenschaftlichen Kriterien entspricht, genügt sie doch, um einen heruntergefallenen Baustein wieder richtig in die Bastelkiste einzusortieren. Der Messfehler liegt dabei innerhalb des prinzipbedingten Toleranzbereichs der üblichen Kondensatoren für Bastler.
Für didaktische Zwecke eignet sich das Verfahren gut und bietet auch die Möglichkeit weiterer Ausbaustufen – genau dafür entwickelte die Foundation ja ursprünglich den Mini-Rechner. So könnten Sie versuchen, die Spannung zu verschiedenen Zeitpunkten zu messen und die Messkurve anschließend zu visualisieren. Oder Sie untersuchen mit dem Nachwuchs, wie sich in Reihe oder parallel geschaltete Kondensatoren auf das Messergebnis auswirken. (tle)





