Di. Apr 23rd, 2024

Mit Hilfe eines astabilen Multivibrator, dessen primäre Aufgabe es ist, in Abhängigkeit von einem RC-Glied Rechteck-Impulse zu erzeugen, ist es leicht möglich zusammen mit einem Arduino die Kapazität von Kondensatoren zu bestimmen. Die Länge dieser Impulse dient in unserem Aufbau, als Basis um die Kapazitäten von Kondensatoren zu bestimmen.

Schaltbild des Kapazitätsmessers

Der IC Baustein NE555 eignet sich besonders, um mit nur wenigen zusätzlichen Bauteilen eine derartige Kippstufe zu entwickeln. Für die Funktionsweise sind im wesentlichen die Bauteile R1 , R2 und C1 verantwortlich. Der Kondensator C2 sorgt nur dafür, dass die Schaltung nicht schwingt.


Die Dimensionierung der Bauteile kann entsprechend dem gewünschten Messbereich angepasst werden. Im vorliegenden Meßaufbau haben wir folgende Werte verwendet: R1 = 1 k und R2 = 10 k. Damit werden ausgeglichene Signallaufzeiten erreicht. Ein nachgeschalteter Schmitt-Trigger (zB SN7414) erzeugt für den nachfolgenden Arduino-Eingang steile Signalflanken und damit eindeutige Signalpegel.

Die Periodendauer eines astabilen Multivibrators berechnet sich nach folgenden Beziehungen:

    \[T = t_i + t_p\]

    \[t_i = \ln(2) \cdot (R_1+R_2) \cdot C_1\]

    \[t_p = \ln(2) \cdot R_2 \cdot C_1\]

Somit ergibt sich für die Periodendauer folgende Gleichung:

    \[T = \ln(2) \cdot (R_1+ 2\cdot R_2) \cdot C_1\]

Das Programm um die Kapazitäten mit dem Arduino zu bestimmen ist sehr übersichtlich. Es beginnt mit der Deklaration der benötigten Variablen. Im Hauptteil werden die Zeiten wo der Impuls auf HIGH und auf LOW steht bestimmt und gemittelt. Die  Kapazität des zu bestimmenden Kondensators ergibt sich dann über die Formel:

    \[C= \frac{1} {\ln(2) \cdot (R_1+ 2\cdot R_2) \cdot f}\]

Der Programmcode für den Testaufbau beinhaltet noch beide Ausgabeformen über den integrierten Monitor der IDE und über ein 4 Zeilen LCD mit I2C Schnittstelle und lässt sich natürlich beliebig an individuellen Vorstellungen anpassen:

//-----------------------------------
// Messen von Kapazitäten mit NEE555
// Version 2.0, (c) PHOF 18.01.2020
//-----------------------------------

long Htime;
long Ltime;
float Ttime;
float frequency;
float capacitance;
const int inputPin=8;

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 LiquidCrystal_I2C lcd(0x27,20,4);

void setup(){
  Serial.begin(9600);
  lcd.init(); lcd.backlight();
  lcd.setCursor(0,0);  lcd.print("Kapazitaetsmesser");
  pinMode(inputPin,INPUT);
}

void loop() {
 for (int i=0;i<5;i++){
      Ltime=(pulseIn(inputPin,HIGH)+Ltime)/2;
      Htime=(pulseIn(inputPin,LOW)+Htime)/2;
     }//end for
  Ttime = Htime+Ltime;
  frequency=1000000/Ttime;
  capacitance = (1.44*1000000000)/(20800*frequency);

// Ausgabe auf LCD Display
   lcd.setCursor(1,2);
   lcd.print("C:= "); lcd.print(capacitance);
   lcd.print(" nF         "); 
 
// Ausgabe auf Monitor
 Serial.println("=========================="); 
 Serial.println("Kapazitätsbestimmung");
 Serial.println("=========================="); 
 Serial.print(" Periodendauer T: ");
 Serial.print(Ttime);
 Serial.println(" s   "); 
 Serial.println("-------------------------"); 
 Serial.print(" Frequenz "); 
 Serial.print(frequency);  
 Serial.println(" Hz "); 
 Serial.println("-------------------------"); 
 Serial.print(" Kapazität: ");
 Serial.print(capacitance);
 Serial.println(" nF   "); 
 Serial.println("========================="); 
 Serial.println(""); Serial.println(""); 
 delay(750);
 }//end loop

Das ermittelte Ergebnis ist erstaunlich genau, wie die nachfolgende Rechnung un der Blick aufs Osszilloskop zeigen.

Ergebnis der Messung vom Arduino und Überprüfung mit dem Osszilloskop

Wie man sieht stimmen Messung und Rechnung für diese sehr einfache Schaltung erstaunlich gut überein.

Überarbeitete Version für 2×16 LCD mit I2C Schnittstelle

Für den Einsatz in der Praxis ist es Vorteilhaft anstelle des Monitors ein eigenständiges Display zu verwenden. Darüber hinaus habe ich eine Fallunterscheidung eingebaut um die Kapazität in nF und µF anzuzeigen. Der leicht überarbeitete Programmcode sieht nun wie folgt aus:

//-----------------------------------
// Messen von Kapazitäten mit NEE555
// Version 1.0, 
// (c) PHOF 18.01.2020
// überarbeitet am 02.12.21
//-----------------------------------

long Htime;
long Ltime;
float Ttime;
float frequency;
float capacitance;
const int inputPin=8;
char LCD_Line1[16];
 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,2);

void setup() {
  pinMode(inputPin,INPUT);
  pinMode(7,OUTPUT);
  digitalWrite(7, HIGH);
  Serial.begin(9600);
  lcd.init(); 
  lcd.backlight();
  lcd.setCursor(5,0);  
  lcd.print("C-Meter");
  
 }


void loop() {

 for (int i=0;i<5;i++){
      Ltime=(pulseIn(inputPin,HIGH)+Ltime)/2;
      Htime=(pulseIn(inputPin,LOW)+Htime)/2;
     }//end for
  Ttime = Htime+Ltime;
  frequency=1000000/Ttime; // in µs
  capacitance = (1.44*1000000000)/(20800*frequency); // in nF
  
/*
 Serial.println("================================"); 
 Serial.println(" Kapazitätsbestimmung");
 Serial.println("================================"); 
 Serial.print(" Periodendauer T: ");
 Serial.print(Ttime);
 Serial.println(" µs   "); 
 Serial.println("------------------------------"); 
 Serial.print(" Frequenz   f: "); 
 Serial.print(frequency);  
 Serial.println(" Hz "); 
 Serial.println("------------------------------"); 
 Serial.print(" Kapazität: ");

 */
 
 if (capacitance >1000) {
    capacitance=capacitance/1000;
     sprintf(LCD_Line1, "C = %d.%02d uF", (int)capacitance, (int)(fabsf(capacitance)*100)%100);
  lcd.setCursor(0,1);
  lcd.print(LCD_Line1);
  }
  else {
  sprintf(LCD_Line1, "C= %d.%02d nF", (int)capacitance, (int)(fabsf(capacitance)*100)%100);
  lcd.setCursor(0,1);
  lcd.print(LCD_Line1);
  }
  
 
 delay(1750);

 }//end loop