Official Home Page of the Roman Black
High res cap meter with PIC 16F628
High resolution capacitance meter measures in 0.01pF digits. Total range 0pF to 50uF. - 27th Jun 2011.
Another PIC based capacitance meter?
Although there are a few PIC based "pico" capacitance meters on the internet this design has some advantages over the other designs I have seen;
1. It has very high resolution; from 6 to 7 digits! (Others have 3 or 4 digits)
2. It has a wide range; 0pF to 50uF.
(Others do not go over 0.1uF or 1uF)
3. It uses only a single cheap PIC 16F628. (Others use two ICs)
4. It does not need calibration! (Others need calibrating with a special test cap)
5. It can do auto-zeroing, floating zero and negative capacitance (relative to zero).
How it works
For absolute simplicity I used a PIC16F628. The oscillator uses the PICs internal comparator so no second IC is needed.
The oscillator is an RC comparator oscillator that switches between 1/3 Vdd and 2/3 Vdd, this is a proven system and the frequency is reasonably unaffected by small changes in the 5v Vdd.
The three 1k5 resistors (green) set the threshold voltages at 1/3Vdd and 2/3Vdd when the comparator output switches. (The PIC is a better comparator than many dedicated comaprator ICs as its output has good push-pull low-Rds FETs).
The oscillation period (freq) is set entirely by RT and CT. RT is a 1% metal film resistor which I measured on my multimeter at 10.00 kohm. Now the only thing that sets the oscillation period is the test cap CT.
The final stage is the PIC timer, that measures the oscillation period very precisely compared to the PICs xtal. And a math calc is done to scale the period to capacitance in farads.
Precision period measuring!
The PIC measures the RC oscillation period by using the PIC's internal hardware capture (CCP1). The PIC xtal is 16MHz so the PIC timer runs at 4MHz.
It adds consecutive captured periods until there is a total accumulated time greater than 2 million counts (>0.5 second). The only error can be the edge error for the first and last capture, so the error is limited to 1 part in 2 million at each end, a total possible error of 1 PPM (1 Part Per Million).
Now it has a precise captured total of periods the average period is determined by dividing the total period with the number of periods captured. As the total is always just over 2 million it is scaled up to 2 billion before the division, to give a lot of accurate decimal digits after the division.
"10nF" cap, oscillates about 435Hz
218 consecutive periods are captured, a total of 2004597 counts
Math; (2004597*1000)/218 = 2004597000/218 = 9195399
(so the average period is 9195.399 counts)
A second process is used to convert that result to picofarads;
(9195399*100)/scale = 919539900/919 = 1000587
1000587 is then displayed as; 10005.87 pF
Another small cap example;
"100pF" osc about 43500 Hz
21751 periods are captured, a total of 2000091 counts
Math; 2000091000/21751 = 91953
Scaling; 91953000/919 = 100057
100057 is truncated and displayed as 100.05 pF
All the math and scaling systems have been chosen to give the best precision possible from the 32bit unsigned long variables used in the firmware, without resorting to float or 64bit variables that would have needed a larger and more expensive PIC.
There are three display ranges;
0pF to about 18000 pF, format; "PPPPP.DD pF"
18nF to 999nF, format; "NNN.DDD nF"
1uF to 50uF, format; "UU.DDDD uF"
In the pF display mode the display accuracy is about two final digits; +/- 0.02pF.
In the nF and uF mode the display accuracy is better, at +/- 1 final digit.
The "real" accuracy depends on the internal calibration, with my PIC, 10.00 kohm resistor and 16MHz xtal the calbration is accurate to better than about 0.2% of the capacitor value, based on some test caps.
You should be able to improve this further by using a trimpot in series with the 10k resistor (ie; 9.75k resistor + 0.5k trimpot) and trimming for much better than 0.2% accuracy by using some precision test caps. However the cap meter was designed for better than 1% accuracy as a convenient hobbyist build without needing any special equipment or special caps.
The benefit of having the high display resolution (lots of digits) is that it allows caps to be compared to each other, and allows fine resolution capacitance changes to be seen, especially things like thermal changes and variable capacitors.
Even with a fixed cap you can see the cap value change as you waft cool air at it with a book and cool it a fraction of a degree. Or you can see the capacitance rise by 0.01pF when you place your finger 1 inch away from the cap!
The cap meter has an advanced floating zero feature. Pressing the button zeroes out any cap value that is displayed. The meter can be zeroed any time it is in pF mode (up to about 18000pF).
The meter can display negative capacitance values compared to the zero point. So if you zero it on a good 1nF cap, other 1nF caps tested will read as + and - the difference, so it can be used to check cap error against a known good cap.
The second advanced feature is the auto calibrate mode. If the button is held for 2 seconds the cap meter enables auto zero calibration. Then any time when there is no test cap connected (<3pF on test leads) the cap meter will slowly "trim" its zero calibration by about 0.01pF every second so that it is always correctly at zero! When in autocal mode it can still be zeroed by pressing the button.
The schematic looks messy but it is easy to build! For energy efficiency I used a low-quiescent current +5v regulator instead of a standard 7805, to cut current consumption down from 13mA to 6mA. But a 7805 works fine if that is what you have.
If you don't have a 1% metal film 10k resistor (or want to adjust it for high precision) then replace the 10.00k resistor with a resistor and trimpot and then adjust the trimpot to equal 10.00k or to match a precision test capacitor. NOTE! You should also use 1% resistors for the 1k5 resistors for best results!
As the circuit is VERY simple (it's just a PIC and a few parts) I made it on veroboard (stripboard). It is really not worth etching a PCB for this project! A small SMD 5v regulator is soldered to the bottom of the PCB, all the other parts can be seen below;
The board was hot melt glued into a $6 plastic case, and the 16x2 LCD and button were glued into the case top. A slide switch and 9v battery were added for the power. It's important to glue the parts down so things don't move around much as this can affect the capacitance reading.
The 16x2 text LCD is an older style with NO backlight and very high reflective screen, it has great readability and only uses about 2mA. The whole cap meter only uses about 6mA so battery life should be very good.
Measuring a 10nF capacitor!
A black and white front panel was drawn in CorelDraw and engraved. You can get small engraving jobs like this done at any "Trophy Engraving" shop for a few dollars especially if you can provide the engraver with the format he prefers so it is less work for him!
PIC source code is not included. It was hard to fit all the 32bit math into the small PIC 16F628 which only has 2k ROM, so it became a little messy! My C code has some stripped-down routines and some gotos etc and I won't release it in a messy form. But the process is described above if you want to create your own source code, or you can just use the HEX file below to program your own PIC 16F628 or 16F628A which are very common PICs.
Download CapMeter.HEX file
Testing is quite straightforward. When it powers up the display will read the total value of the internal 270pF cap plus some extra capacitance from PCB tracks etc. Mine reads about 320pF. The oscillator will be running about 220 kHz.
Then press the zero button. The display will say "Zero Cal" and will then read close to zero, although it may be a fraction of a pF out. Mine reads about -0.05pF after zeroing and it may change a few counts as the internal cap warms up. With such a sensitive meter it's normal to see caps drift by a small amount with temperature changes!
You can re-zero at any time, which may be necessary after moving the leads as this can make a difference of 0.10 to 0.20pF or so. Of course this will not matter if you are measuring any cap larger than a few pF!
At this point connect a cap to the leads and its value will be displayed.
If the oscillator stops or the leads are shorted, or a cap larger than 50uF is connected the system times out and the display will show "Error" and alternate between "Error" and "Large cap" as it tries to find a cap.
Auto zero calibrate is selected by holding the button down for 3 seconds. Auto mode can be toggled on and off. In auto mode it will SLOWLY trim the zero point by 0.01pF per second or so, but only when there is no cap connected. Auto mode is probably best for most cap measuring unless you need to measure very small caps.
New! 16th July 2011. I've been asked to take part in a pilot program on the Electro-tech forum where some of my projects are linked to a thread where you can;
NEW! Kits for sale
12th March 2012 - I was emailed out of the blue by Alexey from Radiohobbystore.com, who said he had seen my CapMeter project and wanted to make kits.
I agreed as I had no intention of making or selling kits, so Alexey has designed a neat easy-to-assemble PCB based on my schematic and is selling kits for a very reasonable price, see Kits for sale here!
I have no formal business arrangement with Alexey and I don't receive any payment kit sales. So please email him for tech support with the kits.
Thank you Alexey for producing the kits, and for my readers here please consider buying one they are very reasonably priced and will make construction simple and reliable.