第一: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)
|