SkillAgentSearch skills...

USMU

Credit card-sized, USB-powered 4 quadrant source-measure unit hardware and firmware

Install / Use

/learn @joeltroughton/USMU
About this skill

Quality Score

0/100

Supported Platforms

Zed

README

<p align="center"> <img src="https://github.com/joeltroughton/uSMU/raw/main/Hardware/Version%2010/uSMU_v10.png" width="650" title="μSMU"> </p>

μSMU

μSMU is a small source-measure unit designed for the very low-cost electrical characterisation of photovoltaic cells.

Get a μSMU

Want to buy a pre-assembled and calibrated μSMU with USB and test leads? Grab one from Tindie or Undalogic.

<a href="https://www.tindie.com/stores/undalogic/?ref=offsite_badges&utm_source=sellers_undalogic&utm_medium=badges&utm_campaign=badge_medium"><img src="https://d2ss6ovg47m0r5.cloudfront.net/badges/tindie-mediums.png" alt="I sell on Tindie" width="150" height="78"></a>

Background

SMUs are "4-quadrant" devices, meaning they can both source and sink current at both positive and negative voltages. This makes them very useful for semiconductor device characterisation - including LEDs, transistors and solar cells.

In photovoltaic research laboratories, a SMU is typically used to vary the voltage applied to an illuminated solar cell, whilst simultaneously measuring the current. This voltage sweep allows us to plot the solar cell's I-V characteristics, and calculate its light-to-power conversion efficiency.

SMUs are generalised pieces of test equipment, designed to be highly sensitive over vast current & voltage ranges. For example, the workhorse Keithley 2400 has a voltage range between 100 nV and 200 V, and a current range between 1 pA to 10 A. This is likely overkill for most research and education applications concerning solar cells, which tend to operate between 0-5 V and μA to mA. The μSMU doesn't intend to replace precision SMUs, rather to supplement them in cost-sensitive areas where such precision is not required.

The μSMU is a USB-powered SMU with a +/- 5 V voltage range and +/- 50 mA source/sink capability. The PCB is only 70mm x 43mm

Function

The μSMU was originally inspired by Linear Technology's DC2591A evaluation board, which demonstrates an I2C address translator IC to interface up to 8 modules containing several I2C devices with an Arduino-style board. Somewhat consequentially, these boards also contain fantastic SMU circuits!

The voltage applied to the device-under-test (DUT) is supplied by a LT1970 opamp driven by a 16-bit DAC on the non-inverting input and a 2.048V reference on the inverting input. The current flowing through the DUT is measured by amplifying the voltage drop through a high-side 50 Ohm shunt resistor using a precision programmable gain amplifier. Both the DUT voltage and shunt resistor voltage drop are measured using a 16-bit ADC. The whole system is controlled using a STM32F072 microcontroller, which presents a USB virtual communications port for interfacing.

Capabilities

| Parameter | | | -------------------------- | ------------- | | Voltage range | -5 to +5 V | | Voltage measure resolution | ~0.6 mV | | Minimum voltage step size | <1 mV | | Current limit | -50 to +50 mA | | Current resolution | ~10 nA |

Free I-V Curve Tracer

A free, browser-based I-V curve tracer for the μSMU is available from Undalogic here

<p align="center"> <img src="https://github.com/joeltroughton/uSMU/blob/2af5fc53fadd81d5408aaaa4daaa668cc5c6f108/usmu_tracer.png" width="650" title="μSMU"> </p>

Usage

A simple python package is available to interface with the μSMU and perform basic measurements.

You can install this package directly from PyPI:

pip install usmu_py

Here is a minimal script demonstrating how to initialise the SMU, set a voltage, measure it and the current, and then close the session.

from usmu_py.smu import USMU

def main():
    # Open SMU on the specified port (e.g., 'COM3' or '/dev/ttyUSB0')
    smu = USMU(port="COM3", baudrate=9600, command_delay=0.05)
    try:
        # Identify the SMU
        idn = smu.read_idn()
        print("IDN:", idn)

        # Enable output and configure current limit
        smu.enable_output()
        smu.set_current_limit(20.0)  # 20 mA current limit

        # Set voltage and measure
        voltage, current = smu.set_voltage_and_measure(1.0)
        print(f"Set voltage: 1.0 V | Measured Voltage: {voltage:.3f} V, Current: {current:.6f} A")

        # Disable output after testing
        smu.disable_output()
    finally:
        smu.close()

if __name__ == "__main__":
    main()

Errata

Version 10 (release 1.0)

  • The board layout is missing grounding on the MCU for some reason. Make sure to place a couple of vias in the MCU's exposed pad to ensure proper grounding. Sorry!

Changelog

Version 10 (release 1.0)

  • Voltage DAC changed from a 12-bit Microchip MCP4725 to a 16-bit TI DAC8571
    • Can now achieve sub-mV voltage steps
  • Current sense amplifier changed from an Analog LT1991 to a TI PGA281
    • PGA281's gain can be programmed using 5 GPIOs ranging from 0.125 to 176. This allows low currents to be gained more than high currents, improving current resolution.
  • Current shunt resistor increased from 10 to 50 Ohms.
    • The programmable current sense amplifier (PGA) means we can use a high value shunt resistor and decrease the gain when measuring high currents.
    • Voltage drop across a 10 Ohm shunt is sensed by the power amp (U10) to impart programmable current limiting. Measuring this across the main 50 Ohm shunt would limit the current output to ~10 mA due to limitations in the LT1970
    • The increase in current shunt value along with the new PGA means we can now sense currents on the order of ~10 nA
  • Buffer amplifier changed from a quad Maxim MAX44252 to 4x Gainsill GS8331
    • Less expensive and lower V<sub>OS</sub>
  • Electrostatic discharge protection added to USB port (U5)
  • Isolated DC-DC converter replaced with bipolar switching regulator TI TPS65131 supplying ±9.7V
    • Extra headroom for power amplifier to push higher currents through 50 Ohm current shunt
  • 4.5V LDO added for DAC and ADC
  • USB-C port replaced with lower cost 2.0-pinned version

License

Hardware

CERN Open Hardware License Version 2 - Permissive (CERN-OHL-P-2.0).

Software

GNU General Public Licence v3.0.

Documentation:

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.

View on GitHub
GitHub Stars130
CategoryDevelopment
Updated1mo ago
Forks36

Languages

C

Security Score

85/100

Audited on Feb 19, 2026

No findings