In 2021/2022 I designed a DC electronic load that would be more capable, but also much more complex than the usual DIY solutions. However, after building a working breadboard prototype of the analog circuitry with 12 ICs including multiple precision and dual opamps, I thought that it might be better to start with a smaller project that would allow me to gain a lot of experience and write much of the non-application specific code that I could use later on for the digital part.

And this is how I started working on a programmable decade resistor, a pretty specialized tool for niche applications. At the time of this post the project is maybe 70% completed, so I think it’s reasonable to start writing about it.

Introduction

A programmable resistor is a electronic device whose electrical resistance can be adjusted typically through digital signals. Programmable resistors are available in form of integrated circuits (often referred to as digital potentiometers) as well as stand-alone devices/expansion cards. There are many different applications, each with their own set of requirements e. g.:

  • programmable gain amplifiers
  • sensor emulation, e. g. for integration tests with hardware-in-the-loop simulators
  • automated testing
  • calibrators
  • prototyping

This diy project shall provide a general-purpose stand-alone device for use in a (home) electronics lab that can replace or complement resistor decade boxes for low power applications. The following table could be seen as a starting point for the design.

RequirementValue
Rangeshort circuit, 1Ω ... 999.999 kΩ 1\Omega\text{ }...\text{ }999.999 \text{ k}\Omega, open circuit
Resolution1Ω1 \Omega
Accuracy*±0.5% of value+0.3Ω\ll\pm 0.5\% \text{ of value} + 0.3 \Omega
Thermal drift50 ppm/K\ll50 \text{ ppm/K}
Power Rating**0.5 W0.5 \text{ W}
Bandwidthunspecified
Switchingmake-before-break, break-before-make
User interfaceNum pad and rotary encoder
InterfaceUSB (SCPI), two digital inputs (trigger etc.)

*) Can be improved for higher resistance values through calibration, **) See discussion in separate section

The programmable resistor closely follows the main prinicple of resistor decade boxes: connecting multiple devices (" decades") in series, with each of the devices having a settable resistance of 0Ω0 \Omega, 110nΩ1 \cdot 10^n \Omega, 210nΩ2 \cdot 10^n \Omega, …, 910nΩ9 \cdot 10^n \Omega where nn specifies the decade in question.

Siemens B2086 Decade Resistor
A manually operated Siemens B2086 Decade Resistor

Those devices are simple resistor networks complemented by one (multi-throw) or more (single- or multi-throw) switches. While the actual topology and resistor values vary vastly, the switch(es) will always either short out or connect certain resistors or simply tap certain nodes of the resistor network. A simple implementation uses a 10-throw rotary switch to tap the nodes of a series resistor network of nine resistors.

Schematic of a 10 position switch decade
Decade resistor consisting of 9 resistors of the same resistance R and a 10-throw rotary switch

In the next post I’ll discuss two different topologies and the reasoning behind my choice.