balack pornoAs you probably read in this post, capacitance is a measure of the ability to store energy. They are among other things used in rectifiers, as bypass devices and in analog filter circuits.
balack pornoThey are super-important components and critical for making sure applications and other components work.
But how do you measure this super-important “size” (the “capacitance”)
The Time Constant and the Circuit
The time constant is defined as the time it takes for a system to reach a given state from a step input.
In this case we want to find “” and a circuit with only a capacitor and a resistor (in series) have a known time response.
And that shall we exploit!
So to measure the capacitance of the Capacitor we can just charge it up through a known resistor and measure the time it takes before it reaches ~63,2% of the charging voltage!
The circuit is rather simple:
- The capacitor under test is connected in series with a known resistor (here: 10 k Ohm).
- The capacitor circuit is connected to pin 7 on the Arduino.
- The capacitor was also connected to an analog input on the Arduino to measure the voltage (A0).
The Firmware
The firmware to do this measurement does 3 measurements, averages the result, and prints out the final answer printed on the serial (USB).
The flow is as following:
- The Arduino discharges the capacitor circuit by setting pin 7 low. It makes sure the capacitor is empty by reading the voltage over it.
- It starts charging the capacitor circuit and starts the timer.
- It continues charging until the capacitor until it reaches 3,16 volt (~63,2% of 5 V).
- When the circuit reaches 3,16 volt it saves the accumulated time value and goes back to 1 if this is done less than 3 times.
- The final answer are an average of all the measurements and the result are printed out on the serial port!
#define NO_MEASSUREMENTS 3#define analog_pin A0#define capacitor_pin7#define resistor_value 989000.0F // the value on the resistor in Ohmsunsigned long start_time = 0;unsigned long accumulated_time = 0;void setup() {pinMode(capacitor_pin, OUTPUT);Serial.begin(115200);}void loop() {accumulated_time = 0;for(uint8_t i = 0; i < NO_MEASSUREMENTS; i++){// Make sure the capacitor is dichargeddigitalWrite(capacitor_pin, LOW);while(analogRead(analog_pin) > 0){}// set chargePin HIGH and capacitor charging andigitalWrite(capacitor_pin, HIGH);start_time = micros();// 647 is 63.2% of 1023, which corresponds to full-scale voltagewhile(analogRead(analog_pin) <= 647){}accumulated_time += (micros() - start_time);}float result_time = ((float) accumulated_time) / NO_MEASSUREMENTS;float micro_F = ( result_time / resistor_value) * 1000;Serial.print((long)result_time);Serial.print(" us before tau / ");print_float(micro_F, 2);Serial.println(" uF");}// from Peter H. Anderson, Baltimore, MDvoid print_float(float f, int num_digits){int pows_of_ten[4] = {1, 10, 100, 1000};int multiplier, whole, fract, d, n;multiplier = pows_of_ten[num_digits];if (f < 0.0){f = -f;Serial.print("-");}whole = (int) f;fract = (int) (multiplier * (f - (float)whole));Serial.print(whole);Serial.print(",");// print each digit with no leading zero suppressionfor (n=num_digits-1; n>=0; n--){ d = fract / pows_of_ten[n]; Serial.print(d); fract = fract % pows_of_ten[n];}}
This came out from the Serial Monitor:105404 us before tau / 106,57 uF
(The Capacitor under test was stated 100 uF “big”. This difference can be caused by many different things. Among others:? Inaccurate timing, ADC (un)accuracy, power supply imprecision and of course: Difference between stated and actual capacitance from the manufacturer).
Conclusion
As we saw here: You can measure capacitance using a simple mathematical “bond” that exists between time, resistance and capacitance and a simple and cheap circuit.
But note that this need some “upgrades” (especially on the hardware-side) to become a “high precision” measurement device.