Kapazitätsmessung mit dem Arduino

By | 26. August 2017

Die Idee des Meß-Prinzips besteht darin, ein präzises Monoflop 74HC4538E zu verwenden, um einen Impuls zu erzeugen, der direkt von der Kapazität des zu messenden Kondensators abhängt.

Die Impulslänge wird dann über den Arduino gemessen und über die Formel T = R*C kann dann bei bekanntem T und R die Kapazität C gemessen werden.

Zum Einsatz kommen soll hier der Baustein 74HC4538. Dabei handelt es sich um ein IC mit 2 Monoflop-Bausteinen in einem Gehäuse. Die Funktionsweise kann wie folgt beschrieben werden:

Der zeitbestimmende Kondensator C wird zwischen den Pin´s 1 (1Cx) und 2 (1RxCx) angeschlossen. Er sollte laut Datenblatt im Bereich von 5nF und 100µF liegen.

Der ebenfalls benötigte Widerstand Rx wird zwischen die Pin´s 2 (1RxCx) und  16 (Vcc) angeschlossen. Er sollte laut Datenblatt im Bereich größer als 4kΩ sein.

Die Eingangs-Pins 3 (1A) und 4 (1B¬) sind flankengesteuerte Eingänge und lösen das Monoflop aus.

Möchte man mit einer steigenden Flanke das Monoflop starten, so muss der Pin 3 (1A) verwendet werden und dazu muss der Pin 4 an Vcc gelegt werden.

Möchte man mit einer fallenden Flanke das Monoflop starten, so muss der Pin 4 (1B¬) verwendet werden und dazu muss der Pin 3 auf Masse (GND) gelegt werden.

Beim Start des Monoflops, geht der Ausgang Pin7  von Low auf High, bleibt T=R*C Sekunden auf diesem Pegel und geht dann wieder auf Low.

Eine erste Testschaltung um von einem Arduino am Pin2 ein Triggersignal an das Monoflop zu senden sieht wie folgt aus:

Zeitmessung

Um die Zeit zu messen solange an einem Pin ein bestimmter Logik-Pegel anliegt, gibt es beim Arduino hierzu die Funktion pulseIn(pin, signal) an. Die funktioniert an jedem Digital Pin und misst die Zeit zwischen 10 µs und 3 Minuten, solange ein bestimmter Pegel am Pin anliegt. Die genaue Beschreibung findet sich unter Arduino Functions.

Wichtig ist die optionale Timeout-Funktion zu verstehen. Man findet im Netz folgende Erklärungen:
Also beware that pulseIn() has a timeout (it will not wait forever). This timeout is used for the whole completion of the pulse, i.e. first waiting for the signal to get HIGH, then waiting for it to get back LOW. If no pulse is detected and complete (LOW -> HIGH -> LOW) within this time, then pulseIn() will return 0.
Default timeout value is 1 second, but you can set any value (in microseconds) you want that can hold in an unsigned long. If you need e.g. 10 seconds, then: value = pulseIn(pulsepin, HIGH, 10000000UL);

Das führt zu folgendem Test-Programm:

Diese Option ist speziell für Impulsdauer-Zählungen relevant, die länger als 1 Sekunde dauern. Setzt man diese Time-out-Option nicht liefert die Funktion nach 1 Sekunde den Wert Null zurück.