Homemade Cap Meter

School is finally over (I teach Electronics and Computer
Technology), and I have had a little time to finish
up one of the projects I began earlier in the year. It is 
a Capacitance Meter that measures from fractions of a 
picofarad out to just a little over 16,000 microfarads.

I use a PIC 16F84 as a controller, and have a 16x2 LCD
readout for displaying results and messages. The unit
allows for both AutoRange and Manual Modes of operation.
A special Comparison Mode is also provided for.

I use an analog front-end that pumps a constant current
into (and out of) the capacitor under test. The resultant
voltage is then compared with a reference and used to
switch the polarity of the constant current. This results
in two signals. One of these is a triangle wave, and
derived from this (via the comparator section) is a nice
clean square wave whose PERIOD is directly proportional
to the capacitance being measured.

I use a sneaky trick to help eliminate error due to
any changes in the bi-polar voltage reference. In fact,
the technique works so well I use a normal red LED as
my voltage reference. For those who want to eke an
extra digit of precision out of the circuit, you can
substitute the LED with a Zener.

The accuracy of the circuit is dependant on several factors:

1) The type of quad Operational Amplifier used. I chose
   to use a TL084CN opamp because it gave me a decent
   performance/price ratio. This is an industry standard
   pinout device, so you can substitute a better version
   opamp if desired. The limiting factors as regards the
   opamp are its slew rate, input bias current, and
   available output current.

2) The accuracy of the resistors used in the 
   voltage-to-current section of the circuit. I chose to 
   use .1% precision resistors for the two resistors that
   determine the current for the lowest scales. I used
   1% resistors and trimmer pots for the remaining
   scales so that I could nullify some of the errors that
   creep in at the higher scales. Note that I used
   *two* .1% resistors so that I could get the desired
   250k value using standard precision resistor values
   (249k + 1k)

3) the accuracy of the resistors used in the comparator
   section. I used .1% precision units.

4) The accuracy of the clock. I used a 4.000 Mhz crystal
   rather than my more usual 4.00 Mhz ceramic resonator.

5) The error due to the difference between the number of
   cycles that occur between the time a period begins
   and ends, and the number of instruction cycles it takes
   before the count is accumulated.

6) The error due to stray capacitance in the internal
   wiring and also any external stray capacitance caused
   by the measurement leads, etc.

I attempt to eliminate most of the error coming from #5 
and #6 by initially accumulating a count when there is
no external capacitor attached, and then subtracting
that value from subsequent readings. These initial "zero"
values are measured whenever a reset or power-up
condition occurs. They are retained until the next
reset, or they may be re-acquired at any time by pushing
the ZERO button.

Pushing the ZERO button causes the unit to enter Manual
Mode and causes the unit to acquire a reading and place
this value in the current subtraction register set.

So, if you happen to have, say, a .1 uf capacitor on the
leads and you push the ZERO button, then the display goes
to zero. If you were to remove the .1 ufd capacitor, the
display would now read negative .1 ufd to indicate the
DIFFERENCE between the current capacitance and the value
that was in effect when the ZERO button was pushed. This
Compare Mode is quite useful for "matching" capacitors,
or for tracking the *changes* in capacitance that may
be occuring.

An UP and a DOWN button are available which cause the unit
to enter Manual Mode (if not already in that mode), and
move to the Next or Previous range. The buttons are
"sticky" in that they go to the limit and stay there.
They do NOT "wrap around".

There are indicators on the display that show when the unit
is waiting for synchronization, when it is accumulating a
count, and when it has updated the numerical display. In 
addition there are indicators for +/- for Comparison
Mode, and an Auto/Manual Mode indicator.

Messages are displayed when there are Over-Range values
in Manual Mode, and when the unit is AutoRanging from
one range to another in Auto Mode. There is also a
message displayed when the unit has exceeded the 16
million count limit.

AutoRange mode has hysteresis, so that small changes don't
cause the circuitry to constantly change range. The
upper limit for switching ranges in AutoRange Mode is
approximately a 500,000 counts. The lower limit is
approximately 400,000 counts. The exceptions are the
highest range, which goes up to the maximum count of
approximately 16,000,000   and the lowest range, which
can go down to .00 picofarads.

The counts are displayed on the upper line of the LCD,
and the unit designators are displayed on the second
line of the LCD. Typical displays would look something
like this:

+  15,123.456 XX    15,123.456 uf AutoMode New Count
       uf  nfA**

-      23,321.54    23,321.54 pf Manual Mode 
   uf  nf  pfM X    <-> means Below Reference Value
                    Blinking X means Count In Progress.

Leading zeroes are suppressed up to the decimal point.
Commas, decimal point, and space are used to separate
number groups. Thus the last example can be easily
seen to also be equal to 23.32154 nf.

Unit was