How to select resistor pairs for op amp and voltage divider applications

Resistors are often chosen in pairs. The voltage divider is a common example. Another example is the input to feedback pair used in an operational amplifier. There is nothing inherently difficult in selecting these resistor pairs as a simple division will reveal the ratio. However, it’s a challenge to locate the best available ratio as there are so many combinations to test.

For an example, consider an inverting op-amp with a desired gain of 5. We know that the resistors have a ratio of 5 : 1 as the inverting op amp’s gain is defined as:

Gain = -\dfrac{R_F}{R_{In}}

Intuitively, we would select a simple resistor combination of 5 kΩ to 1 kΩ. In practice, we are in trouble because 5 kΩ is not a standard value. In fact, DigiKey with its vast array of half a million through-hole resistors does not sell a ¼ W, 5%, 5 kΩ, through-hole resistor!

It’s not a standard component. Here: go look. You will find the closest available resistor is 1/2 W.

Instead, we must select from standard valued components to provide the desired 5 : 1 ratio. We can find the desired ratio in the 5% tolerance series by selecting 7.5 kΩ and 1.5 kΩ resistors. This is the only viable pair contained within the 5% tolerance standard values.

There is nothing simple about selecting these resistor pairs, as we need to hunt through 300 potential combinations (assuming 1 : 1 ratios are allowed). The process becomes more unwieldy when we move to 1% and is even worse for the 0.5% tolerance resistors.

This article presents practical methods to help you select the appropriate resistor pairs. It introduces a matrix method for the 5% tolerance values. It then presents a crude computer program to help you select resistor pairs from the standard valued 1% and 0.5% parts.

Standard Values

Resistors and other devices such as capacitors and inductors are binned using a logarithmic numbering system. The bins are sized with consideration for the tolerance. For example, the 5% parts are defined by the E-24 series bins. With this system there are 24 bins per decade:

E-24 series: 1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7, 3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1

To better understand, consider the 3.0 Ω resistor and its nearest neighbors:

  • for a 2.7 Ω 5% resistor: 2.565 < R < 2.835

  • for a 3.0 Ω 5% resistor: 2.850 < R < 3.150

  • for a 3.3 Ω 5% resistor: 3.135 < R < 3.465

As we can see, the bins are laid out on a number line with each bin centered at the E-24 number extending +/- 5%. The numbers are chosen so that there is little overlap and few gaps between bins.
Components with tighter tolerance are available in 1%, 0.5, and better. The 1% resistors are available as the E-96 with the 0.5% tolerance parts from the E-192 series:

E-96 series: 1.00, 1.02, 1.05, 1.07, 1.10, 1.13, 1.15, 1.18, 1.21, 1.24, 1.27, 1.30, 1.33, 1.37, 1.40, 1.43, 1.47, 1.50, 1.54, 1.58, 1.62, 1.65, 1.69, 1.74, 1.78, 1.82, 1.87, 1.91, 1.96, 2.00, 2.05, 2.10, 2.15, 2.21, 2.26, 2.32, 2.37, 2.43, 2.49, 2.55, 2.61, 2.67, 2.74, 2.80, 2.87, 2.94, 3.01, 3.09, 3.16, 3.24, 3.32, 3.40, 3.48, 3.57, 3.65, 3.74, 3.83, 3.92, 4.02, 4.12, 4.22, 4.32, 4.42, 4.53, 4.64, 4.75, 4.87, 4.99, 5.11, 5.23, 5.36, 5.49, 5.62, 5.76, 5.90, 6.04, 6.19, 6.34, 6.49, 6.65, 6.81, 6.98, 7.15, 7.32, 7.50, 7.68, 7.87, 8.06, 8.25, 8.45, 8.66, 8.87, 9.09, 9.31, 9.53, 9.76

