## AVR LC Meter With Frequency Measurement

I have been thinking about building an LC meter for a while since I do not have a multimeter that is capable of measuring inductance and while the multimeters I have can measure capacitance, they are not able to give accurate readings for small capacitance in the range of several pF’s.

There are quite a few good articles on how to build LC meters using PIC MCUs (like the ones here: 1, 2, 3), but instructions on how to build one with an ATmega MCU are few and far in between, although the basic principle is largely the same. So I decided to write this article on how to build an LC meter using an ATmega328p chip and Arduino libraries.

A typical LC meter is nothing but a wide range LC oscillator. When measuring an inductor or capacitor, the added inductance or capacitance changes the oscillator’s output frequency. And by calculating this frequency change, we can deduce the inductance or capacitance depending on the measurement.

The following schematic shows the comparator based LC oscillator I used in the LC meter. The oscillator portion is quite standard. Most of the other designs I have seen use LM311 comparator. But for this type of application, any comparator capable of oscillating up to 50kHz should be more than sufficient. I happen to have some spare LM339′s lying around so I used it in the oscillator circuit.

LC Meter - Oscillator

Note, there should be a 3K pull up resistor on pin 1 and the feedback resistor should be 100K instead of 10K.

Because what we are really meausring is the frequency of the oscillator, we can build a frequency meter using the same circuit at almost no additional cost. As you can see in the circuit above, a reed relay is used to switch the measurement from LC mode to frequency mode. In the schematics above, the second comparator forms a Schmitt trigger to condition the input waveform so that the frequency measurement can be made more accurate. When in the LC mode, the frequency output from the first comparator is simply feed through the Schmitt trigger. The output frequency is determined by
$f_0=\frac{1}{2\pi\sqrt{LC}}$

where
$L=L_0 + L_{measured}$ and
$C=C_0 + C_{measured}$

Choosing a high accuracy L0 and C0 helps improve the accuracy of the meter.

Here’s the MCU side of the schematics:

LC Meter

This circuit is capable of measuring inductance in a wide range, from a few nH all the way up to a few Henrys. For capatance measurement, I have found that it is most suitable for measurement from a few pF to tens of nF. You maybe able to measure slightly larger capacitors if they have a high ESR rating. But this range limit in capacitance measurement should not be an issue as what we care most about is the accuracy in the pF range.

I used this frequency library for the frequency measurement. By default, the display is updated every second. This mode provides the most accurate result. You can shorten this update interval easily, but the measurement accuracy will be reduced.

The Arduino code for this project can be downloaded here (LCFrequencyMeter.zip). This project was developed using the NetBeans IDE and you may need to adjust the included header files if you are using Arduino IDE. For more information, please see my previous article on this topic.

The calibration method I used is like this: in capacitance measurement mode, the none-load reading is used to calculate stray inductance (assume that C0 is accurate) which is then used to compensate capacitance measurements. And similarly, in inductance measurement mode, we assume that L0 is accurate and the none-load reading (by shorting the test leads) is used to calculate stray capacitance which is then used to compensate inductance measurements. If you read through the code you will get a better idea on how this is done.

The following picture shows the capacitance reading when using this meter to measure a known 2.22nF capacitor:

Capacitance Measurement

And this picture shows the LC meter in inductance mode, measuring a small inductor:

Inductance Measurement

Here is a picture showing frequency measurement. The frequency source is a 555 timer generated square wave:

Frequency Measurement

Within a selected mode, the display is auto ranged for the components/frequencies under measurement.

Be Sociable, Share!

1. pagan says:

Hi Kwong, what’s the range of Lc meter (anductance), how about the accuracy?

• kwong says:

I have used it to measure capacitance from several pF up to a few uF and inductance from several nH to 100 mH.

Because the circuit essentially acts like a frequency counter, its accuracy is largely dependent on your reference L/C value. So if your reference LC are accurate, this meter can be extremely accurate as well.

• pagan says:

Thanks Kwong, I’m in need of a high measurement toward inductance

2. Gab says:

Hello! Thanks for the quick responds to previous question I asked.
Pls, I want to understand something. Digital pin 5 (Frequency in) is not declared and used in the program. Can U explain that to me? OR How is it used?

• Gab says:

Its ok kwong. I have found it declared within the frequency library.

