Kapazitätsmesser

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
    
           }
        
       }
             
   }