Lädt man einen Kondensator mit der Kapazität C über einen Widerstand R auf, so folgt der Spannungsverlauf der Funktion U(t) = U0 · [1 – exp(–t/RC)].
Wartet man also konkret, bis die Spannung am Kondensator 63,2% von U0 ausmacht, so gilt für den Exponenten der e-Funktion t/RC = 1. Daraus lässt sich dann die Kapazität C = t/R berechnen.
Die momentane Spannung U(t) wird über einen analogen Eingang des Arduino gemessen. Zuerst wählt das Programm einen sehr kleinen Ladewiderstand R = 10 kOhm und bestimmt die Ladezeit. Ist diese groß genug (dies ist bei größeren Kapazitäten C der Fall), so wird die berechnete Kapazität C am Display angezeigt. Ist die Ladezeit hingegen zu kurz, so wird der Ladevorgang mit einem größeren Widerstand R = 4.7 MOhm wiederholt. Ist die Ladezeit t dann groß genug, so wird die berechnete Kapazität C angezeigt. Im Falle einer zu geringen Ladezeit, wird R schlussendlich auf 1 GOhm erhöht und der Ladevorgang wiederholt. Mit diesem Widerstand sind dann auch kleinste Kapazitäten im niedrigen pF-Bereich messbar.






Arduino-Code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!
// Anschlüsse:
// GND - GND
// VCC - 5V
// SDA - ANALOG Pin 4
// SCL - ANALOG pin 5
int analogPin = 0;
int dischargePin = 4; // Entladepin
int chargePin_1 = 10; // Ladepin 1
int chargePin_2 = 11; // Ladepin 2
int chargePin_3 = 12; // Ladepin 3
int U; // aktuelle Spannung am Kondensator
// Initialisieren Timer
unsigned long starttime;
unsigned long elapsedTime;
// Initialize Kapazität Variablen
double mikrofarad;
double nanofarad;
double picofarad;
// ===========================
// ======= SETUP =========
// ===========================
void setup()
{
pinMode(chargePin_2, INPUT);
pinMode(chargePin_3, INPUT);
Serial.begin(9600); // Erforderlich, Daten in serielle Monitor über USB drucken
lcd.begin(); // initialize the lcd
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Kapazitaets-");
lcd.setCursor(0,1);
lcd.print("messer");
delay(3000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
}
void loop()
{
pinMode(chargePin_1, OUTPUT);
digitalWrite(chargePin_1, HIGH); // Beginnt das Laden des Kondensators
starttime = millis (); // Startzeit
while (analogRead (analogPin) < 648)
{
// Wartet bis der Kondensator 63,2% der Gesamtspannung erreicht hat. Zeit t = R*C
}
elapsedTime = millis () - starttime; // Ladezeit bestimmen
mikrofarad = ((float) elapsedTime / 10000) * 1000;
Serial.print("t1 = ");
Serial.print(elapsedTime);
Serial.println(" ms ");
digitalWrite(chargePin_1, LOW);
pinMode(chargePin_1, INPUT);
pinMode(dischargePin, OUTPUT);
digitalWrite(dischargePin, LOW); // Ermöglicht Kondensator zu entladen
while (analogRead(analogPin) > 0)
{
// Nichts tun, bis der Kondensator entladen ist
}
//U = analogRead(analogPin);
//Serial.println(U);
pinMode(dischargePin, INPUT); // Verhindert Kondensator entladen
if (elapsedTime > 10) // große Kapazität
{
Serial.print("C groß: ");
Serial.print (mikrofarad,1);
Serial.println (" uF");
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("C = ");
lcd.print(mikrofarad,1);
lcd.print(" uF");
delay(500);
}
else
{
pinMode(chargePin_2, OUTPUT);
digitalWrite(chargePin_2, HIGH); // Beginnt das Laden des Kondensators
starttime = millis (); // Startzeit
while (analogRead(analogPin) < 648)
{
// Wartet bis der Kondensator 63,2% der Gesamtspannung erreicht hat. Zeit t = R*C
//U = analogRead(analogPin);
//Serial.println(U);
}
elapsedTime = millis () - starttime; // Ladezeit bestimmen
Serial.print("t2 = ");
Serial.print(elapsedTime);
Serial.println(" ms ");
nanofarad = ((float) elapsedTime / 47) * 10;
digitalWrite(chargePin_2, LOW);
pinMode(chargePin_2, INPUT);
pinMode(dischargePin, OUTPUT);
digitalWrite(dischargePin, LOW); // Ermöglicht Kondensator zu entladen
while (analogRead(analogPin) > 0)
{
// Nichts tun, bis der Kondensator entladen ist
}
//U = analogRead(analogPin);
//Serial.println(U);
pinMode(dischargePin, INPUT); // Verhindert Kondensator entladen
if (elapsedTime > 10) // mittlere Kapazität
{
Serial.print("C mittel: ");
Serial.print (nanofarad,1);
Serial.println (" nF");
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("C = ");
lcd.print(nanofarad,1);
lcd.print(" nF");
delay(500);
}
else // kleine Kapazität
{
pinMode(chargePin_3, OUTPUT);
digitalWrite(chargePin_3, HIGH); // Beginnt das Laden des Kondensators
starttime = millis (); // Startzeit
while (analogRead(analogPin) < 648)
{
// Wartet bis der Kondensator 63,2% der Gesamtspannung erreicht hat. Zeit t = R*C
//U = analogRead(analogPin);
//Serial.println(U);
}
elapsedTime = millis () - starttime; // Ladezeit bestimmen
Serial.print("t3 = ");
Serial.print(elapsedTime);
Serial.println(" ms ");
picofarad = ((float) elapsedTime / 1) * 1 - 50.0; // Kapazität minus offset!
Serial.print("C klein: ");
Serial.print(picofarad,1);
Serial.println (" pF");
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("C = ");
lcd.print(picofarad,1);
lcd.print(" pF");
delay(500);
digitalWrite(chargePin_3, LOW);
pinMode(chargePin_3, INPUT);
pinMode(dischargePin, OUTPUT);
digitalWrite(dischargePin, LOW); // Ermöglicht Kondensator zu entladen
while (analogRead(analogPin) > 0)
{
// Nichts tun, bis der Kondensator entladen ist
}
//U = analogRead(analogPin);
//Serial.println(U);
pinMode(dischargePin, INPUT); // Verhindert Kondensator entladen
}
}
}
