Skip to the content
4 layers80 × 100 mmAD5791-Linearity Calibrator, the printed circuit board in 3D

AD5791-Linearity Calibrator

NNNILabs/AD5791-Linearity-Calibrator16

Power is supplied through the 3.5mm terminal block with the labels 'IN+' and 'IN-'. +/-18V is an ideal nominal supply. The DAC board is connected to a computer through the Raspberry Pi Pico controller's micro USB port.

Size
80 × 100 mm
Copper layers
4
Thickness
1.6 mm
Parts
67
Nets
76
Pads
281
Tracks, vias
284, 74
Pours
23
Routed
Yes
KiCad
KiCad 8.0 (file 20240108)
Created
17 Apr 2023
Updated
10 Jul 2024

Overview

AD5791-Linearity Calibrator is an open-source printed circuit board by NNNILabs, from the NNNILabs/AD5791-Linearity-Calibrator repository on GitHub, published under the MIT licence. It is a 4-layer board of 80 × 100 mm with 67 parts on 76 nets, routed with 284 tracks and 74 vias.

It is built around the AD5791BRUZ, ADR1399KE and L78L15ABU, with the L79L15ACU among its other parts. Its parts include 16 capacitors, 13 connectors, 10 ICs, 9 resistors and 1 diode. It belongs with the RP2040 boards of this library.

Main components

4

README

README.md

Upload to - AISLER

AD5791 Linearity Calibrator

Introduction

Portable voltage, current and resistance standards exist and can be bought for a hole in your pocket, but linearity has exclusively been the domain of high-end bench multimeters. This project contains files for a linearity calibrator based around the AD5791BRUZ 20 bit DAC and a few assisting components.

Project Motivation

The gold standard for DMM linearity is the HP/Agilent/Keysight 3458A. This meter costs upwards of several thousand Euros and is out of reach for most people. While the AD5791 is not even close in terms of absolute linearity, the fact that it can be bought for much less (around 100 Euros) and has decent long-term INL stability (0.19LSB) makes it a good choice for a linearity transfer standard.

Usage

The C/C++ SDK for the Raspberry Pi Pico can be installed using the one-click installer found here. The SW folder is opened using 'Pico - Visual Studio Code', and built using the 'gcc-arm-none-eabi' tool. The build file (AD5791LinCal.uf2) can be uploaded to a connected Pico by using upload.bat after suitable configuration (see notes).

Power is supplied through the 3.5mm terminal block with the labels 'IN+' and 'IN-'. +/-18V is an ideal nominal supply. The DAC board is connected to a computer through the Raspberry Pi Pico controller's micro USB port. Communicating with the DAC is possible through any serial terminal. The binary code representing the desired output voltage is typed in, and the enter key is pressed to update the DAC output. The buffered DAC output is available on the 3.5mm terminal block with the labels 'OUT+' and 'OUT-'. Raw DAC output is available on the 'DAC' test point.

The DAC's transfer function is as follows:

math
V_{OUT} = \frac{(V_{REFP} - V_{REFN}) D}{2^{20} - 1} + V_{REFN}

Where:
VOUT is the desired output voltage
VREFP is the positive reference voltage (in this case approximately 10.5V)
VREFN is the negative reference voltage (in this case approximately -10.5V)
D is the integer digital code (0 to 1048575)

For example, 0 would result in VREFN on the output, 524288 would result in ~0V, and 1048575 would result in VREFP. Each step is therefore approximately 20uV.

Linearity

An example of the AD5791 DAC board was constructed and linearity was measured against a HP3458A DMM. Pre-endpoint fit was used to process the raw data from the DMM to provide a linearity chart. The starting and ending points of the linearity run (in this case, 0 and 1032192) were measured first, and used to pre-calculate m and c values that are applied to the complete run that follows. This provides an indication of drift, and if its effect on the run was larger than the peak non-linearity, in which case the run can be discarded. In this example, the drift across all five runs was around 0.3ppm, corresponding to 3uV.

List of Files

  • Hardware: KiCAD schematic and PCB files, GERBER files, BOM
  • Software: C/C++ code for the Raspberry Pi Pico, .uf2 file for direct upload, upload.bat upload assistant
  • Resources: Images, AD5791 datasheet and ISSCC paper mirror

Application Examples

Determining Linearity of a DMM

Integral Non-Linearity (INL) describes how the input/output transfer function of a multimeter differs from the ideal straight line. Test methodology involves connecting a voltage source with a known linearity to the meter, and measuring meter readings at various points. Since the meter and source gains and offsets are not guaranteed to be the same, the source gain and offset has to be "normalized" to the meter gain and offset through a simple linear endpoint-fit method. Although some information at the endpoints is lost, it is most often the "shape" of the INL curve that is of interest. The data could possibly be used to derive a transfer function to further increase DAC/ADC linearity.

Stable, Precise Voltage Source

Given the high resolution of the AD5791 (20 bits), fine voltage steps of 20uV can be achieved. This facilitates experiments that need ultrafine voltage steps. In some cases, the DAC, with its 1us settling time, can be used to generate precision waveforms through additional code modification (Wave table -> DMA -> PIO).

