3.5 Capacitor Characterization
An ideal capacitor can be specified by a single value: its capacitance. Here I will show how I measured 2 capacitor non-idealities: the dielectric absorption and the dielectric leakage. Dielectric absorption is an effect caused by the "alignment" and the "dealignment" of the molecular dipoles of the capacitor dielectric caused by the application of an electric field. While dielectric leakage is the current that crosses the capacitor dielectric and slowly discharges the capacitor.
The procedure to measure the dielectric absorption according to the IEC 60384-1 is more or less like this:
- The capacitor is charged without exceeding 50 mA to its voltage rating and is kept there for 60 ± 1 min.
- The capacitor get disconnected from the voltage source, and is discharged with 5 ± 5% Ω resistor for 10 ± 1 s.
- The discharge resistor is disconnected from the capacitor and during the following 15 min the voltage is continuously measured. The recovery voltage is the maximum voltage attained during this 15 min period.
To keep things simple I did not follow everything, specifically I could not charge to the rated voltage a few capacitors (the ones that were rated > 200 V), I did not use a fixture and I did not discharge the capacitors with a resistor but with the SMU itself.
The dielectric absorption is specified as the ratio between the charge voltage and recovery voltage, and is specified as a percentage. The leakage current was measured from the same data generated to measure the dielectric absorption, I measured the current leakage after 30 min of having charged the capacitor.
As an alternative to reduce the current noise with a test fixture, I shortened the leads as much as possible.
The complete procedure was implemented as a trigger model that relied on configuration lists to set the instrument to operate at the different phases and a timer that was programmed to initiate the next phase in of the procedure. The key part of the code with comments is shown next:
trigger.timer[1].delaylist = {{t_charge, t_discharge, t_recover}} -- Generate a trigger.EVENT_TIMER1 after t_charge (60 min), t_discharge (10 s) and t_recover (15 min) time has passed since the timer was started.
trigger.timer[1].start.stimulus = trigger.EVENT_NOTIFY1 -- Start the timer once it receives a trigger.EVENT_NOTIFY1 event trigger.timer[1].count = 3 -- Generate 3 trigger.EVENT_TIMER1 events trigger.timer[1].enable = trigger.ON -- Enable, but don't start the timer
trigger.model.setblock(1, trigger.BLOCK_CONFIG_RECALL, "Measure", 1, "Source", 1) -- Set the SMU to measure current and to source "V_charge" volts as specified in the index 1 "Measure" and index 1 "Source" configuration lists trigger.model.setblock(2, trigger.BLOCK_SOURCE_OUTPUT, smu.ON) -- Turn output on trigger.model.setblock(3, trigger.BLOCK_NOTIFY, trigger.EVENT_NOTIFY1) -- Send trigger.EVENT_NOTIFY1 event to timer to start it trigger.model.setblock(4, trigger.BLOCK_MEASURE_DIGITIZE, defbuffer1, trigger.COUNT_INFINITE) -- Begin measurements trigger.model.setblock(5, trigger.BLOCK_WAIT, trigger.EVENT_TIMER1, trigger.CLEAR_ENTER) -- Wait for t_charge (60 min) time to pass
trigger.model.setblock(6, trigger.BLOCK_MEASURE_DIGITIZE, defbuffer1, trigger.COUNT_STOP) -- Stop measurements trigger.model.setblock(7, trigger.BLOCK_CONFIG_RECALL, "Source", 2) -- Source 0 V trigger.model.setblock(8, trigger.BLOCK_MEASURE_DIGITIZE, defbuffer1, trigger.COUNT_INFINITE) -- Begin measurements trigger.model.setblock(9, trigger.BLOCK_WAIT, trigger.EVENT_TIMER1, trigger.CLEAR_ENTER) -- Wait for t_discharge (10 s) time to pass
trigger.model.setblock(10, trigger.BLOCK_MEASURE_DIGITIZE, defbuffer1, trigger.COUNT_STOP) -- Stop Measurements trigger.model.setblock(11, trigger.BLOCK_SOURCE_OUTPUT, smu.OFF) -- Turn output off trigger.model.setblock(12, trigger.BLOCK_CONFIG_RECALL, "Measure", 2, "Source", 3) -- Set Measuring to voltage, and set source to current (0 A) trigger.model.setblock(13, trigger.BLOCK_SOURCE_OUTPUT, smu.ON) -- Turn output on trigger.model.setblock(14, trigger.BLOCK_MEASURE_DIGITIZE, defbuffer1, trigger.COUNT_INFINITE) -- Begin measurements trigger.model.setblock(15, trigger.BLOCK_WAIT, trigger.EVENT_TIMER1, trigger.CLEAR_ENTER) -- Wait for t_recover (15 min) time to pass
trigger.model.setblock(16, trigger.BLOCK_MEASURE_DIGITIZE, defbuffer1, trigger.COUNT_STOP) -- Stop Measurements trigger.model.setblock(17, trigger.BLOCK_SOURCE_OUTPUT, smu.OFF) -- Turn output off |
I wrote the following code to perform the test and process the measurements after:
I measured 5 different type of capacitors:
Aluminum : 2200 µF / 25 V Ceramic : 10 nF / 1 kV Film : 300 nF / 250 V Tantalum : 33 µF / 12.5 V Supercapacitor : 0.22 F / 5.5 V |
And charged them at the following voltages:
Aluminum : 25.0 V Ceramic : 200.0 V Film : 200.0 V Tantalum : 12.5 V Supercapacitor : 5.5 V |
The leakage current after 30 min was:
Aluminum : 44.1 µA Ceramic : 28.2 pA Film : 34.9 pA Tantalum : 191 nA Supercapacitor : 326 µA |
The measured dielectric absorption was:
Aluminum : 5.85 % Ceramic : 7.54 % Film : 0.65 % Tantalum : 4.52 % Supercapacitor : 83.95 % |
And These are the voltage curves during the recover phase:
The results show lots of interesting features that clearly show how different these capacitors are. Tantalum and aluminum capacitors have very slow dynamics, and likely continued to recover voltage after 15 min, while the Film and supercapacitor showed very fast dynamics. The supercapacitor also reached the maximum voltage value within the 15 min of recovery, probably because the leakage current effect surpassed the recovery effect.