3. jimis says:

nice job i fix the cirquit but not working screen is not open what is wrong please help me to fix it ! thank u!

4. Tom says:

Is that resistor on the first op amp circuit a 10k or a 1k or what? it’s marked 1\k.

5. Tom says:

And what is the answer? :)

• SImas says:

C’mon, what is the answer :] ? Is it that “feedback” resistor (then it’s 100K)?

• kwong says:

It’s 1K.

• SImas says:

Thanks!

I’ve also already figured out that the “feedback” one that must be 100K instead of 10K is the last one in the right side of schematics.

Hi,
I’ve made a very simillar LC meter. The problem is, that it is very unstable. What I mean is that, when in calibration mode it goes from 432,5 kHz to 437,1 kHz in about 20 minutes!

The meter is soldered on a breadboard. I’ve used 581pF ceramic capacitor and 221uH inductor, but the “vertical” one, like this: http://static.tme.eu/katalog_pics/a/5/c/a5c773a26a582806508bb46de396949b/coil0.33.jpg

What can cause the problem?

• kwong says:

Good question, as the stability of an opamp LC oscillator should be well within 1% over time (that’s already 10000 ppm). I’d change the reference L/C components and see whether that changed the outcome.

7. SImas says:

Now I really DO need help :] I’ve put everything in place, double checked and fired up – but the only thing I can get out of it is “Mode: C / Mode: L” and “—” in second line.

I have no idea how to start debugging it, finding the cause and making it work. I would be really thankful for an advice.

A) I’ve ditched all the frequency-measurement-related part (since I only need it for measuring an inductor) – so no relay, no LC/Frequency button and pins 2 and 6 are directly connected on LM339. I don’t think I could have messed anything up here :].
B) I’ve used 1K for a resistor marked as “1\K” and 100K for this one: http://snag.gy/GwKvY.jpg . Those are the only modifications to the original circuit, everything else is as drawn (double checked).
C) L/C switch works: it changes modes on LCD successfully.
D) Calibrate button works – once it’s pressed, “Cal” appears on the LCD briefly.
E) If I reset the Arduino Uno – I get a brief display of “27.20 nf” or “6.01 mH” briefly, then it goes to “—” and doesn’t change ever, no matter what mode and what I plug into test contacts.
F) Code wise, I only added FreqCounter library to Arduino IDE, and removed folder names in includes (“FreqCounter/FreqCounter.h”->”FreqCounter.h” and “LiquidCrystal/LiquidCrystal.h”->”LiquidCrystal.h”. That removed all the compiling errors. BTW, where do all the other includes are comming from? Do I also have to get and install them, or they are something left from that NetBeans thing and doesn’t play a role in this code?

• SImas says:

Got it solved, found a loose solder joint to pin5 of LM339. But it still doesn’t work as supposed:

C Mode: displays wildly alternating digits, mostly negative.
L mode: whatever I plug in – shows “ovf nH”.

Ideas?

• SImas says:

I’ve tried just loading an example freqCounter code to see what it reads at pin5. Results are strange and give me no ideas how to progress further :]

C mode: “90″ with nothing plugged / “123″ with 100 nf
L mode: 0 with irregular 1 / ~230 with 33uH inductor

As I understand it’s far from the digits that should be seen.

One more thing – I didn’t do anything with “there should be a 3K pull up resistor on pin 1″ part. Might it be the reason? Can someone explain how this should look like?

• kwong says:

That might have been the issue, as LM339 has open collector output, you will need a pull up resistor at the output for it to work correctly. To isolate the issue, you could also by pass the second IC (e.g. connect the output from pin 2 of LM339 to Arduino pin 5) temporarily to see if it works.

8. Tom says:

Can an LM1458 be used in place of the LM339?

• Tom says:

Duh, maybe I should look at the datasheets a little more closely.

9. Tom says:

More digging to do. I can finally get a capacitance reading with a capacitor connected. When I hook up and inductor and press the LC sense switch, it give me a frequency. When I press it again, the inductance is briefly displayed before going back to Mode:C. I guess I have more troubleshooting.

10. Tom says:

Is the default mode “L” or “C”?

• kwong says:

It’s set by the switch.

• Tom says:

