The arduino can measure a capacitor with only two resistors in a range from 10nF to 2000 uF. The theory, the simple circuit on a bread board and the Arduino program explained.
the circuit:
the program:
// Arduino measures capacitor 10nF to 2000uF // // Matthias Busse 12.12.2020 version 1.2 #define chargePin A4 // capacitor charge pin over a 10kOhm resistor #define dischargePin A5 // capacitor discharge pin over a 220 Ohm resistor #define measurePin A6 // AD input #define resistor 9996.0F // 10 kOhm > measured 9,996 kOhm long startTime, passedTime; float microFarad, nanoFarad; void setup() { pinMode(chargePin, OUTPUT); // chargePin as output digitalWrite(chargePin, LOW); Serial.begin(38400); // serial output Serial.println("measure capacitance version 1.2"); } void loop() { // 1. charge the capacitor and measure time digitalWrite(chargePin, HIGH); // chargePin to 5V, the charging starts startTime = micros(); // store start time while(analogRead(measurePin) < 648){} // until 647 is measured, that is 63.2% of 1023 passedTime= micros() - startTime - 114; // subtract zero-time (112-116 us) if(passedTime > 2147483647) passedTime = 0; // set minus values to zero (type is long) // us to seconds ( 10^-6 ) and Farad to mikroFarad ( 10^-6 ), netto none microFarad = ((float)passedTime / resistor); // 2. output value Serial.print(passedTime); // time output Serial.print(" nS "); if (microFarad > 1){ if(microFarad < 100) { Serial.print(microFarad,2); // uF.xx output Serial.println(" uF"); } else { Serial.print((long)microFarad); // uF output Serial.println(" uF"); } } else { nanoFarad = microFarad * 1000.0; // calculate nF if(nanoFarad > 10) { Serial.print((long)nanoFarad); // nF output Serial.println(" nF"); } else Serial.println("smaller than 10 nF - no measurement"); } // 3. discharge capacitor digitalWrite(chargePin, LOW); // chargePin to 0V pinMode(dischargePin, OUTPUT); // dischargePin now is output digitalWrite(dischargePin, LOW); // dischargePin to 0V while(analogRead(measurePin) > 0){} // until the capacitor is discharged (0V) pinMode(dischargePin, INPUT); // dischargePin now is input // 4. wait while((micros() - startTime) < 500000){} // wait until 500ms, this will print two outputs per seconds. }
by Matthias Busse @Youtube
Awesome, Matthias! This is a challenge I always wanted to address with a microcontroller.
I remeber when I gut my licence, the uncertancy with most capacitors and coils about their capacity/inductance. Today an Arduino makes life more easy.
Do you see a realistic chance to optimize the circuit to also measure in the pico farad region?
AADE (owner recently passes away) once supplied a famous PIC based measurement device. Applying a similar circuit, should bring the Arduino to similar results. I remember the probes need to be calibrated for each appliance, first.
Would you assume the circuit and/or program could be tweeked or are there obvious limitations?
Handbreit / vy 73
-Pit, DF5CL
Hello Pit,
if you increase the charge capacitor to 100 kOhm you can measure down to 1nF. Maybe you can increase it a bit more, but you have to take care of the input resistance of the both other Arduino pins connected to the + line. If the restistance is stable, you can add them to the calculation? Try it.
Handbreit,
Matthias