
An updated version of the Millivolt Meter project from May 2016, with dual range selection, calibration selection, improved software, and updated board layout.
After three years, I decided it was time for a refresh of my original Millivolt Meter version 1.51, based on the Scullcom Hobby Electronics Millivolt Meter on Youtube.
The original board was designed to loosely match the original Scullcom Hobby Electronics thru-hole board using a mix of surface mount and thru-hole devices instead. The major changes in version 1.5 were the addition of the Caddock voltage divider in place of the discrete resistors, the Arduino Pro Mini instead of the Nano, and using an I2C connected display instead of the directly connected parallel display.

The Version 1.51 board was featured in a later video by Scullcom Hobby Electronics as the Millivolt Meter MK2, with several other updates.
Paul Versteeg made several modifications to the board such as battery voltage monitoring and refined the software to include filtering, and improved calibration. Paul’s Blog

The new version 2 board is now larger to support the additional components.
One of the first changes was to replace the TO220 voltage regulator with a surface mount low quiescent current / low dropout version. Also added was a PTC fuse on the 9 volt input. The board will now work with a supply down to 5.4 volts which allows the 1.5 volt batteries to be drained all the way to 0.9 volts each.
A MAX14931 digital isolator was added between the digital and analog sections of the board for communications with the LTC2400 ADC, and isolates the SPI bus and relay control.
The ADR4540 voltage reference remains the same, but now has mechanical and thermal isolation slots around it along with additional filtering on the vref out using film capacitors.
The input voltage divider still uses the Caddock precision decade resistor divider, but it is now configured as a 10 meg Ohm 10:1 divider on the 40 volt range. A shielded COTO relay with a 5 volt coil is now included to switch to a 4 volt range, which bypasses the divider still keeping a 9 meg Ohm input resistance.
I added an over-range check in software to automatically switch to the 40 volt range from the 4 volt range if the voltage is greater than 4.01 volts or the ADC sets the over-range bit, along with setting the backlight to violet to warn of the range change.

Some other new items are an input protection board, a ZeptoBit isolated USB-UART adapter, Multi-input I2C LCD display adapter with EEPROM, battery voltage monitor, and back panel calibration selection switch.

To connect the USB isolator to the back panel I used an Adafruit panel mount extension USB Cable — Micro B Male to Micro B Female #3258.
For the calibration switch, I used a C&K MA00L1NZQD rotary switch and pinned it for 5 positions with the fifth position being OFF to prevent accidental calibration from the front panel.
I was originally going to use 4 single calibration points, but ended up using a 2‑point cal for each range at 10% and 90%.
Cal‑A and B are used for the low (0.4096) and high (3.6864) cal for the 4 volt range, with Cal‑C and D used for the low (4.096) and high (36.864) cal on the 40 volt range.
The calibrations for each range must be done with A before B, and C before D, as the high cal for each range uses data from the low cal for it’s calculations.
The 2‑point cal doesn’t use a zero cal, so that front panel switch is currently unused.

I used a 6‑cell AA battery pack for normal operation of the meter, but added an external power jack for testing and burn-in purposes. I kept the unit powered continuously for over 1,000 hours / 45 days to allow the voltage reference drift to settle, before my final calibration.
Overall I am pleased with the updates, but feel that there is still room for improvement especially with the software to reduce some non-linear errors with the ADC.
I would like to utilize the EEPROM on the I2C display board to map out the non-linear errors in the ADC circuit, but that will be a future project.

