Updating the Programmable Voltage Reference Project

After five years and a few pro­to­type revi­sions of the Version 2.12 Programmable Voltage ref­er­ence, I decid­ed it was time to update the project based on many requests and lessons learned from pro­to­types over the years.

Front pan­el Programmable Voltage Reference ver­sion 3.14 set to 2.500 volts

A year after com­ple­tion of the ver­sion 2.12 pro­gram­ma­ble volt­age ref­er­ence (PVR), in 2017 I built anoth­er pro­to­type unit based on a Maxim MAX6341 4.096 volt ref­er­ence. It includ­ed a ded­i­cat­ed ‑5 volt sup­ply, and a MAX6126 2.048 volt ref­er­ence for the Teensy 3.2 board. There were ded­i­cat­ed head­ers for the ser­i­al port and front pan­el but­tons. It was lat­er updat­ed with an inline I2C EEPROM board in 2018, which allowed each mil­li­volt step to have it’s own cal­i­bra­tion stor­age position.

Version 2.25 of the Programmable Voltage Reference 4.096 V prototype
Version 2.25 of the Programmable Voltage Reference 4.096 V pro­to­type front panel

The project remained dor­mant for sev­er­al years while I worked on many oth­er projects. After many requests for a 5 volt ver­sion of the PVR, I start­ed work­ing on an updat­ed design again last year (2021) at a slow pace. The two main design fac­tors were, pro­vid­ing an out­put up to 5 volts, and reduc­ing the drift at the out­put from tem­per­a­ture and humid­i­ty changes.
What I end­ed up with after many iter­a­tions, was a 0.001 to 5.000 volt out­put ver­sion 3.14 of the Programmable Voltage Reference, with new com­po­nents and and upgrad­ed specifications.

Version 3.14 of the Programmable Voltage Reference 5.000 V prototype

Where to start, as there are so many changes in this ver­sion, and so many thing that remain the same.
The most obvi­ous change is the LTC6655BH-LS8 5 volt bandgap ref­er­ence IC from Analog Devices Inc., sit­u­at­ed in it’s own spe­cial sec­tion of the board.
I chose the LS8 pack­age which is a 5mm × 5mm sur­face mount her­met­i­cal­ly sealed unit that pro­vides out­stand­ing sta­bil­i­ty and no humid­i­ty sen­si­tiv­i­ty. The BH units have a datasheet spec­i­fi­ca­tion of less than 2ppm/°C and an out­put volt­age accu­rate to ±0.025%.
The cir­cuit board is rout­ed out around the ref­er­ence IC foot­print, in what I call spi­der legs. There are four traces on top and four traces on the bot­tom for 8 legs. The LTC6655 has force and sense con­nec­tions that uti­lize the top and bot­tom traces on one of the legs, which tie togeth­er near the ref­er­ence input on the DAC IC. There is a mount­ing area out­side of the spi­der legs for a 3D print­ed enclo­sure to reduce air cur­rents, and pro­vide ther­mal sta­bil­i­ty for the ref­er­ence IC.

Circuit board top view of PVR 3.14 using OSH Park “AfterDark” fabrication

The 3D print­ed ref­er­ence enclo­sure uses sev­er­al lay­ers of roVa Flex Plus Aerogel Insulation on the front and back hous­ings for increased ther­mal resis­tance. The hous­ing is attached with four nylon fil­lis­ter head 2–56 X 1/2″ screws.

3D print­ed enclo­sure and insu­la­tion for ref­er­ence IC

The out­put fil­ter­ing capac­i­tors for the LTC6655 ref­er­ence con­sists of two Rubycon film ML series capac­i­tors with val­ues of 22 uF and 0.1 uF placed close to the ref­er­ence and D to A con­vert­er IC.
Another change is the Analog Devices Inc. AD5541LRZ 16 bit unbuffered DAC in a 8‑SOIC pack­age. The AD5541 fea­tures a 1 µs set­tling time, low noise per­for­mance of 11.8 nV/√Hz, and 1 LSB INL accu­ra­cy at 16 bits with­out adjust­ment. It is also much eas­i­er to sol­der than the pre­vi­ous AD5060BRJZ in the SOT-23–8 pack­age. I includ­ed some tiny 0402 sig­nal line fer­rite bead induc­tors on the SPI lines con­nect­ed to the DAC after the MAX14930 iso­la­tor to reduce dig­i­tal noise.

