第一:TI有单电源运放的设计方法:
"Single-Supply Op Amp Design Techniques" (ti.com)
用TI文档的方法,算出来的值很多不是E系列电阻。
干脆直接穷举。
E6*(10^0,10^1,10^2,10^3),4个E6电阻约(6*4)^4=331,776约33万种组合。这么多组合,对于现在的计算机瞬间完成。
如果E6找不到,找E24约(24*4)^4=84,934,656,约8千5百万种,几分钟的事情。
穷举代码:采用v=mx+b 和 v=-mx+b
import math
import itertools
VOH=3.5
VOL=1.5
VOM=(VOH+VOL)/2
ERROR_MAX=0.05
def generate_E_set(a='E6'):
E24_T=[1.0,1.1,1.2,1.3,1.5,1.6,1.8,2,2.2,2.4,2.7,3,3.3,3.6,3.9,4.3,4.7,5.1,5.6,6.2,6.8,7.5,8.2,9.1]
E6_T=[1.0,1.5,2.2,3.3,4.7,6.8]
E12_T=[1.0,1.5,2.2,3.3,4.7,6.8]
_E_ALL=[]
if(a=='E6'):
_E_T=E6_T
elif(a=='E12'):
_E_T=E12_T
elif(a=='E24'):
_E_T=E24_T
else:
return []
for i in range(0,3):
for v in _E_T:
_E_ALL.append(v*math.pow(10,i))
return _E_ALL
# v=m*x+b
def vo1(r1,r2,rg,rf,vin,vref):
A=1+rf/rg
B=r2/(r1+r2)
return vin*B*A+vref*(1-B)*A
# v=-m*x+b
def vo2(r1,r2,rg,rf,vin,vref):
A=rf/rg
B=r1/(r1+r2)
return -vin*A+vref*B*(1+A)
vo=vo2
def show(comb):
R1=combination[0]
R2=combination[1]
Rg=combination[2]
Rf=combination[3]
print("R1=%.1f,R2=%.1f,Rg=%.1f,Rf=%.1f" % (R1,R2,Rg,Rf))
print("实际增益=%.1f,实际中点电压=%.2f" % (Rf/Rg,vo(R1,R2,Rg,Rf,0,5)))
print("-------------------------------")
# 子收敛函数
def good_enough(x,ref):
return ((abs(x-ref)/ref)<ERROR_MAX)
# 总收敛函数
def set_is_good_enough(comb):
R1=combination[0]
R2=combination[1]
Rg=combination[2]
Rf=combination[3]
xh=vo(R1,R2,Rg,Rf,10e-3,5)
xm=vo(R1,R2,Rg,Rf,0,5)
xl=vo(R1,R2,Rg,Rf,-10e-3,5)
return good_enough(xh,VOL) and good_enough(xm,VOM) and good_enough(xl,VOH)
E_ALL=generate_E_set('E6')
# 穷举
for combination in itertools.product(E_ALL,E_ALL,E_ALL,E_ALL):
if(set_is_good_enough(combination)):
show(combination)
|