I guess I’m trying to say, when I turn mine on, it is in Mode C. I press the LC switch and I hear the relay change position and it goes to Frequency, and displays a frequency. I never see Mode L. When I press it again, it will briefly display an inductance, before going back to Mode C. The Mode L never shows up on the display.

• kwong says:

There are two switches: the DPDT one is for switching between L and C (the one towards the left of the schematic). The SPDT switch is for switching between frequency or L/C measurements.

11. Tony says:

Hello, I have built your LC meter -which will be very useful -but I have been unable to load the software. I’m using the Arduino IDE and the problem may be that the version I have is 1.0.5 and I can’t get version 0018 (which I believe you used) or it may just be that I don’t know what I’m doing. There seems to be a problem with the libraries not being available.
I would be grateful for any help!
Tony.

• kwong says:

If you are using the latest IDE, change

replace

define __AVR_ATmega328P__

include avr/interrupt.h
include binary.h
include HardwareSerial.h
include pins_arduino.h
include WConstants.h
include wiring.h
include wiring_private.h
include math.h
include WProgram.h
include EEPROM/EEPROM.h
include LiquidCrystal/LiquidCrystal.h
include FreqCounter/FreqCounter.h

with

include LiquidCrystal.h
include FreqCounter.h

(you will need to put in the correct syntax, the editor I am doesn’t like c syntax…
and it will compile (given you have downloaded the frequency counter library I mentioned in my post). Good luck!

can we use atmega328 instead of atmega328p?

• kwong says:

The code should be identical (328 has different chip ID as 328P, but if you can program it then either should work).

Is it necessary to use atmega? can we jst connect the lcd pins as defined in the code?.

Got it. thank u for this project,

Got it. thank u.

• kwong says:

I used a Reed relay, but pretty much any SPDT relay would do the trick. The current rating is not important as we are only using it to switch small signals.

15. Mikkel says:

Hello Kerry
I have found your design and tried to copy almost everything, but I see no oscillations ;(

All I want here is to measure the capacitance with the ATmega328p (Arduino Pro).

I have therefore removed the two switches. I made connections straight through from pin 2 to pin 6, I could properly completely neglect the Schmitt trigger/the second comparator, however didn’t in my first try. I then connected straight through from the input (GND) to GND and from input (High) into the junction where the 1000pF capacitor and the inductor are joined.
(Something about you had written L on one and C on the other. The fact was just the opposite!?)

I have corrected your feedback resistor from pin 1 to pin 7 to a 100kOhm resistor in stead of 10kOhm, as well as added a 3kOhm resistor from pin 7 to Vcc.

Since I wanted another resonance frequency, than yours, I have changed the capacitor in the LC circuit to 470pF rather than 1000pF. Theory says ~488 kHz, as fare as I have found. Which should be below what the LM339 will run (>500kHz).

The LM339 is powered at pin 3 with Vcc and pin 12 is connected to GND.

Vcc is 5V.

I have connected the non-inverting inputs of comparator 3+4 to Vcc and the inverting of comparator 3+4 inputs to zero.

No ATmega is connected, only 5V LAB power supply and an oscilloscope on output from both pin 1 and pin 2. No square output and what I get is very weak noise oscillations, properly from the overhead lights.

I can send hand drawings of my design, output from the oscilloscope, and pictures of the circuit. The prototype is done on a PCB stripboard.

Any ideas?

I’ll try redo the board tomorrow on a new piece of PCB Stripboard with another layout I have drawn up today. To see if I have been handling something wrong on the first drawing or made bad soldering joints somewhere.

Your help will be highly appreciated
Mikkel

16. Mikkel Wahlgreen says:

After a rebuild of the circuit I am now able to get something from the circuit: ~191 kHz square wave signal on both pin 2 and pin 1. (Jubi)
On the other hand I have a 222µH inductor and a 477pF capacitor, theory says: ~489 kHz
If the inductor is correct then the system must have 3160pF capacitance installed???

Im using a PCB Strip eurocard for the build, does this add that much stray capacitance? :S

• kwong says:

The stray capacitance from the board is a few pF’s maximum. Did you check the waveform? I suspect that the counter was not counting correctly and it may due to the input waveform.

• Mikkel says:

I’m seeing the waveform on my oscilloscope, not the ATmega
Havn’t even begun to load any program on to that yet, one step at the time :P