Programmable Voltage Reference – Part 1

First part of a project series for a “precision” programmable voltage reference based on the DAC1220 20-bit DAC. The goal is a voltage range of +/- 10V and a low temperature coefficient at max. 1ppm/°C for the whole circuit. This would result in a voltage change of 100µV for 5°C of temperature deviation.
Possible usage is the calibration of up to 4-digit multimeters and providing accurate and stable ref-voltages to ADCs and DACs.

The voltage reference IC for the DAC1220 is a MAX6325 2.5V with a tempco of 1ppm/°C, which I soldered on a breakout board for easy prototyping and later usage. The same applies to the DAC.

Prototype soldered on perfboard.

The prototype involves only the reference IC, the DAC and the essential voltage regulators. The circuit is powered of a 5V-to-12V step-up converter (which is isolating but this feature is ignored for now) and subsequent linear regulation to 5V and 9V for the DAC and the MAX6325. This also filters most of the noise generated by the switching converter and coupled-in noise by USB.

The DAC1220 is controlled via SPI and set to it’s maximum resolution of 20 bits. Although the output drivers are rail-to-rail types, the actual output voltage can’t go lower than about 1-2mV, but that’s not a big deal. Such low voltages are barely needed. The upper end doesn’t reach exact 5V too.

The theoretical resolution is 5V / 220 -> 4.768µV/bit. At a later time I’ve planned to add a positive amplifying op-amp stage, that will scale it to 10µV/bit in order to achieve a voltage span of approx. 0V to about 10.486V (minus the upper offset of course!).



The circuit is pretty simple. In the left corner there is the input connector with the 5V from the Arduino or any other microcontroller board. The digital logic lines are pulled up by three 10k resistors, the additional 2k resistors are optional and provide a crude protection to the DAC in case of overvoltage.

SIM1-0512s is a DIP-8 package DC-DC converter, which boosts the incoming 5V to 12V-14V. The following linear regulators (U1 and U2) provide the necessary voltages for the DAC (5V for analog and digital section) and the Reference IC (9V). U4 could be powered directly by U3, but I wanted to keep the noise as low as possible.

Although there is a model provided for the DAC, I used 1×8 pin headers to mount it via a breakout board.

Download above schematic (pdf):

Size : 117,8 kB Format : PDF





The Arduino code uses software-based SPI, because the DAC1220 runs only with a 2.5MHz crystal clock and it’s maximum serial clock rate is less than 1/10 of the master clock.

So the code above is versatile and not limited to the arduino platform, just adapt the pinouts and you’re ready to go. Some parts are extracted from GarageProto’s GitHub code, especially the serial input to float conversion. Thanks for that!



The current consumption is approx. 50mA@5V, but the majority flows through the switching and the linear converters. The DAC and the ref-IC draw only about 2mA.

Following some test voltages with relatively good software trimming.

The first 3 voltages are set to 1V, 2V and 3V. The last one to the maximum limited by the software (4.990V). The Multimeter has an offset of -0.0001 in the 10V range, which can be added. The values would then be only -100µV out. The last reading shows a bit non-linear distortion, which is expected at the upper end of the DAC (datasheet page 7) and could be corrected in software later.

Leave Comment

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

Time limit is exhausted. Please reload CAPTCHA.