如何用SymPy实现电子设计迭代计算:LMZ22010稳压器电阻求解
在LMZ22010开关稳压器的UVLO(欠压锁定)电路设计中,我们经常会遇到这样的问题:根据芯片手册的阈值方程算出的电阻值是理论值,但实际只能选用EIA标准系列的电阻。这时候就需要用迭代计算:先算出理论值,替换为最接近的标准电阻,再代回方程验证实际的UVLO阈值,必要时调整电阻值直到满足设计要求。用SymPy可以轻松搞定这个流程,下面一步步来:
1. 初始化SymPy环境与定义变量
首先清理IPython环境(如果用Jupyter或者IPython的话),然后导入SymPy的核心模块,定义我们需要的电路变量:
from IPython import get_ipython get_ipython().magic('reset -sf') # 清理当前IPython环境的变量 from sympy.solvers import solve from sympy import Symbol, Eq, symbols, var # 定义UVLO电路相关的符号变量 syms = ['Rent', 'Renb', 'Vuvlo'] var(','.join(syms))
2. 建立UVLO电路的数学方程
根据LMZ22010的官方手册,UVLO阈值的计算公式是基于内部参考电压的分压关系,示例方程如下(实际方程请以芯片datasheet为准):
注:LMZ22010的内部UVLO参考电压(V_UVLO_REF)典型值为1.2V,具体参数请查阅最新手册
# 设定芯片内部参考电压(以datasheet为准) V_UVLO_REF = 1.2 # 建立UVLO阈值方程:Vuvlo = V_UVLO_REF * (1 + Rent/Renb) Eq_uvlo = Eq(Vuvlo, V_UVLO_REF * (1 + Rent / Renb))
3. 第一次求解理论电阻值
先设定目标UVLO阈值,然后固定其中一个电阻的理论值,求解另一个电阻:
# 设定目标UVLO阈值,比如我们需要5V的欠压锁定点 target_Vuvlo = 5 # 先假设下拉电阻Renb的理论值为10kΩ theoretical_Renb = 10000 # 代入方程求解Rent的理论值 solution = solve(Eq_uvlo.subs({Vuvlo: target_Vuvlo, Renb: theoretical_Renb}), Rent) theoretical_Rent = solution[0] print(f"计算得到的理论Rent值:{theoretical_Rent} Ω")
运行这段代码后,你会得到一个非标准的电阻值,比如~31666Ω,这显然没法直接采购,接下来就要找标准电阻替换。
4. 替换为EIA标准电阻值
根据你选用的标准电阻系列(比如E24、E96),找到最接近理论值的标准电阻。比如31666Ω最接近E96系列的31.6kΩ(31600Ω),或者E24系列的33kΩ(33000Ω):
# 选择标准电阻值(这里以E96系列的31.6kΩ为例) standard_Rent = 31600 standard_Renb = 10000 # 10kΩ是标准值,直接沿用
5. 迭代验证:计算实际UVLO阈值
把选定的标准电阻代回方程,计算实际的UVLO阈值,看看是否在设计公差范围内:
# 代入标准电阻求解实际的Vuvlo actual_Vuvlo = solve(Eq_uvlo.subs({Rent: standard_Rent, Renb: standard_Renb}), Vuvlo)[0] print(f"使用标准电阻后的实际UVLO阈值:{actual_Vuvlo} V")
如果这个实际值和目标值的偏差在你能接受的范围内,那就可以确定电阻值了;如果偏差太大,就换另一个接近的标准电阻,重复步骤4和5。
6. 迭代调整(可选)
比如如果31.6kΩ的实际阈值不够理想,我们可以试试E24系列的33kΩ,重新计算:
# 更换为E24系列的33kΩ standard_Rent_2 = 33000 actual_Vuvlo_2 = solve(Eq_uvlo.subs({Rent: standard_Rent_2, Renb: standard_Renb}), Vuvlo)[0] print(f"更换Rent为33kΩ后,实际UVLO阈值:{actual_Vuvlo_2} V")
对比两次的实际阈值,选一个最符合设计要求的标准电阻组合即可。
内容的提问来源于stack exchange,提问作者Franz Forstmayr

