Skip to the content
PCBKitNew board
4 layers120 × 75 mmCurrent Sources Improved, the printed circuit board in 3D

Current Sources Improved

mjmorano/Precision-Current-Source

Once it's uploaded connect the Arduino pins to the 6 pin header on the current source as follows:

Size
120 × 75 mm
Copper layers
4
Thickness
1.61 mm
Parts
95
Nets
104
Pads
360
Tracks, vias
534, 112
Pours
15
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
9 Mar 2025
Updated
3 Jun 2025

Overview

Current Sources Improved is an open-source printed circuit board by mjmorano, from the mjmorano/Precision-Current-Source repository on GitHub. It is a 4-layer board of 120 × 75 mm with 95 parts on 104 nets, routed with 534 tracks and 112 vias.

It is built around the OPA4182ID, PESE1-S5-S24-M and AD7789BRM, with the FT231XS-U, ADR441BR and L78L05CZ among its other parts. Its parts include 33 capacitors, 13 ICs, 10 resistors, 10 diodes and 6 connectors. It belongs with the AVR (ATmega, ATtiny) boards of this library.

Main components

11

README

README.md

Overview

This is all of the design files and the code needed for my precision current source. The code for the microcontroller was made using the Arduino framework and PlatformIO so it's easy to modify and can be uploaded without neededing a programmer, just an Arduino. The serial interface features a few basic commands for setting the current and reading it back using the onboard ADC, as well as reading the internal temperature sensors. I added a lot of error checking to the firmware so it should be basically impossible to make the device do something that it shouldn't, and give the user feedback if their inputs are accepted or not. This design uses an external voltage source up to 100 volts, so it can be used with relatively high resistance loads. It is also suitable for high inductance loads, and has been verified stable into 250 mH. The KiCad folder contains all of the schematics and the .zip files with the gerbers needed to have the PCBs and the front panel manufactured. I have the front panels made as aluminum PCBs with no copper layers, which pretty much any manufacturer can do.

Stability Measurement

Since this is meant to be used for driving gradient and shim coils for long experimental runs, temperature stability is critical. To measure the stability I rented a Keysight 3458A and logged data for a week at maximum output current and the result can be seen in the plot below. Allan deviations for this data are also shown. The current stability could be further improved by using a different voltage reference, the LTZ1000A or LM399 for example, but these would come with a significant accuracy penalty. Of course the accuracy can be calibrated in software, but that requires the user to have a very good DMM and makes the assembly process more complicated. I tried to balance initial accuracy and temperature stability as much as possible.

Flashing the Firmware

To upload the program to the microcontroller, the Arduino bootloader needs to be burned. It's possible to buy the microcontroller with the bootloader already installed, but it's easy to do yourself. The best way to do this is in the Arduino IDE, and I'll outline how to do it with either an Uno or a Nano. First the ArduinoISP sketch needs to be uploaded to Arduino and can be found under the example sketches as shown below.

Once it's uploaded connect the Arduino pins to the 6 pin header on the current source as follows:

ArduinoCurrent Source
10RESET
11MOSI
12MISO
13SCK
5V5V
GNDGND

Next under tools set the programmer to be "Arduino as ISP", then click burn bootloader. If everything is working right a message should pop up in the bottom right corner of the Arduino IDE saying "Burning bootloader...", followed by a message saying "Done burning bootloader."

Now that the bootloader is burned open the Code/Microcontroller folder from the repo in VS Code, making sure to have the PlatformIO extension installed. After PlatformIO initializes select the port for the Arduino that was used to burn the bootloader in the bottom left, for me it was COM5.

After this all that needs to be done is to click the upload button and the terminal should look like the below image.

Now the device is ready to be connected over USB to a computer.

Serial Interface

When the device is connected to the computer it should show up as a COM port in windows and a ttyUSB device on Linux. On Linux the device will need to be chmodded in order to connect to it using pyserial. Usually the FTDI drivers automatically download or are already installed, but if not they can be downloaded here. The interface uses eight data bits, no parity, and one stop bit at 115200 baud. On powerup the device does some self checks and looks to see if the optional tmp117 temperature sensor is present. After connecting to the serial interface two readlines need to be done, the first says whether the tmp117 is detected or not, and the second is for any detected errors. If the device detects no errors the second readline will return "Ready." Examples of how to use pyserial with the device are shown in the Code/Serial_Interface_Examples.py file. There are some other commands not shown there, but they won't really be used.

Schematics

Precision Current Source.pdf

Parts