Eagle CAD board and schematic files Millivolt Meter Version 2.11
OSH Park Millivolt Meter V2.11 project page
Millivolt Meter Ver. 2.11 BOM
Eagle CAD board and schematic files RGB I2C Display with EEPROM
Eagle CAD board and schematic files Input Protection board
Front Panel Designer front and back panel files for Hammond 1455N1601BU box
Arduino sketch files for software version 3.34
Modified Adafruit_RGBLCDShield library for additional input I/O
Hi Greg,
This looks like a very good iteration from your 1.5 version. I was waiting to see if there had been any further developments and am pleased to see that you have incorporated several advances in this design. I like the multipoint calibration mechanism and the board design looks like it has incorporated several advances that, in theory should improve on the previous performance. The changes to the voltage regulator was something I was intending to do if I made the 1.5 version, but the other changes should be very beneficial too.
One of the issues raised with the previous problem seemed to be wide variations and linearity problems at the very low end of the range. Has the range switchover improved this? It seems that you have a strategy for addressing linearity and storing this in EEPROM which sounds like it should be a simple coding issue 😉 rather than a pcb design problem.
Looking at the photos in your blog, I note that there are a couple of post-production ‘additions’. There is a blue wire from pin 5 (INA3) on the isolator heading under the Arduino — not sure if that has been addressed on the latest pcb? There is also a SOT23 daughterboard visible on the ‘top view’ of the open case above — looks like it might be an additional voltage regulator to the Arduino?
I am busy with the MilliOhm meter at the moment but will be following this one closely as it is high on my list of ‘interesting projects’.
As a complete aside, I designed a set of RF H‑Field probes on a 4 layer PCB earlier in the year but never got round to producing them. When I was looking on OshPark for the MilliOhm boards, I came across a similar set you had produced but can’t find any reference to them in your blog. I would be interested to know if you got them to work or if you had any problems with them.
Hi John,
There is some improvement at the low end due to the range switch and the 2‑point calibration, but once the measured voltage is at the middle or extreme high/low end of the range, there are still errors in the hundreds of uV.
The errors are very repeatable and stable, so that is why I am interested in exploring additional calibration methods.
The blue bodge wire was to correct a non-continuous trace for the relay control, which has been corrected in Ver. 2.11
The SOT23 is a Maxim MAX6342 power on reset monitor that I was experimenting with. The display that I was using had a really long startup and would require a system reset 10% of the time when powering up.
I ended up adding some additional capacitance to the existing reset circuit on the Pro-Mini (the blue capacitor) and removing the MAX6342.
The H‑Field probes were designed, but haven’t been ordered yet. Eagle CAD files
Thanks,
Greg (Barbouri)
Hello Greg,
Many thanks to you, and Louis Scully and Paul Versteeg, for making all this information available for hobby electronics enthusiasts.
This Millivolt Meter is an excellent project — I have started ordering parts and am looking forward to the building and testing.
One issue that puzzles me: It seems you have taken a lot of trouble to make sure that the critical front-end circuitry is designed to minimize noise and external interference by use of shielding, and keeping tracks as short as possible.
But you then hang a separate board on the input with large un-shielded protection components. Can you explain why this does not compromise the performance?
Ken.
Hi Ken,
You are correct the separate un-shielded protection board can compromise the performance.
But it is a compromise between blowing out the front end of the system with a surge, or a bit more noise on the input.
Everything in the design of a system is a compromise in performance, cost, safety, ruggedness, etc. It is very hard to have it all at the same time.
With a low noise voltage reference input to the Ver‑2 Millivolt meter and normal averaging, The meter only displays about 1 micro volt of noise on the display on the 4 volt scale with the protection board.
For me this is an excellent compromise. For others that want the lowest noise possible, it is easy to remove the protection board from the signal path and even add shielded cable from the inputs to the shielded box.
That is what I think is great about DIY electronics, you can do it the way you want and pick the compromises that you are comfortable with.
It would not be too hard to also build a shield for the protection board.
The main reason that I did add the shield on the main board was the very close proximity to the Teensy 3.2 board, and it’s digital noise.
Thanks,
Greg (Barbouri)
Hi Greg,
Thanks for reply.
Once built, I’ll play around with the input circuitry to see how it affects noise.
Ken.
Hi Greg, I ordered 3 of the 1.51 pcb last year (thank you very much for making them available) but made a few changes: I use an AD4550 5V reference. The AD8628, LTC2400 & AD4550 are powered by 5.25V. Measuring range is up to 5.2V/52V. I cut the ground trace of the AD8628 and provide ‑0.25V directly to its ground pin. See LM7705 for more information. A „rail-to-rail“ opamp isn‘t rail to rail, when it comes to milli- or microvolts. That‘s where the non-linearity comes from. It’s a deadband, not an offset, so you can’t calibrate it away. My input circuit uses two small signal relays to switch between the 1:10 divider (50V @ 10MOhm) and a direct connection from the input post via a 15kOhm/3W resistor to the input of the opamp (5V @ >1GOhm). The resistor protects against at least 100V in limiting the input current to the opamp to less than 7 mA. I too use a 2‑point calibration, but with arbitrary values for low and high. I enter the correct values (there are four buttons to do this) & the program calculates the coefficients for y = mx + b and stores them to the eeprom. There is also a problem with the float precision of the 8bit arduino. It‘s restricted to less than 7 decimal digits. Rounding errors are almost unavoidable. So I built my second mV-meter using a SamD21 (off the pcb) which provides true double precision. To calm the nervous display I do averaging 1 to 8 measurements before displaying and saving to the buffer. And I use a 2004 LCD. With a bit of averaging or filtering the reading is stable to 1..3uV. Both meters do not differ more than a few digits from 0 to 5V. To each other and a 6 1/2 digit Solartron 7150. This is astounding. The isolation of the digital signals is not necessary. I tried this too, using ADUM1201 magnetic isolators. I couldn‘t find any difference regarding the noise. While the LTC2400 is converting, nothing happens on these lines. I even tried to keep CS low after the first conversion. No obvious change. But a clean supply makes a difference. I use a LT3042 to provide the 5.25V to the analog part. Sorry for so much text 😉
Hi Greg & Henry
I was having a look at the code and note Henry’s comments about the limited Arduino float precision (no double precision floats available) and his choice of a SamD21 board. Had either of you considered using the ‘BigNumber’ library http://www.gammon.com.au/forum/?id=11519 ? This seems to be fairly fast and a simple drop in for the precision simple maths that is required?
BigNumber::begin (); // initialize library
//factorials
BigNumber fact = 1;
for (int i = 2; i <= 200; i++)
{
Serial.print (i);
Serial.print (“! = ”);
fact *= i;
Serial.println (fact);
}
I have just done some tests on a Nano and I am averaging calculating e to 10 decimals in 13ms and to 16 decimals in 25mS. More than sufficient precision and speed, I would think.
I will have a look in more detail at the code. There is a modest memory hit with this library but it doesn’t look too bad and there seemed to be plenty of room.
Hi Greg,
I have just received three boards for the Millivolt Meter v2. On both quality and design they look very good, and I’m about to start assembly.
I have another question, regarding separation between the analogue and digital parts of the design. I would have expected the critical Vref and ADC ICs to be connected to analogue ground, but they are in fact connected to digital ground. On the other hand, the signal isolation IC is placed after ADC and Vref, between them and the microprocessor. So I’m not clear on whether the ADC and Vref belong in the analogue or the digital domain.
Can you explain the thinking behind this aspect of the design?
Thanks, Ken.
Hi Ken,
The ADC and VREF are on a separate ground tied to a star ground point which forms ground 2. The isolation IC and relay are tied to ground 3 and are also tied to the star ground point.
My thought was to isolate the current flow paths on the analogue circuit side based on circuit type and limitations of using a 2 VS 4 layer board.
Greg (Barbouri)
Hi Greg,
So there are in effect three ground nets, with ADC and Vref having their own ground region. That makes perfect sense. It is not clear from the schematic, but looking carefully at the pcb layout in Eagle, I can see the the three ground regions.
Thanks for your reply, Ken.
Hi Greg,
Just wonder really — where do you get 36.864 V (Cal D) from please? As always excellent project or rather continuation of the project.
Thanks
Alex
Hi Alex,
I use a Power Designs Inc. Model C500 Precision DC Source.
I have also used my HP 6205C Dual power supply in the past, but it tends to drift over time.
I monitor the supply with a calibrated 6.5 digit meter, and adjust the output as needed.
Power Designs Inc. C500
Greg (Barbouri)
Hi Greg,
I do not have access to such a calibrator. I can only use a decent bench power supply – I think it should be enough.
Another question – I have calibrated the 4V scale, but the voltage is still off by 0.1–0.15V. Also say 2.5V is displayed on 40V scale, but does not displayed on 4V scale (hardware issues?). Do you have a more updated version of your sketch please?
Thanks
Alex
Alex,
Version 3.34 is the most current sketch.
The calibrations for each range must be done with A before B, and C before D, as the high cal for each range uses data from the low cal for it’s calculations.
Greg (Barbouri)
Sorry I previous message got partially deleted.
Greg,
The problem with the LCD screen was that in your Modified Adafruit_RGBLCDShield library, the MCP23017 address has to be corrected to 0x27 (this is what i2c scanner gives me):
#define MCP23017_ADDRESS 0x27
Another issue. I did follow the calib procedure (A before B, and C before D), but no luck. Output 4 (Position A5) is not working on both LCD backpacks (I think this is a software issue) so I moved it to A0 for now. Sadly, the errors are way too high. On the 4V range, on 3.6864V (this is a calib point), I am getting 3.2797V.
The same voltage on the 40V scale gives me 3.500971
This is massively off for both scales.
I thought the problem may be here in the sketch:
float A_CI_1 = 1677312 // Calibration ideal 1 — (0.4096 * 16777216)/ 4.09700 = 1677312 — 10% FS
float B_CI_2 = 15095809; // Calibration ideal 2 — (3.6864 * 16777216)/ 4.09700 = 15095809 — 90% FS
float C_CI_1 = 16773121; // Calibration ideal 1 — (4.0960 * 16777216)/ 4.09700 = 16773121 — 10% FS
float D_CI_2 = 150958089; // Calibration ideal 2 — (36.864 * 16777216)/ 4.09700 = 150958089 — 90% FS
However, it did not make any difference. Any ideas please?
Thanks
Alex