Bottom side of PVR V 3.14 board with insu­lat­ed cover

The Teensy 3.2 exter­nal volt­age ref­er­ence IC changed from a Maxim MAX6126 2.048 volt unit to a MAX6126 2.500 volt ver­sion. This keeps the Teensy’s ADC read­ing 1/2 the out­put volt­age val­ue.
The DAC out­put buffer op-amp has changed from the LTC1152 to a Texas Instruments OPA388 which fea­tures ultra-low noise, fast-set­tling, zero-drift, and rail-to-rail input and out­put oper­a­tion.
Because we are using a 5 volt ref­er­ence, the ana­log pow­er rail was increased to 5.3 volts, and is sup­plied by volt­age reg­u­la­tor IC2 which is an ABLIC Inc. S‑1200B53.
The orig­i­nal 2.12 PVR used a dig­i­tal out­put from the micro­proces­sor to gen­er­ate a neg­a­tive volt­age rail, and now uses a Maxim MAX829 switched-capac­i­tor volt­age invert­er for the ‑5 volt sup­ply.
To pow­er the new 5 volt ref­er­ence IC, I used a Texas Instruments LP38798 800-mA Ultra-Low-Noise, High-PSRR LDO reg­u­la­tor. It is set to 6.4 volts using resis­tors R11 and R12, which val­ues are labeled incor­rect­ly on the Ver. 3.14 board. They should be labeled 14.7K and 64.9K Ohms respec­tive­ly, and have been updat­ed in the Ver 3.15 schematic.

Testing the Ver. 3.14 PVR board with sur­face mount com­po­nents installed

You may have noticed by now that the cir­cuit board is not my stan­dard OSH Park pur­ple sol­der­mask ver­sion. I decid­ed to try out OSH Park’s “AfterDark” fab­ri­ca­tion ser­vice that uses a clear sol­der­mask on a black sub­strate. I was very hap­py with the qual­i­ty of the boards, the clear sol­der­mask gives the black sub­strate a mat­te dark grey look, which is fine for my appli­ca­tion because I was main­ly inter­est­ed in show­ing off the cop­per. By remov­ing the sol­der­mask from areas in the board design it will pro­vide an even dark­er black look if needed.

Testing with Teensy 3.2 installed along with rotary encoder and OLED display

The PVR still uses a PJRC Teensy 3.2 (pur­ple edi­tion) micro­proces­sor and requires the removal of the 470 ohm aref resis­tor, to use the exter­nal volt­age ref­er­ence.
Instead of the four dig­it sev­en seg­ment dis­play mod­ule used in past ver­sions, the ver­sion 3.14 PVR uses a slim 2 line by 16 char­ac­ter OLED dis­play using I2C com­mu­ni­ca­tions. This allows for addi­tion­al infor­ma­tion to be dis­played includ­ing Set Voltage, Readback Voltage, Calibration Offset, Mode, and Battery Status.
The out­put step volt­age on the PVR 16 bit DAC is 76.2 micro­volts with the 5.000 volt ref­er­ence. So the volt­age out­put can be set to with­in 38.1 micro­volts of the desired volt­age by apply­ing an off­set cal­i­bra­tion adjust­ment for each mil­li­volt step set­ting.
After two months (1,400 hours) of “burn-in”, I cal­i­brat­ed each of the 5,000 one mil­li­volt steps that the PVR can out­put to with­in 40 uV of the set­point, and based on test­ing over the past few weeks it eas­i­ly stays well with­in 50 uV of the set volt­age even with tem­per­a­ture changes.
I test­ed the cur­rent out­put capa­bil­i­ty at 2.5 volts, and was able to out­put up to 36 mA before the out­put sagged 50 µV at the out­put terminals.

Back of PVR Ver. 3.14 board with cop­per ground pour below clear soldermask

I had the front pan­el fab­ri­cat­ed by Front Panel Express, and used some Pomona 72912 series banana jacks for sheathed plugs with gold plat­ed nick­el brass con­tacts.
I assigned the rotary switch push­but­ton to incre­ment the volt­age in steps of 250 mV, and added a momen­tary SPDT switch with cen­ter off posi­tion to incre­ment and decre­ment the volt­age by 25 mV with each tog­gle. This allows for quick­ly set­ting the volt­age in the 5,000 step range using two con­trols posi­tioned next to each oth­er. The step set­tings are eas­i­ly pro­gram­ma­ble in the soft­ware depend­ing on user pref­er­ence.
The front pan­el also has SPDT momen­tary switch for select­ing the oper­a­tional mode. Also includ­ed is an On-Off pow­er switch.