95
QtyValueFootprintReferences
15100nCapacitor_SMD:C_0603_1608MetricC204, C207, C208, C209, C211, C212, C301, C304, C305, C307, C308, C309, C310, C311, C312
1047uCapacitor_SMD:CP_Elec_6.3x5.8C210, C306, C401, C402, C403, C404, C405, C406, C407, C408
8D_SchottkyDiode_SMD:D_SOD-123FD201, D202, D401, D402, D403, D404, D405, D406
51kResistor_SMD:R_0603_1608MetricR202, R303, R304, R305, R306
310uCapacitor_SMD:CP_Elec_6.3x5.8C201, C202, C203
31kResistor_SMD:R_Array_Concave_4x0603RN301, RN302, RN303
2160Resistor_SMD:R_0603_1608MetricR401, R402
21kConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalTH301, TH302
220pCapacitor_SMD:C_0603_1608MetricC302, C303
2SolderJumper_2_OpenJumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP401, JP402
2~Components:WP934MDD301, D302
1+15VComponents:testPoint2PadsTP401
1+2V5TestPoint:TestPoint_Pad_D1.0mmTP202
1+5VTestPoint:TestPoint_Pad_D1.0mmTP403
1-15VComponents:testPoint2PadsTP402
1-2V5TestPoint:TestPoint_Pad_D1.0mmTP201
1100pCapacitor_SMD:C_0603_1608MetricC205
110KResistor_SMD:R_0603_1608MetricR201
110RPackage_TO_SOT_THT:TO-220-4_VerticalR204
110kResistor_SMD:R_0603_1608MetricR203
1120Resistor_SMD:R_0603_1608MetricFB301
116 MHzComponents:XTAL_ECS-200-20-3X-TRY301
1160Resistor_SMD:R_Array_Concave_4x0603RN304
11uComponents:CB05_AVXC206
1530002B02500GComponents:529802B02500GHS201
1AD7789Package_SO:MSOP-10_3x3mm_P0.5mmU204
1ADR441Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU201
1ADuM261Package_SO:SOIC-16W_7.5x12.8mm_P1.27mmU303
1ATMEGA328P-AURdigikey-footprints:TQFP-32_7x7mmU302
1AVR-ISP-6Connector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_VerticalJ301
1C_0603_1608MetricCapacitor_SMD:C_0603_1608MetricC206*
1FMMT614TAPackage_TO_SOT_SMD:SOT-23-3Q401
1FMMT734Package_TO_SOT_SMD:SOT-23-3Q402
1FT231XS-Udigikey-footprints:SSOP-20_W3.9mmU301
1FuseComponents:0031.7701.22F201
1HeatsinkComponents:577102B04000GHS202
1IRF510Package_TO_SOT_THT:TO-220-3_VerticalQ201
1L78L05Package_TO_SOT_SMD:SOT-89-3U403
1L78L15_SOT89Package_TO_SOT_SMD:SOT-89-3U401
1L79L15_SOT89Package_TO_SOT_SMD:SOT-89-3U404
1LTC1595Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU202
1NetTie_2Components:SmallNetTieNT201
1OPA4182Package_SO:SOIC-14_3.9x8.7mm_P1.27mmU203
1ORNTA1001AT1Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU205
1OUT+Components:1211J201
1OUT-Components:1211J202
1PESE1-S5-S24-MComponents:PDS1-S5-D15-M-TRU402
1RFShield_OnePieceRF_Shielding:Laird_Technologies_BMI-S-204-F_32.00x32.00mmS101
1TMP117xxDRVPackage_SON:WSON-6-1EP_2x2mm_P0.65mm_EP1x1.6mmU304
1USB BComponents:UJ2-BH-1-TH_CUDJ302
1V+Components:1211J203
1V-Components:1211J204

Questions

How big is the Current Sources Improved PCB?

It measures 120 × 75 mm and has 4 copper layers, 1.61 mm thick.

What parts does the Current Sources Improved use?

95 parts, built around the OPA4182ID, PESE1-S5-S24-M, AD7789BRM and FT231XS-U. 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 Current Sources Improved KiCad files?

From the mjmorano/Precision-Current-Source repository on GitHub, at the commit this page was made from: the board is KiCad/9.0/Current Sources Improved.kicad_pcb and its schematic KiCad/9.0/Analog.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Current Sources Improved design in my own project?

Its repository states no licence, so its author keeps all rights: ask mjmorano before reusing the design.

Similar boards

  • 2 layers155 × 140 mmControl board, the printed circuit board in 3D

    Control board

    Sergio5714/experimental-teg-testbed-firmware

    Firmware for STM32 MCU of testbed data acquisition and control system

    89 parts2
  • 4 layers71.1 × 134.5 mmNR1B Analog, the printed circuit board in 3D

    NR1B Analog

    Flanagan-Lab-Neutron-Detector/NR1B-Analog

    NISoC Readout 1 Analog Board

    94 parts
  • 2 layers48.1 × 120.3 mmOpen rad detector, the printed circuit board in 3D

    Open rad detector

    CarlosGS/Open-Radiation-Detector

    Portable radiation detector based on an ionization chamber

    34 parts65
  • 2 layers49.5 × 49.5 mmProgrammableLM317, the printed circuit board in 3D

    ProgrammableLM317

    cellularmitosis/ProgrammableLM317

    A TTL-serial programmable LM317 voltage voltage supply circuit board design.

    29 parts3MIT
  • 4 layers223.5 × 147.3 mmAmp board, the printed circuit board in 3D

    Amp board

    Alex-Wolfe/Home-Audio-System

    Audio Receiver and Amplifier

    760 parts1
  • 2 layers40 × 25 mmFIC-100A, the printed circuit board in 3D

    FIC-100A

    Reemuson/FIC-100A

    USB IR Adapter compatible with Fluke 287 and 289 series multimeters

    40 parts1CERN-OHL-W-2.0
  • 4 layers86.3 × 25 mmHdmi snake, the printed circuit board in 3D

    Hdmi snake

    Ajstros/hdmi-snake

    Hardware design for playing snake over HDMI.

    62 parts