E-192 series: 1.00, 1.01, 1.02, 1.04, 1.05, 1.06, 1.07, 1.09, 1.10, 1.11, 1.13, 1.14, 1.15, 1.17, 1.18, 1.20, 1.21, 1.23, 1.24, 1.26, 1.27, 1.29, 1.30, 1.32, 1.33, 1.35, 1.37, 1.38, 1.40, 1.42, 1.43, 1.45, 1.47, 1.49, 1.50, 1.52, 1.54, 1.56, 1.58, 1.60, 1.62, 1.64, 1.65, 1.67, 1.69, 1.72, 1.74, 1.76, 1.78, 1.80, 1.82, 1.84, 1.87, 1.89, 1.91, 1.93, 1.96, 1.98, 2.00, 2.03, 2.05, 2.08, 2.10, 2.13, 2.15, 2.18, 2.21, 2.23, 2.26, 2.29, 2.32, 2.34, 2.37, 2.40, 2.43, 2.46, 2.49, 2.52, 2.55, 2.58, 2.61, 2.64, 2.67, 2.71, 2.74, 2.77, 2.80, 2.84, 2.87, 2.91, 2.94, 2.98, 3.01, 3.05, 3.09, 3.12, 3.16, 3.20, 3.24, 3.28, 3.32, 3.36, 3.40, 3.44, 3.48, 3.52, 3.57, 3.61, 3.65, 3.70, 3.74, 3.79, 3.83, 3.88, 3.92, 3.97, 4.02, 4.07, 4.12, 4.17, 4.22, 4.27, 4.32, 4.37, 4.42, 4.48, 4.53, 4.59, 4.64, 4.70, 4.75, 4.81, 4.87, 4.93, 4.99, 5.05, 5.11, 5.17, 5.23, 5.30, 5.36, 5.42, 5.49, 5.56, 5.62, 5.69, 5.76, 5.83, 5.90, 5.97, 6.04, 6.12, 6.19, 6.26, 6.34, 6.42, 6.49, 6.57, 6.65, 6.73, 6.81, 6.90, 6.98, 7.06, 7.15, 7.23, 7.32, 7.41, 7.50, 7.59, 7.68, 7.77, 7.87, 7.96, 8.06, 8.16, 8.25, 8.35, 8.45, 8.56, 8.66, 8.76, 8.87, 8.98, 9.09, 9.20, 9.31, 9.42, 9.53, 9.65, 9.76, 9.88

Returning back to our inverting op amp with a gain of 5, we are still in an impractical situation, as there are no 5 kΩ resistors in any of the standard preferred part numbers.

Grid Search

We can select resistor pairs using a graphical method as shown in the matrix below. Here, the E-24 values appear for each row and each column. Each cell presents the ratio between the resistors. We see the 1:1 ratio on the diagonal. Ratios greater than 1:1 are in the upper part of the chart. Ratios less than 1:1 are grayed out in the lower portion of the chart. We should avoid the lower portion of this chart as it contains 2 significant figures while the upper contain three. As an example, consider the 8.2 vs 1.1 cell. The corresponding ratio is 7.45. However, the 1.1 vs 8.2 cell has a ratio of 0.13. The number are inverses of each other, but this isn’t immediately obvious when comparing the 2 to 3 the significant figures number.

Note that this graphical method does require a bit of mental gymnastics. Like using an old slide rule, we must keep track of the tens place independent of the chart. We must also freely flip the ratio so that the number is greater than 1. As an example, suppose we want a ratio of 3 : 50. This requires several steps:

  1. keep track of the tens place and change the ratio from 3 : 50 to 3 : 5.
  2. flip the ratio to 5 : 3.
  3. search the ratio closest to 1.67
  4. select E-24 values of 2 and 1.2 as the closest match
  5. flop the number to 1.2 and 2
  6. correct for power of 10 as 1.2 : 20

Tech Tip: Be mindful of significant figures. The E-24 series of resistors have two significant figures. Take the three significant figures in the chart with a grain of salt. The resulting resistor pairs are limited to 2 significant numbers especially when we consider the best- and worst-case tolerance for each pair.

Program Search

The graphical method is better than performing the calculations by hand. Yet, it is still prone to error as it is easy to miss the best number(s) in the sea of possibilities. We certainly could construct similar tables for the E-96 and E-192 values. However, their size and limited human abilities make them impractical. A better solution is to write a program.