Boards and switch­es mount­ed in the Programmable Voltage Reference case

I used an iso­lat­ed USB to UART ser­i­al TTL board by Zeptobit for com­mu­ni­ca­tions with a host com­put­er. I had ordered sev­er­al of the iso­lat­ed USB Zeptobit boards sev­er­al years ago, and they work well, but now seem to be per­ma­nent­ly out-of-stock. I am cur­rent­ly work­ing on my own ver­sion of the board, com­ing soon.
Power is sup­plied by an exter­nal 7.5 volt 300 mA DC pow­er sup­ply con­nect­ed by a bar­rel jack and a fil­ter­ing induc­tor / capac­i­tor on the back pan­el.
I am still work­ing on a 2‑cell lithi­um bat­tery solu­tion for ful­ly iso­lat­ed use, but it still needs some more work before I will be hap­py with it.

Programmable Voltage Reference inter­nal com­po­nents look­ing forward

One of the areas that needs addi­tion­al work is the soft­ware side of the project. It is cur­rent­ly oper­a­tional, but could be so much bet­ter with addi­tion­al devel­op­ment by peo­ple with exper­tise in that area. I can mud­dle my way through get­ting it work­ing, but it is far from ele­gant.

Some things on the soft­ware to-do list are:

  • Create a mode for front pan­el cal­i­bra­tion of indi­vid­ual mV steps.
  • Provide a way to back­up and restore the cal­i­bra­tion data using the dis­play EEPROM.
  • Download the cal­i­bra­tion data to a text file
  • Automatic cal­i­bra­tion using an exter­nal cal­i­brat­ed meter such as a HP 3456A over GPIB
  • Mode switch­ing using the front pan­el mode button
  • Auto cal­i­bra­tion of the Teensy 3.2 inter­nal ADC to match the PVR’s cal­i­brat­ed output
  • Microprocessor and inter­nal ADC sleep mode
  • OLED dis­play auto-off set­ting while leav­ing the unit pow­ered on
Back side of the PVR case with pow­er input and micro‑B USB

So far the ver­sion 3.14 pro­gram­ma­ble volt­age ref­er­ence has exceed­ed my expec­ta­tions. I have already used it on sev­er­al projects, and I feel that cur­rent­ly it’s only short­com­ings are the lack of a inter­nal bat­tery, and some soft­ware refine­ment.
I will also make ver­sion 3.15 schemat­ic and board files avail­able, there are no com­po­nent changes, but I haven’t built a board yet to test that every­thing is still correct.

EagleCAD 7.7 schemat­ic and board ZIP file for the PVR Version 3.14
EagleCAD sch. and board ZIP file for the PVR Version 3.15untest­ed

BOM for PVR 3.14 ZIP file with PDF and Excel files

Teensyduino soft­ware sketch for Teensy 3.2 PVR on Github.com
Other files are also host­ed on the Github page, includ­ing the front pan­el and 3D files.

Thingiverse .STL files link for 3D print­ed volt­age ref­er­ence covers

Links to OSH Park board fab­ri­ca­tion for Version 3.14 and Version 3.15

Original design and soft­ware by C. Schnarel 2014 https://github.com/uChip/VoltageReferenceProgrammable


Programmable Voltage Reference by G. Christenson 2022 / C.Schnarel 2014 is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

