ESR meter with Arduino

What Schottky diode is everyone using that has had success? I am currently using a B340A-E3/61T and the pulse peak at the terminal with no DUT is only around 150mv. I think this is causing my reading to drastically be off. I am trying to wrap my head around how the current voltage divider equations every one is using is working. It doesn't take in account of the clamping voltage and power dissipation of the Schottky diode. Any help would be greatly appreciated!

Hi bseishen,

If you read my original text (kept intact, below) then I am sorry. I ‘double-thinked’ myself into some confusion. I will try for a better take.
First, the Schottky diodes only limit the maximum voltage available to the DUT. Here’s what happens. The transistor Q1 turns on and a rising wave edge goes through R8 and is pretty much unaffected by C2/C1. So, R8 is effectively in series with the DUT. This forms a simple voltage divider and the rising wave edge sort of shelves at the voltage determined by the divider formed by R8 and the DUT. For a DUT with, say, 100 milliOhms, that is a pretty small voltage, i.e., a few milliVolts. Since we’re dealing with capacitors here, there is some continuing charging that will mess up the measurement if we wait too long to make it. I put together a LTSpice model to play with this. Attached is a closeup of a pulse from a sample run with a DUT of 100uF and .1 Ohm ESR. The yellow trace is the R8 side of C2 and the blue is the DUT side. (I had looked at the same thing on a 'scope and the simulation agrees really well. I don’t know why it didn’t sink in earlier. It is interesting to do a run with a resistor as DUT. The ‘shelving’ is more apparent.)
So, pretty much ignore what I said before. Part of my confusion was from using a different power source after changing the diodes. This shows that the value for Vcc in the code is quite critical for consistent and linear results. Also, it is now apparent how two ranges work by adjusting the voltage divider.
I hope this helps. My understanding is better, anyway.

---- here is the original text ----
I went back and really looked at this as well as reading the original document by Dr. Le Hung (link in szmeu’s first post). I have to admit that after looking closely, I really don’t understand this completely either. Clearly, the pulse can only have an amplitude determined by the schottky forward breakdown. In my circuit I used germanium diodes and that was about 300mV. I just swapped them for 1N5822 (as in the orignal schematic) and now have a pulse of 220mV and my calibration is way off. What seems apparent now, is that the voltage specified in the code as the ‘supply’ voltage, i.e., 5V, is just a number. I mean that it has to be adjusted to correspond to something that, well, I don’t know exactly what it specifies. Dr. Le Hung calls the pulses current pulses. There must be something to that since the two ranges do work (there is a factor of ten, approximately, difference when the pulse ‘comes from’ the 100 vs. 1000 Ohm resistor).
Try playing with the voltage value and see if you can dial something in. I haven’t tried that yet but it will be my next step to try and figure this out.
I am first a software guy and the hardware part of this is now not as clear as I thought. Maybe someone else can add to this.

ESR pulser.asc (3.56 KB)

Ended up doing some spice analysis on the schematic. The line is very linear! So with a simple slope formula should be able to get some good results. I currently have some 1% resistors in the mail, when i get them in i’ll test this out.

Wow, what timing! You posted while I was composing. Please read my update. I think your simulation is too simplified. I would be interested in your opinions if you would try mine.

Yup, it is super simplified. Just decided to do DC analysis only. I ran your schematic and I’m getting the same voltage per ohm on the ADC pin :slight_smile: Have you tried running different Schottkys? It changes the ADC voltage quite a bit! The DUT is incremented in .5 ohms on the attached graphs.



I have upgraded existing code with previous modifications to expand measurement range up to 50 Ohms and to make this ESR meter autoranging in the range of 0-50 Ohms which should be more than enough range for the ESR measurement. The code is included in the attachment and on the schematic you have to add one more PNP transistor with the same configuration as Q1 but with the 1k resistor instead of 100R (1k is for upper range measurement). Pinout in my sketch version is different in order to match my board so you will have to modify it according to your board settings.
Any comments/suggestions are welcome… (5.55 KB)

Hello everyone, and thank you for sharing your work.
I built the ESR meter using an Arduino UNO and a lcd display CDL4162-HD44780.
My version can work in two ways: with Arduino UNO connected to the board face down, and in standalone mode.
In the first case, only the bottom side of the pcb is required (single side)
I also added a function that allows me, by selecting the right value of the DUT, to know immediately if it is good or not.
BUT there is a problem: If I measure a 1ohm resistor, the reading is quite correct, but if I measure 150mohm or 75mOhm, the reading is totally wrong. :astonished:
Is there anyone who can help me? Thank you. :~




...mah: 20 days, 10 downloads, 0 replies :zipper_mouth_face:

You need to post the code you are using and the schematic of your hardware before someone can help you.

… 10 downloads of the attached .zip file with code, images, schematics and PCB design… (702 KB)

:sleeping: there anyone who has successfully measured low ohmic values??, for example 0.1 or 0.01; appropriate values ??to an ESR meter? ;)

