# uSMU **Repository Path**: Fly_zhou/uSMU ## Basic Information - **Project Name**: uSMU - **Description**: No description available - **Primary Language**: Unknown - **License**: CERN-OHL-P-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-08-18 - **Last Updated**: 2026-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

# μSMU μSMU is a small [source-measure unit](https://en.wikipedia.org/wiki/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](https://www.tindie.com/products/undalogic/smu/) or [Undalogic](https://www.undalogic.com/usmu). I sell on Tindie ## 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](https://uk.tek.com/keithley-source-measure-units/keithley-smu-2400-series-sourcemeter) 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](https://www.analog.com/media/en/technical-documentation/user-guides/855-dc2591a_rev01_demo_manual.pdf), 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](https://www.undalogic.com/usmu/app)

## Usage A simple [python package is available](https://github.com/Undalogic/usmu_py) to interface with the μSMU and perform basic measurements. You can install this package directly from PyPI: ```bash 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. ```python 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 VOS - 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](https://ohwr.org/cern_ohl_p_v2.txt)). #### Software GNU General Public [Licence v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html). #### Documentation: Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.