27 Replies to “Updating the Programmable Voltage Reference Project”

  1. Instead of build­ing an iso­lat­ed USB UART board, you could use a USB iso­la­tor such as an ADUM3160 to go to the USB port on the Teensy

    1. Hi Alex,
      The ADUM3160 is out-of-stock at all of my usu­al com­po­nent sup­pli­ers and the pre-made units avail­able only seem to use a USB‑A type connector.
      Anyway, I have already built an iso­lat­ed board. Isolated TTL Serial to USB 2.0 Converter
      Currently work­ing on a dif­fer­ent 6‑pin iso­la­tor board using a dif­fer­ent IC.

      Thanks,
      Greg (Barbouri)

  2. Hi

    Thank you for the update, unfor­tu­nate­ly the LTC6655BH-LS8 5 volt is sold out util March next year, would this cir­cuit also work with the 4.96V version ?

    Cheers
    Michael

    1. Hi Michael,
      Yes, the cir­cuit will work with the 4.096V ver­sion of the IC, but will require some soft­ware changes.
      You may want to also adjust the ref­er­ence pow­er sup­ply down from 6.4 volts to 5.5 volts for the low­er volt­age reference.
      I have plans to use a 2.048V LTC6655 with this board, and designed the board to work with it also.

      Greg (Barbouri)

  3. Hi
    Thank you for shar­ing the project and the front panel.
    Which case did you use ?
    Is this a Hammond ?

    Cheers
    Michael

    1. Hi Michael,
      It is a Hammond Manufacturing 1455N1601BU Box Metal, Aluminum Blue End Panel(s) 6.299″ L x 4.055″ W (159.99mm x 103.00mm) X 2.087″ (53.00mm).

      Greg (Barbouri)

  4. Hi Greg, I’m study­ing your design and I have a ques­tion about a part. VD1 is called a 2.5K divider, and in the BOM you list it as an LM50, which is a temp sen­sor. I looked at some pos­si­ble parts and found the MPMT5001 series. They come with .1, .5 and 1% toller­ances. Can you please elaborate?
    tks, Paul

    1. Hi Paul,
      I used a Vishay MPMT5001AT1 RES NTWRK 2 RES 2.5K OHM TO236‑3 for the volt­age divider.
      A quick check of Digikey shows out-of-stock, but the MPMT4001AT1 2.0K divider would work just as well.
      It is used for the mod­i­fied 2.5 volt ref­er­ence on the Teensy so that a 5.0 volt out­put is divid­ed to a 2.5 volt full scale reading.
      It looks like I end­ed up using the LM50 com­po­nent foot­print which match­es the unavail­able V‑divider footprint.

      Greg (Barbouri)

  5. Hi Greg,

    Could you please elab­o­rate how you cal­i­brat­ed each of the 5,000 steps in 40uV? I am try­ing to do the same, but I would need to dive into 24LC512 pro­gram­ming. Is there any way to auto­mate it? I do not have a Gpib port on my multimeter.

    Another prob­lem is that part of uChip code for cal­i­bra­tion does not work on Teensy via USB. I am not get­ting any response in the Serial Monitor of Arduino 2.0.3 using car­riage return at 115200 baud. 

    Thanks

    1. Hi Alex,
      Currently the only way to adjust the off­set or per­form cal­i­bra­tion in thru the Teensy 3.2 USB port.
      The com­mu­ni­ca­tions pro­to­col is very picky and requires exact­ly five char­ac­ters before the car­riage return.
      If any­thing is out of place in the entry string there is no response, and may look like it is non-functional.
      The first char­ac­ter must be a ! # W U N C O or R
      and must be fol­lowed by four dig­its before the CR, no spaces. ie #0500 to set the out­put to 500 mV using the pro­grammed cal­i­bra­tion offset.
      The W (write) pre­fix is used to enter the cal­i­bra­tion off­set for the cur­rent­ly dis­played out­put setting.
      The com­mand W0001 is used to set the cal­i­bra­tion +76.2 micro­volts from the un-cal­i­brat­ed output.

      Greg (Barbouri)

        1. Here is a link to the orig­i­nal cal­i­bra­tion and com­mand def­i­n­i­tion PDF’s from uChip.
          Original Command def­i­n­i­tion and Cal zip file
          The cal­i­bra­tion pro­ce­dure has sig­nif­i­cant­ly changed from the orig­i­nal code, and some extra com­mands have been added or mod­i­fied. But the doc­u­ment describes the
          basics of com­mand entry, how to enter neg­a­tive off­sets, etc.

          Greg (Barbouri)

          1. Excellent! I was look­ing for these files, but they were delet­ed from Sparkfun forum.
            What extra com­mands did you introduce?
            I see that its been mod­i­fied for the JC_EEPROM lib.

          2. C for Calibration (cal pro­gram­ming not com­plet­ed or implemented)
            O for turn­ing the OLED dis­play Off
            code lines 401–468 for 1st dig­it commands

            No need to “dive into 24LC512 pro­gram­ming” as it uses the excel­lent Arduino EEPROM Library by Jack Christensen

            Greg (Barbouri)

        2. Many thanks again,

          I saw these C and O options are not fin­ished. I’ll have a crack at C — I sup­pose the idea is to off­set the whole range from 0–5000mV by an off­set val­ue inputted here.

          1. The orig­i­nal intent of the C (Calibrate) func­tion was to put the PVR in a mode that allowed the use of the front pan­el switch and rotary encoder to eas­i­ly change the cal­i­bra­tion off­set using a con­nect­ed cal­i­brat­ed meter on the output.
            Instead of typ­ing in off­sets thru the USB port, the off­set could be changed using the +/- 25 mV switch in 76.2 uV incre­ments with real time changes shown on the meter, entered and stored using the rotary push-but­ton, and then move on to the next set­ting using the rotary dial.
            A nice addi­tion would be to auto­mat­i­cal­ly use the last off­set set­ting for the next out­put set­ting, and then just press the push-but­ton to save if the out­put is with­in cal limits.
            Typically the out­put stays with­in cal for many steps before need­ing to be changed, and then it only needs to change by one cal step.

            Greg (Barbouri)

  6. Greg,

    Did you notice that the Rotary.h lib is not work­ing prop­er­ly even if putting r.begin(true); in the setup?
    Only LED in the encoder. The lib works prop­er­ly alone. Compatibility issues?

    Alex

    1. Alex,
      I am using a cus­tom rotary encoder board with a RC net­work to slight­ly stretch the encoder puls­es, which has made the encoder oper­a­tional, but it still some­times miss­es puls­es if I turn it quickly.
      My guess is that the puls­es are chang­ing so fast that the library is miss­ing them, or I am using the library incorrectly.
      Unfortunately once I had it most­ly work­ing I nev­er went back to ful­ly resolve the issue.

      Greg (Barbouri)

      1. The encoder worked fine in 2.12.
        I have these warn­ing when com­pil­ing and I think the prob­lem might be here?

        VoltageReferenceProgrammable_v3.15-latest.ino:221:16: warn­ing: com­par­i­son between signed and unsigned inte­ger expres­sions [-Wsign-com­pare]
        if (refVal > MAXVAL) refVal = 1;
        ^

      2. Hi Greg.

        After going back and forth for some time I can con­clude the following:

        - Rotary.h is not reli­able with Teensy. It works real­ly well with Arduino Uno and and sim­i­lar ATMEGA328P IC;
        This was dri­ving me nuts, I could not set 3.000V but 3.001 as the encoder was always miss­ing 1–2 pulses;

        - https://github.com/gfvalvo/NewEncoder is much bet­ter to use with Teensy;

        - I am mod­i­fied it to use this LED i2c Encoder — https://www.duppa.net/shop/i2cencoder-v2‑1/?v=79cba1185463
        There is a lib for this board where debounc­ing can be spec­i­fied. Works real­ly well;

        - I under­stand that you went dif­fer­ent way mod­i­fy­ing the encoder adding 100nF caps and some resis­tors. Works too;

        Regards
        Alex

  7. I’m curi­ous what the rea­son is for the “spi­der leg” method you used for the bandgap ref­er­ence on this board design. It is inter­est­ing and I have not seen this done before. Is it for noise or ther­mal isolation?

    1. Hi John,
      The main rea­son for the cutouts is for mechan­i­cal stress from ther­mal and humid­i­ty expan­sion of the sur­round­ing FR4 print­ed cir­cuit board material.
      Page 16 of the LTC6655 data touch­es on this issue. Analog Devices Application Note 82 goes into much more depth in opti­miz­ing volt­age references.
      An addi­tion­al advan­tage of slot­ting the PC board is that the LTC6655 is more ther­mal­ly iso­lat­ed from sur­round­ing cir­cuit­ry. This can reduce ther­mo­cou­ple effects and improve accu­ra­cy also.
      The spi­der legs and 3D print­ed ther­mal enclo­sure with Aerogel, kind of take this iso­la­tion to an extreme, but every lit­tle bit of improve­ment counts.

      Greg (Barbouri)

    1. Hi Alex,
      Unfortunately the Teensy 4.0 is not compatible.
      The main issue that I see is the miss­ing pins for using the exter­nal ref­er­ence, which affects the out­put monitoring.

      Greg (Barbouri)

Leave a Reply

Your email address will not be published. Required fields are marked *