One problem with choosing closely matched resistors is that 0.1% of 1MΩ is 1kΩ. Most multimeters are rated in “digits”, e.g. “4 1/2 digits”. This means that they can display a range from 0 to 19999. This means that with a ~1MΩ resistor, you can measure ±50Ω steps. This is enough to measure resistor tolerance within 0.005%, but the more digits the better. Since I happened to have an HP 34401A 6 1/2 digit multimeter handy, I figured that overkill was the better part of valor.
Then, I set about sitting down and measuring the value of 30 resistors or so.
Once I had them all measured, I had to pick a set of closely matched resistors. Simply writing all the values down, it’s easy to pick a pair of closely matched resistors, but I needed two sets of eight closely matched resistors. The result was the following Matlab script, which picks the closest set of numbers from a group.
function [closestVals closestPos] = smallestSet(randomVals, number) randomSize = size(randomVals); if(randomSize(2) == 1) randomVals = randomVals.' end closestVals = randomVals(1:number); closestPos = (1:number); range(closestVals) for value = randomVals if(value == -inf) continue; end nearVals = zeros(1,number); nearPos = zeros(1,number); distVals = abs(randomVals - value); for n = 1:number [minVal minPos] = min(distVals); nearVals(n) = randomVals(minPos); nearPos(n) = minPos; distVals(minPos) = inf; end if(range(nearVals) < range(closestVals)) closestVals = nearVals; closestPos = nearPos; end end
Using this script, I turned my random pile of 30 1% resistors into two sets of 8 resistors matched to better than 0.05%. While the value they are centered around is not exactly 970kΩ, the spread of values means that my CMRR does much better than a 1% priced pile of resistors should deliver, and it cost me a lot less than buying sixteen 0.05% matched resistors!