如何选择运算放大器和分压器应用的电阻对

电阻通常成对选择。一个常见的例子是分压器。另一个例子是运算放大器中使用的输入-反馈对。选择这些电阻对本身并没有什么难度,因为可以通过简单的除法来计算相应的比例。然而,要找到最佳的可用比例却相当困难,因为需要测试的组合过多。

以期望增益为5的反相运算放大器为例。我们知道,电阻的比例为5:1,因为反相运算放大器的增益定义为:

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

直观上,我们会选择5 kΩ和1 kΩ的简单电阻组合。但实际操作时,我们会遇到一些麻烦,因为5 kΩ不是标准值。实际上,尽管DigiKey拥有五十多万个通孔电阻的庞大库存,但我们不销售¼瓦、5%的5 kΩ通孔电阻!

因为这不是标准组件。点击此处查看。你会发现最接近的可用电阻是1/2瓦。

与此相反,我们必须从具有标准值的组件中进行选择,以达到所需的5:1比例。我们可以通过选择7.5 kΩ和1.5 kΩ电阻,从而在5%的容差系列中找到所需的比例。这是5%容差标准值中唯一可行的一对。

选择这些电阻对并没有什么捷径,因为我们需要在300种潜在组合中寻找(假设允许1:1的比例)。如果容差为1%,这一过程将更加难以处理,而对于0.5%的容差来说情况则更糟。

本文介绍了一些实用的方法来帮助你选择合适的电阻对。首先,本文介绍了一种用于5%容差值的矩阵方法。然后,提供了简单的计算机程序,帮助你从标准值的1%和0.5%的物料中选择电阻对。

标准值

电阻及其他器件(如电容和电感)都是使用对数编号系统进行分类的。这些分类会考虑容差的大小。例如,5%容差的物料是根据E-24系列分类的。在这个系统中,每个十进位有24个分类:

E-24 系列: 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

为了更加便于理解,我们考虑3.0Ω电阻及其最近的相邻电阻:

  • 对于2.7Ω 5%容差的电阻:2.565 < R < 2.835

  • 对于3.0Ω 5%容差的电阻:2.850 < R < 3.150

  • 对于3.3Ω 5%容差的电阻:3.135 < R < 3.465

如我们所见,这些分类分布在数轴上,每个分类以E-24数字为中心,扩展范围为±5%。选择这些数字是为了减少分类之间的重叠和间隙。
容差更小的组件有1%、0.5%等。1%容差的电阻是E-96系列,而0.5%容差的物料则属于E-192系列:

E-96 系列: 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 系列: 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

回到增益为5的反相运算放大器上,我们目前所面临的情况仍然不容乐观,因为在任何标准偏好零件编号中都没有5 kΩ电阻。

网格搜索

我们可以使用下图所示的图形方法来选择电阻对。在图中,第一行和第一列显示的是E-24值。各单元格显示的是电阻之间的比例。对角线上的比例为1:1。大于1:1的比例位于图表的上半部分。小于1:1的比例位于图表的下半部分并以灰色显示。我们应避开图表的下半部分,因为其中只包含2个有效数字,而上半部分包含3个有效数字。例如,考虑8.2(行)与1.1(列)交汇的单元格。相应的比例是7.45。然而,1.1(行)与8.2(列)交汇的单元格的比例是0.13。这些数字是彼此的倒数,但在比较有效数字2和有效数字3时,这一点并不明显。

请注意,这种图形方法确实需要动些脑筋。就像使用旧的计算尺一样,我们必须独立于图表来记录十位数字。我们还必须自由地翻转比例,使数字大于1。例如,假设我们希望的比例为3: 50。我们需要采取若干步骤:

  1. 跟踪十位数字,将比例从3: 50改为3: 5。
  2. 翻转比例得到5: 3。
  3. 搜索最接近1.67的比例
  4. 选择E-24值的2和1.2作为最接近的配对
  5. 将数字翻转为1.2和2
  6. 纠正10的幂,得到1.2: 20。

技术小技巧: 注意有效数字。E-24系列电阻有两个有效数字。对图表中的三个有效数字持保留态度。得到的电阻对应限制为2个有效数字,特别是当我们考虑每对的最优和最劣容差时。

程序搜索

图形方法优于手工计算。但这种方法仍然容易出错,因为在众多可能性中很容易错过最佳数字。我们当然可以为E-96和E-192值构建类似的表格。然而,考虑到表格的大小和人类有限的能力,这种方法有些不切实际。更好的解决方案是编写一个程序。

本文末尾提供了用C语言编写的基本程序。该程序旨在与在线编译器(如OnlineGDB)配合使用。

要操作程序,请使用浮点数输入所需比例,然后按“运行”。在本例中,我们继续寻找3:50的比例。使用与上述一致的计算过程,我们需要翻转数字,手动处理小数点,并搜索5.0:3.0的比例。程序建议以下几种解决方案:

  • E-24:1.2 : 20
  • E-96:避免
  • E-192:1.2 : 20或1.26 : 21.0

总结

相信上述信息会对你有用,并在将来为你节省一些时间。谁知道电阻的选择竟然如此复杂。实际上,我们应该讨论一下容差对所选电阻对的影响。不过,这个问题还是留到下次再进行讨论。

请在下方发表你的评论和建议。此外,如果你有时间,请附上你对程序的改进。

诚挚祝福,

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