Teil 2: Kapazitäten von 10nF bis 2000uF einfach messen mit dem Arduino

Auf der Grundlage des vorherigen Artikels habe ich das Programm etwas verändert. Jetzt sind Messungen von ca. 10nF bis hin zu gut 2000uF möglich.

1. Als erstes werden jetzt Mikrosekunden (10^-6) gemessen und nicht mehr Millisekunden (10^-3). Dadurch sind auch schnellere Ladezeiten erfaßbar und nF Kondensatoren können vermessen werden.

2. Der Ladewiderstand wurde gemessen und eingegeben, was zu einer höheren Genauigkeit führt

3. Die Zeit der Nullmessung ( ohne Kondensatoranschluß ) wurde abgezogen. Auch hier eine genauere Messung der Zeit.

Die Schaltung ist die selbe wie im vorherigen Artikel. Ein Arduino und zwei Widerstände.

Hier das überarbeitete Programm.

// Kapazität Messgerät 10nF bis 2000uF
//
// Matthias Busse 22.2.2015 Version 1.1

#define messPin 0            // Analog Messeingang
#define ladePin 13           // Kondensator lade Pin über einen 10kOhm Widerstand
#define entladePin 11        // Kondensator entlade Pin über einen 220 Ohm Widerstand 
#define widerstand  9953.0F  // 10 kOhm > gemessen 9,953 kOhm

unsigned long startZeit;
unsigned long vergangeneZeit;
float microFarad;
float nanoFarad;

void setup() {
  pinMode(ladePin, OUTPUT);     // ladePin als Ausgang
  digitalWrite(ladePin, LOW);  
  Serial.begin(9600);           // Serielle Ausgabe
  Serial.println("Kapazitaetsmesser Version 1.1");
}

void loop() {
  // Kondensator laden
  digitalWrite(ladePin, HIGH);            // ladePin auf 5V, das Laden beginnt
  startZeit = micros();                   // Startzeit merken
  while(analogRead(messPin) < 648){}      // 647 ist 63.2% von 1023 (5V) 
  vergangeneZeit= micros() - startZeit - 114; // 0-Messung abziehen (112-116 us)
  if(vergangeneZeit > 4294960000) vergangeneZeit = 0; // Minuswerte auf 0 setzen (ist long deshalb der hohe Wert)
 // Umrechnung: us zu Sekunden ( 10^-6 ) und Farad zu mikroFarad ( 10^6 ),  netto 1  
  microFarad = ((float)vergangeneZeit / widerstand);   
  Serial.print(vergangeneZeit);           // Zeit ausgeben
  Serial.print(" nS    ");         

  if (microFarad > 1){
    if(microFarad < 100) {
      Serial.print(microFarad,2);         // uF.x ausgeben
      Serial.println(" uF     ");
    }
    else {
      Serial.print((long)microFarad);     // uF ausgeben
      Serial.println(" uF     ");
    }
  }
  else {
    nanoFarad = microFarad * 1000.0;     // in nF umrechnen
    if(nanoFarad > 10) {
      Serial.print((long)nanoFarad);     // nF ausgeben
      Serial.println(" nF     ");
      }
    else
      Serial.println("kleiner 10 nF");  
  }

  /* Kondensator entladen */
  digitalWrite(ladePin, LOW);             // ladePin auf 0V 
  pinMode(entladePin, OUTPUT);            // entladePin wird Ausgang 
  digitalWrite(entladePin, LOW);          // entladePin auf 0V 
  while(analogRead(messPin) > 0){}        // bis der Kondensator entladen ist (0V)
  pinMode(entladePin, INPUT);             // entladePin wird Eingang
  
  while((micros() - startZeit) < 500000){}   // bis 500ms warten, d.h. max 2 Ausgaben pro Sekunde
}

Hier ein paar Betrachtungen zum Messfehler und den Ursachen.

1. Der Lade-Widerstand muß genau bekannt sein. Ich habe ihn vermessen und komme auf 9953 Ohm. Mein Messfehler liegt hier lt. Angabe des Messgeräts (Philips PM2512, schon viele Jahre alt ) bei 0,2 % (10kOhm > 20 Ohm) und +-0.1 vom Bereich (Bereich 20kOhm > Fehler 20 Ohm) . Das sind also 40 Ohm oder 0,4% Fehler.

2. Der Arduino Zeittakt für die Mikrosekunden ist Quarz genau, damit weit unter 0,1% und zu vernachlässigen.

3. Bei kleinen Kapazitäten z.B. 100nF zählt er aber ca 1000 us was bei einer Stelle 0.1% sind. Und er spring in der Messung um ca. +- 6 us was auch schon 0,6% sind oder 0,6 nF.

4. Die Nullmessung bringt 112 bis 116 us also auch ein Fehler von +-4 us oder 0,4nF.

5. Der DA Wandler des Arduino hat 10 Bit oder 1024 Werte was einem Fehler von 1 Stelle oder 0,1% entspricht. Besonders bei kurzen Zeiten werden die Stellen nicht voll ausgeschöpft was unter 100nF zu immer größer werdenden Messfehlern führt.

6. Die Messungen zeigen Unstetigkeiten in der Größenordnung 0,5-1 %. Hier könnte zusätzlich eine Mittelung eingesetzt werden.

7. Die erste Messung wird häufig daneben liegen, da hier der Kondensator eingesteckt wird und zu dem Zeitpunkt nicht sicher voll entladen ist. Das heißt die erste Messung sollte nicht verwendet werden.

Das zusammen bedeutet einen Messfehler von ca. 1-2 % von mehreren mF bis runter zu 100 nF + 1nF, was für ein so einfach aufgebautes Messgerät schon ein sehr gutes Ergebnis ist.

Bei 10nF beträgt der Fehler allerdings schon gut 12%, sodaß unter 10nF die Ergebnisse nicht mehr angezeigt werden.

Hardware: Arduino Nano
Software: Arduino 1.5.8

Hier ein Video von Theo, Danke dafür.
Nachtrag von Christian: So kann ein Shield dazu gebaut werden.
Nachtrag von Andre: – Ein Eagle Board Layout.

von Matthias Busse

7 Gedanken zu „Teil 2: Kapazitäten von 10nF bis 2000uF einfach messen mit dem Arduino

  1. Pingback: Kapazitäten von 1uF – 2000uF einfach messen mit dem Arduino | Shelvin – Elektronik ausprobiert und erläutert

  2. Pingback: Kapazitäten messen – das Shield von Christian | Shelvin – Elektronik ausprobiert und erläutert

  3. Pingback: Kapazitäten messen. Ein Eagle Board von Andre. | Shelvin – Elektronik ausprobiert und erläutert

  4. Hoffmann

    Hallo
    Sehr schönes Programm darf ich dir dazu ein paar Fragen stellen die mein Verständnis fördern würden. Ich würde gerne mit dir per Email in kontakt treten.

    Mit freundlichen Grüßen
    Rene

    Antworten
  5. Pingback: Kapazitiver Regensensor mit einem ESP8266 / Arduino | IoT Microcontroller Hard- Software Development

  6. Rafał

    hallo ,
    kann man das Programm irgedwie auf 10 000uF umschreiben ?
    waere es problematisch das LCD ueber I2C an zusteuern ?
    sorry bin da nicht der hellste in sachen Arduido
    Gruesse

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.