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
Pingback: Kapazitäten von 1uF – 2000uF einfach messen mit dem Arduino | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Kapazitäten messen – das Shield von Christian | Shelvin – Elektronik ausprobiert und erläutert
Pingback: Kapazitäten messen. Ein Eagle Board von Andre. | Shelvin – Elektronik ausprobiert und erläutert
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
Hallo
tolle Idee. Funktioniert die Schaltung und der Code auch bei Arduino-Boards mit 3,3v Pegel?
Gruß
Fabian
Pingback: Kapazitiver Regensensor mit einem ESP8266 / Arduino | IoT Microcontroller Hard- Software Development
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