

AD5791-Linearity Calibrator
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
4AD5791BRUZ
TSSOP-20-40℃~+125℃ 1 1.5LSB 1us 2.7V~5.5V 20 4.2mA SPI、QSPI Voltage-Unbuffered TSSOP-20 Digital to Analog Converters (DAC) ROHSAnalog DevicesDigital To Analog Converters (DAC)ADR1399KE
LCC87.05V Shunt Voltage ReferenceAnalog DevicesUncategorisedL78L15ABU
SOT-89-3-40℃~+125℃@(Tj) 1 1.7V 100mA 15V 35V 39dB@(120Hz) 6.5mA 90uV Fixed Over Current Protection、Over Temperature Protection、Short Circuit Protection Positive SOT-89-3 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSSTMicroelectronicsVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsL79L15ACU
SOT-89-30℃~+125℃@(Tj) 1 1.7V 100mA 15V 35V 39dB@(120Hz) 6.5mA 90uV Fixed Negative Over Current Protection、Over Temperature Protection、Short Circuit Protection SOT-89-3 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSSTMicroelectronicsVoltage Regulators - Linear, Low Drop Out (LDO) Regulators
README
README.mdAD5791 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:
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| Qty | Value | Footprint | References |
|---|---|---|---|
| 7 | , , , , , , | ||
| 6 | 100nF | Capacitor_SMD:C_0603_1608Metric | C9, C10, C11, C12, C13, C14 |
| 6 | 10R | Resistor_SMD:R_0603_1608Metric | R2, R3, R4, R5, R6, R7 |
| 5 | PWR | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J9, J10, J11, J12, J13 |
| 3 | 100uF | Capacitor_SMD:CP_Elec_6.3x5.4 | C1, C2, C3 |
| 3 | 10uF | Capacitor_SMD:C_0603_1608Metric | C5, C6, C7 |
| 2 | 10uF | Resistor_SMD:R_0603_1608Metric | C15, C16 |
| 2 | 1uF | Capacitor_SMD:C_0603_1608Metric | C4, C8 |
| 2 | VREFP | Connector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_Vertical | J2, J5 |
| 2 | ~ | 100mm template footprints:CTB93HD3 | J1, J4 |
| 1 | 100K | Resistor_SMD:R_0603_1608Metric | R1 |
| 1 | 10K | Package_SO:SOIC-16_3.9x9.9mm_P1.27mm | RN1 |
| 1 | 1K | Resistor_SMD:R_0603_1608Metric | R8 |
| 1 | 5819 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | D3 |
| 1 | 5R1 | Resistor_SMD:R_0603_1608Metric | R9 |
| 1 | 7533 | Package_TO_SOT_SMD:SOT-89-3 | U12 |
| 1 | AD5791BRUZ | AD5791BRUZ:SOP65P640X120-20N | U5 |
| 1 | ADR1399 | Package_TO_SOT_THT:Analog_TO-46-4_ThermalShield | U10 |
| 1 | ADuM1400xRW | Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm | U13 |
| 1 | DACOUT | Connector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_Vertical | JP1 |
| 1 | GND | Connector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_Vertical | JP2 |
| 1 | L78L15 | Package_TO_SOT_SMD:SOT-89-3 | U4 |
| 1 | L79L15 | Package_TO_SOT_SMD:SOT-89-3 | U11 |
| 1 | OUTBUF | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U9 |
| 1 | PWR | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J7 |
| 1 | Pico | MCU_RaspberryPi_and_Boards:RPi_Pico_SMD_TH | U8 |
| 1 | REFBUF | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U7 |
| 1 | REFCAP | Connector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_Vertical | J8 |
| 1 | REFSCALE | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U6 |
| 1 | RST | Button_Switch_SMD:SW_SPST_B3U-1000P | SW1 |
| 1 | SIG | Connector_PinHeader_1.27mm:PinHeader_1x04_P1.27mm_Vertical | J6 |
| 1 | VREFN | Connector_PinHeader_1.27mm:PinHeader_1x02_P1.27mm_Vertical | J3 |
The 60 most common of 67 parts.
Similar boards
- 4 layers146 × 95 mm

- 16 layers302 × 188.1 mm

Dacboard
ShizeChe/unispin
Unified control architecture for spin qubits in quantum dot devices
481 parts18 - 2 layers60 × 39 mm

- 10 layers40 × 160 mm

Psc daughter brd
NSLS2/zupsc-hw
Zynq UltraScale Power Supply Controller hardware
345 parts1BSD-3-Clause - 2 layers95 × 55 mm

- 2 layers175 × 103 mm

- 4 layers22 × 15 mm

Amp cpw hmc311
loxodes/vna
Under development open hardware microwave vector network analyzer
67 parts205 - 4 layers51.4 × 60.6 mm

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).