Hi Baravantan,
To answer your last question, yes, I have measured what seem to be good values in the milliOhm range. I have a 100mOhm precision resistor and have measured many capacitors with what appears to be reasonable and repeatable results.
I took a quick look at your code and all appears to be OK with the actual calcESR routine. I didn’t look at your PCB layout so I can’t say more than that in my proto-board build I used the schematic exactly as in the original post EXCEPT that I used a 10microFarad cap and a 110Ohm resistor in the pulse circuit (47micro and 100 Ohm in the original).
I did notice in testing that the whole thing is very sensitive to the declared supply voltage and the value of this resistor. And I noticed in your code the following…

double Vin_LO = 4700; // milliVolts
uint16_t Rs_LO = 110; // Ohms

Are you actually using a 110 Ohm resistor? And is your supply voltage really only 4,7 V? Unless these (and the Vref voltage) are well defined, the calculation can be very non-linear.
Anyway, hope this helps.


Hi, Totoro, and thanks for your help! These days I've done some tests, including the correction of the parameters that you have shown me, but without solving the problem.

double vRef = 1.079; // Volts double Vin_LO = 4980; // milliVolts uint16_t Rs_LO = 99.8; // Ohms

All values ??measured with a €40 multimeter (what I have)

Considered that your ESR Meter works, surely my problem isn't in the code. I think there is a lot of work waiting for me...

Thank you again.

Totoro: Sorry, I am just a breadboard/point-to-point/proto-board type. My main need for an ESR meter is to troubleshoot old audio gear and test equipment.

Hello Totoro , I am having a hard time wrapping my head around which pins you hooked up to the 7 segment displays, can you possibly draw something quick showing pinouts? i dont want to use a lcd display, im going to make a smd version of the board and will post the results after i have a working prototype.

thanks so much!

ohh crap. :blush:

i need to take it easy on the drinking.. i think

let me guess: these are the common anodes (or cathode depending on display.) going to a transistor for each.

define PIN_DIG_0 10 // least significant digit

define PIN_DIG_1 11

define PIN_DIG_2 12

define PIN_DIG_3 13

these go to their respective pins on display..

define PIN_SEG_DP 8

define PIN_SEG_A 3

define PIN_SEG_B 2

define PIN_SEG_C 9

define PIN_SEG_D 6

define PIN_SEG_E 7

define PIN_SEG_F 4

define PIN_SEG_G 5

or do i need to stop drinking??? i think i can keep drinking. ]:D

Here is a shield I built for my Uno. It has a resolution of 0.02 Ohms. I'm currently finishing the video for the code demo/explanation on how it works.

Next I plan to simplify it a bit more and add a basic function generator on a shield designed for the Due.

I would like to thank Tim and his Visual Micro project. Using his add-in to program and debug the Arduino software made it easy.


Did anyone work on getting this to work with nF range capacitors, or to a resolution of mOhms or better?

What sort of time window is it taking to do the measurement for you guys?

Hi, is it possible in this scheme to measure the capacity of the capacitor? If so, by what formula? Thanks.

Can anyone tell me if this ESR can be used to test in circuit caps?



I built it as originally designed but to challenge myself I used all SMD components. The .1uF cap (0603) was a challenge as were the TO-23 cased transistors but it works just fine.

I used an Arduino MEGA 2560 and had to modify the code a bit. For those who have the MEGA and are using a standard 44780 2 line X 16 char LCD do the following:

LiquidCrystal lcd(6, 5, 10, 11, 12, 13);

comment out the setLEDpin lines - they dont work with this display
also analogReference(INTERNAL1V1); //setting vRef to internal reference 1.1V

INTERNAL won’t work on the MEGA - you must add the specifier “1V1” to the parameter.

This was indeed a fun project. I learned alot from building it. Thanks for sharing. Look forward to your next one.