Notes

  • By initializing GPIO 23 as an output and setting it high, the Raspberry Pi Pico's internal SMPS switches to PWM mode, where radiated EMI and output ripple is lower.
  • PCB template is a modified version of Mark's Protocard template.
  • upload.bat was created by Utsuho, and faciliates hands-free upload to the Pico. The COM port the Pico is connected to and the drive letter are entered in lines 7 and 11 respectively. After the software is built, upload.bat is run from the terminal by doing '.\upload.bat' on Windows. The Pico enters boot mode and the .uf2 from the build folder is automatically uploaded. Make sure the COM port is not being accessed by other programs.

Links

Parts

67
QtyValueFootprintReferences
7, , , , , ,
6100nFCapacitor_SMD:C_0603_1608MetricC9, C10, C11, C12, C13, C14
610RResistor_SMD:R_0603_1608MetricR2, R3, R4, R5, R6, R7
5PWRConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ9, J10, J11, J12, J13
3100uFCapacitor_SMD:CP_Elec_6.3x5.4C1, C2, C3
310uFCapacitor_SMD:C_0603_1608MetricC5, C6, C7
210uFResistor_SMD:R_0603_1608MetricC15, C16
21uFCapacitor_SMD:C_0603_1608MetricC4, C8
2VREFPConnector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_VerticalJ2, J5
2~100mm template footprints:CTB93HD3J1, J4
1100KResistor_SMD:R_0603_1608MetricR1
110KPackage_SO:SOIC-16_3.9x9.9mm_P1.27mmRN1
11KResistor_SMD:R_0603_1608MetricR8
15819Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolderD3
15R1Resistor_SMD:R_0603_1608MetricR9
17533Package_TO_SOT_SMD:SOT-89-3U12
1AD5791BRUZAD5791BRUZ:SOP65P640X120-20NU5
1ADR1399Package_TO_SOT_THT:Analog_TO-46-4_ThermalShieldU10
1ADuM1400xRWPackage_SO:SOIC-16W_7.5x10.3mm_P1.27mmU13
1DACOUTConnector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_VerticalJP1
1GNDConnector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_VerticalJP2
1L78L15Package_TO_SOT_SMD:SOT-89-3U4
1L79L15Package_TO_SOT_SMD:SOT-89-3U11
1OUTBUFPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU9
1PWRConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ7
1PicoMCU_RaspberryPi_and_Boards:RPi_Pico_SMD_THU8
1REFBUFPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU7
1REFCAPConnector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_VerticalJ8
1REFSCALEPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU6
1RSTButton_Switch_SMD:SW_SPST_B3U-1000PSW1
1SIGConnector_PinHeader_1.27mm:PinHeader_1x04_P1.27mm_VerticalJ6
1VREFNConnector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_VerticalJ3

The 60 most common of 67 parts.

Similar boards

  • 4 layers146 × 95 mmEEZ DIB MIO168, the printed circuit board in 3D

    EEZ DIB MIO168

    eez-open/dib-mio168

    EEZ DIB Mixed I/O module

    279 parts8
  • 16 layers302 × 188.1 mmDacboard, the printed circuit board in 3D

    Dacboard

    ShizeChe/unispin

    Unified control architecture for spin qubits in quantum dot devices

    481 parts18
  • 2 layers60 × 39 mmPcb adr1399-vref, the printed circuit board in 3D

    Pcb adr1399-vref

    Atmelfan/pcb-adr1399-vref

    A simple ADR1399/LM399 voltage reference

    18 parts1
  • 10 layers40 × 160 mmPsc daughter brd, the printed circuit board in 3D

    Psc daughter brd

    NSLS2/zupsc-hw

    Zynq UltraScale Power Supply Controller hardware

    345 parts1BSD-3-Clause
  • 2 layers95 × 55 mmLogic probe, the printed circuit board in 3D

    Logic probe

    sjm42/electronics

    Various electronics projects

    103 partsApache-2.0
  • 2 layers175 × 103 mmRnvm homer, the printed circuit board in 3D

    Rnvm homer

    kitspace-test-repos/kicad6-file-collection

    238 partsMIT
  • 4 layers22 × 15 mmAmp cpw hmc311, the printed circuit board in 3D

    Amp cpw hmc311

    loxodes/vna

    Under development open hardware microwave vector network analyzer

    67 parts205
  • 4 layers51.4 × 60.6 mmGb rp2040 cart, the printed circuit board in 3D

    Gb rp2040 cart

    deltabeard/DBGC

    A Game Boy cartridge using the Raspberry Pi RP2040 with RTC and MBC support.

    67 parts57

Questions

How big is the AD5791-Linearity Calibrator PCB?

It measures 80 × 100 mm and has 4 copper layers, 1.6 mm thick.

What parts does the AD5791-Linearity Calibrator use?

67 parts, built around the AD5791BRUZ, ADR1399KE, L78L15ABU and L79L15ACU. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the AD5791-Linearity Calibrator KiCad files?

From the NNNILabs/AD5791-Linearity-Calibrator repository on GitHub, at the commit this page was made from: the board is HW/AD5791 Linearity Calibrator.kicad_pcb and its schematic HW/AD5791 Linearity Calibrator.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the AD5791-Linearity Calibrator design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).