Programmable Resistor Cards
The binary resistor chain employed in 16-bit programmable resistor cards provides a notional resolution of roughly 0.002% (or 15ppm) of the total resistance. Some of the considerations discussed below also apply to 8-bit models, though the lower resolution here (0.4%) makes their application less critical.
In exploiting this high resolution there are a number of factors which should be taken into account:
The absolute accuracy of the resistors fitted may be only 1% or 0.5% (ie. less than 8 bits).
For 'custom' resistor-chain values, components having the precise nominal values required may be unobtainable, and the nearest available preferred values may have to be used.
The resistors have a non-zero temperature coefficient, typically of ±50ppm/°C, though values down to ±15ppm/°C may be obtainable.
The closed-contact resistance of the switch shunting each resistor is of the order of 100 milliohms. In the reed switches employed in these cards it is highly stable, provided they are not subjected to overcurrent. This includes transient currents, such as discharging a long cable that is pre-charged to a significant voltage.
Wiring and connectors impose a small resistance in series with the resistor chain, of perhaps 200 milliohms.
Some implications of these factors are:
The relationship between the switch pattern and the programmed resistance value is not monotonic (ie. a change in switch pattern that might be expected to yield an increase in resistance value may in fact decrease it, and vice-versa).
A resistance value of zero ohms is unobtainable. The lowest value that can be achieved is composed of the closed-contact resistances of 16 relays in series, together with wiring and connector resistance. A value of around 1.8 ohms is typical.
Temperature effects can significantly exceed the notional resolution. For example, a temperature change of only 5°C may cause a resistance change of ±250ppm, or 17 times the notional resolution. The resistance of wiring and closed switch contacts is also affected by temperature.
The cards have the facility to store in non-volatile memory a 16-bit value associated with each resistor. These values can be used to calibrate the card to provide greater setting accuracy than the basic absolute accuracy of the resisors employed in the chain. Usage and interpretation of stored values is entirely user-specific: the software driver merely provides a mechanism (functions pipx40_writeCalibration and pipx40_readCalibration) for storing and retrieving them.
A possible scheme for utilising the stored calibration values might be:
Employ the stored values to somehow represent the deviation of each resistor's actual value from its nominal value (say, as a percentage: treated as a signed quantity the 16-bit value might be chosen to represent a range of ±32.767%).
Use a calibration procedure to obtain and store an appropriate value for each individual resistor.
Software must then make use of the stored calibration data when programming specific resistance values, taking into account extraneous circuit resistances. Because of the non-monotonic relationship between switch pattern and resistance value, some calculation is necessary to obtain a pattern matching a chosen value. A simple C program ProgResFind.c demonstrates a possible approach to this.