The end of this note contains a rudimentary program written in C. This was designed to be used with an online compiler such as OnlineGDB.

To operate the program, enter the desired ratio using floating point numbers and then, press run. In this example we continue our search for a 3 : 50 ratio. Using the same mental effort, we flip the numbers and take care of the decimal place manually by searching for a 5.0 : 3.0 ratio. The program suggests several solutions:

  • E-24: 1.2 : 20
  • E-96: avoid
  • E-192: 1.2 : 20 or 1.26 : 21.0

Conclusion

I trust this information was useful and will save you time in the future. Who knew that resistor selection was so complicated. Actually, we should talk about the impact of tolerance on the chosen pairs. But we will save that for another time.

Please leave your comments and suggestions below. Also, if you take the time, please attach your improvements to the program.

Best Wishes,

APDahlen


#include <stdio.h>
#include <math.h>

int main(){
    
// CAUTION: Use floats such as 5.0/3.0 or else the program defaults to interger math.

    double desired_ratio = 5.0/3.0;  

    double E_24_R_values[] = {1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 
                              2.2, 2.4, 2.7, 3.0, 3.3, 3.6, 3.9, 4.3, 
                              4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1};

    double E_96_R_values[] = {1.00, 1.02, 1.05, 1.07, 1.10, 1.13, 1.15, 1.18, 
                              1.21, 1.24, 1.27, 1.30, 1.33, 1.37, 1.40, 1.43, 
                              1.47, 1.50, 1.54, 1.58, 1.62, 1.65, 1.69, 1.74, 
                              1.78, 1.82, 1.87, 1.91, 1.96, 2.00, 2.05, 2.10, 
                              2.15, 2.21, 2.26, 2.32, 2.37, 2.43, 2.49, 2.55, 
                              2.61, 2.67, 2.74, 2.80, 2.87, 2.94, 3.01, 3.09, 
                              3.16, 3.24, 3.32, 3.40, 3.48, 3.57, 3.65, 3.74, 
                              3.83, 3.92, 4.02, 4.12, 4.22, 4.32, 4.42, 4.53, 
                              4.64, 4.75, 4.87, 4.99, 5.11, 5.23, 5.36, 5.49, 
                              5.62, 5.76, 5.90, 6.04, 6.19, 6.34, 6.49, 6.65, 
                              6.81, 6.98, 7.15, 7.32, 7.50, 7.68, 7.87, 8.06, 
                              8.25, 8.45, 8.66, 8.87, 9.09, 9.31, 9.53, 9.76};
                              
    double E_192_R_values[] = {1.00, 1.01, 1.02, 1.04, 1.05, 1.06, 1.07, 1.09,
                               1.10, 1.11, 1.13, 1.14, 1.15, 1.17, 1.18, 1.20, 
                               1.21, 1.23, 1.24, 1.26, 1.27, 1.29, 1.30, 1.32, 
                               1.33, 1.35, 1.37, 1.38, 1.40, 1.42, 1.43, 1.45, 
                               1.47, 1.49, 1.50, 1.52, 1.54, 1.56, 1.58, 1.60, 
                               1.62, 1.64, 1.65, 1.67, 1.69, 1.72, 1.74, 1.76, 
                               1.78, 1.80, 1.82, 1.84, 1.87, 1.89, 1.91, 1.93, 
                               1.96, 1.98, 2.00, 2.03, 2.05, 2.08, 2.10, 2.13, 
                               2.15, 2.18, 2.21, 2.23, 2.26, 2.29, 2.32, 2.34, 
                               2.37, 2.40, 2.43, 2.46, 2.49, 2.52, 2.55, 2.58, 
                               2.61, 2.64, 2.67, 2.71, 2.74, 2.77, 2.80, 2.84, 
                               2.87, 2.91, 2.94, 2.98, 3.01, 3.05, 3.09, 3.12, 
                               3.16, 3.20, 3.24, 3.28, 3.32, 3.36, 3.40, 3.44, 
                               3.48, 3.52, 3.57, 3.61, 3.65, 3.70, 3.74, 3.79, 
                               3.83, 3.88, 3.92, 3.97, 4.02, 4.07, 4.12, 4.17, 
                               4.22, 4.27, 4.32, 4.37, 4.42, 4.48, 4.53, 4.59, 
                               4.64, 4.70, 4.75, 4.81, 4.87, 4.93, 4.99, 5.05, 
                               5.11, 5.17, 5.23, 5.30, 5.36, 5.42, 5.49, 5.56, 
                               5.62, 5.69, 5.76, 5.83, 5.90, 5.97, 6.04, 6.12, 
                               6.19, 6.26, 6.34, 6.42, 6.49, 6.57, 6.65, 6.73, 
                               6.81, 6.90, 6.98, 7.06, 7.15, 7.23, 7.32, 7.41, 
                               7.50, 7.59, 7.68, 7.77, 7.87, 7.96, 8.06, 8.16, 
                               8.25, 8.35, 8.45, 8.56, 8.66, 8.76, 8.87, 8.98, 
                               9.09, 9.20, 9.31, 9.42, 9.53, 9.65, 9.76, 9.88};                          

    int i, j;
    double ratio = 1;
    double best_delta = 1;
    double delta;
   
   printf("Search for the resistor pair closest to %f\n\n", desired_ratio); 

   best_delta = 1;
   printf("For the E-24 series:\n"); 
    
    for (i = 0; i < 24; i++){
        
        for (j = 0; j < 24; j++){
            
            ratio = E_24_R_values[i] / E_24_R_values[j];  
            
            delta = fabs(desired_ratio - ratio);
            
            if (delta <= best_delta){
                best_delta = delta; 
                printf("\tbest_delta = %f for R1 = %f, and R2 = %f\n", ratio, E_24_R_values[i] , E_24_R_values[j] );
            }
        }
    }



   best_delta = 1;
   printf("\nFor the E-96 series:\n"); 
    
    for (i = 0; i < 96; i++){
        
        for (j = 0; j < 96; j++){
            
            ratio = E_96_R_values[i] / E_96_R_values[j];  
            
            delta = fabs(desired_ratio - ratio);
            
            if (delta <= best_delta){
                best_delta = delta; 
                printf("\tbest_delta = %f for R1 = %f, and R2 = %f\n", ratio, E_96_R_values[i] , E_96_R_values[j] );
            }
        }
    }

best_delta = 1;
 printf("\nFor the E-196 series:\n"); 

    for (i = 0; i < 192; i++){
        
        for (j = 0; j < 192; j++){
            
            ratio = E_192_R_values[i] / E_192_R_values[j];  
            
            delta = fabs(desired_ratio - ratio);
            
            if (delta <= best_delta){
                best_delta = delta; 
                printf("\tbest_delta = %f for R1 = %f, and R2 = %f\n", ratio, E_192_R_values[i] , E_192_R_values[j] );
            }
        }
    }

    return 0;
} // end main

Interesting article!

Related to this, one junior wizardry came into mind:
If one needs to create a resistor based voltage divider, say divide the voltage down to one tenths, suggesting that it would require resistor ratio of 1:9, but having only E12 resistors at hand - how to proceed?
Solution is to choose the resistors according to the voltage ratio and then add number of resistors parallel to the “upper” resistor, each multiplied by 10 from the previous added one, or add series resistors to the “lower” resistor, each divided by 10 from the previous one.

Example: For 10:1 voltage division, choose “lower” resistor being 1kOhm and “upper” resistor 10kOhm, then

  1. add parallel to the 10kOhm resistor a 100kOhm resistor, 1MOhm resistor, 10MOhm resistor… so that the “upper” resistor becomes effectively 9kOhm → 9:1 ratio.
    or
  2. Add to the 1kOhm “bottom” resistor 100Ohm, 10Ohm, 1Ohm, and so on, in series, yielding 10:1.111… → 9:1 ratio.

Cheers, heke

2 Likes