电子头条

QSpice (9) --结合Python仿真

2024-09-28
    阅读数:

QSpice ( 9 ) -- 结合Python仿真

Hello 小伙伴们大家周末好呀!

Python是个好工具,Qspice也是好工具,在某天上班时候想减轻一下自己工作量想着找个东西结合下帮我把活干了,刚好就让我看到这个东西了,一起把他用起来吧!

首先我们先安装一下Qspice的Python库:

网址在这 https://pypi.org/project/qspice/

备注:ta是基于Spicelib开发的所以如果需要使用其他的Spice仿真器可以看看https://pypi.org/project/spicelib/

使用Pip安装代码: pip install qspice

如何使用 pip, windows+R CMD

图1:pip安装Qspice库

安装完Pip后我们先画一下Qspice的原理图,我想着先弄个RC电路,我改不同占空比,改不同R值和C值获得不同的Vout电压,先构建基本电路如下图2所示。

图2:RC滤波器仿真结果

使用例程修改简单代码如下:

from qspice import QschEditor

# 将FilePath替换为你自己的地址

FilePath = "C:/Users/xutong/Qspice9/Python.qsch"

# 创建一个QschEditor实例,传入电路设计文件路径

Python = QschEditor ( FilePath )

# 打印所有元件

print ( "All Components" , Python . get_components ())

# 打印所有电容元件

print ( "Capacitors" , Python . get_components ( 'C' ))

# 打印名为R1的元件信息

print ( "R1 info:" , Python . get_component_info ( 'R1' ))

# 打印名为C1的元件值

print ( "C1 value:" , Python . get_component_value ( 'C1' ))

图3:代码运行结果

光是打印参数还是不足够的,最好还是能设定参数,设定参数的几个函数

set_element_model

侧重于设置元件的模型相关的参数。元件模型是对元件行为更复杂、更全面的一种描述,可能包含了多种物理特性、工艺相关的特性等。它不仅仅是简单的电学数值,还可能涉及到元件在不同工作条件下(如温度、频率等)的行为模式。

set_component_value

主要用于设置电路组件(如电阻、电容、电感等)的值。这个值通常是组件的基本电学属性值,例如电阻的阻值、电容的容值等。

set_parameters

通常用于设置与电路或元件相关的更广泛的参数。这些参数可能不仅仅局限于元件的基本电学值(像set_component_value那样)或者元件的复杂模型(像set_element_model那样),而是可以包括一些与电路整体运行、仿真设置或者特定分析相关的参数。

基于以上我们修改代码看是否如我们所预期。

from qspice import QschEditor

# 将FilePath替换为你自己的地址

FilePath = "C:/Users/xuyun/Desktop/Qspice9/Python.qsch"

# 创建一个QschEditor实例,传入电路设计文件路径

Python = QschEditor ( FilePath )

# 打印所有元件

print ( "All Components" , Python . get_components ())

# 打印所有电容元件

print ( "Capacitors" , Python . get_components ( 'C' ))

# 打印名为R1的元件信息

print ( "R1 info:" , Python . get_component_info ( 'R1' ))

# 打印名为C1的元件值

print ( "C1 value:" , Python . get_component_value ( 'C1' ))

# 设定R1和C1的参数

Python . set_component_value ( 'R1','123K' )

Python . set_component_value ( 'C1','15n' )

# 修改V2的模型

Python . set_element_model ( 'V2' , "PULSE 0 5 1m 1n 1n 3u 10u" )

Python . save_as ( "C:/Users/xuyun/Desktop/Qspice9/Python2.qsch" )

使用以上代码修改过后的电路图如下所示:

图4:使用Python修改后的图纸

~代码部分~

修改代码让电路Run起来:

from qspice import SimRunner, SpiceEditor, RawRead, sweep_log, QschEditor

# 数据处理

def processing_data ( raw_file , log_file ):

# 打印当前正在处理的原始文件和对应的日志文件的信息,让用户清楚地知道正在操作的文件。

print ( "Handling the simulation data of %s , log file %s " % ( raw_file , log_file ))

# 创建一个 RawRead 类的实例,传入原始文件路径 raw_file,用于读取该原始文件中的数据。

raw_data = RawRead( raw_file )

# 通过 raw_data 对象的 get_wave 方法获取名为'V(out)'的波形数据。假设 RawRead 类内部实现了根据波形名称获取特定波形数据的逻辑。

vout = raw_data .get_wave( 'V(out)' )

# 返回原始文件路径和该波形数据的最大值。这样可以在外部调用这个函数时,得到原始文件路径以及该文件中特定波形的最大值。

return raw_file , vout .max()

# 将FilePath替换为你自己的地址

FilePath = "C:/Users/xuyun/Desktop/Qspice9/Python.qsch"

# 创建一个QschEditor实例,传入电路设计文件路径

Python = QschEditor( FilePath )

# 仿真输出文件夹

runner = SimRunner( output_folder = 'C:/Users/xuyun/Desktop/Qspice9' )

# 打印所有元件

print ( "All Components" , Python .get_components())

# 打印所有电容元件

print ( "Capacitors" , Python .get_components( 'C' ))

# 打印名为R1的元件信息

print ( "R1 info:" , Python .get_component_info( 'R1' ))

# 打印名为C1的元件值

print ( "C1 value:" , Python .get_component_value( 'C1' ))

# 设定R1和C1的参数

Python .set_component_value( 'R1','123K' )

Python .set_component_value( 'C1','15n' )

# 修改V2的模型

Python .set_element_model( 'V2' , "PULSE 0 5 1m 1n 1n 3u 10u" )

# 保存修改后的电路设计文件为另一个.qsch文件

Python .save_as( "C:/Users/xuyun/Desktop/Qspice9/Python2.qsch" )

# 保存为网表文件

Python .save_netlist( "C:/Users/xuyun/Desktop/Qspice9/Pythong.net" )

# 创建SpiceEditor实例,传入网表文件路径

netlist = SpiceEditor( "C:/Users/xuyun/Desktop/Qspice9/Pythong.net" )

# 运行仿真,并将结果传递给数据处理函数进行处理

runner .run( netlist , callback = processing_data , run_filename = f 'testfile_qspice.net' )

有可能会遇到GBK相关的报错,可以通过以下方法解决

1. 打开 Qsch_edtior.py

2. 修改save_netlist()函数为以下

def save_netlist ( self , run_netlist_file : Union [ str , Path ]) -> None :

if isinstance ( run_netlist_file , str ):

run_netlist_file = Path ( run_netlist_file )

if self . schematic is None :

_logger . error ( "Empty Schematic information" )

return

if run_netlist_file . suffix == '.qsch' :

self . save_as ( run_netlist_file )

elif run_netlist_file . suffix in ( '.net' , '.cir' ):

with open ( run_netlist_file , 'w' , encoding = 'utf-8' ) as netlist_file :

_logger . info ( f "Writing NET file { run_netlist_file } " )

netlist_file . write ( f '* { os . path . abspath ( self . _qsch_file_path . as_posix ()) } \n ' )

self . write_spice_to_file ( netlist_file )

netlist_file . write ( '.end \n ' )

运行结果如下图5所示:

图5:代码运行结果

图6:仿真结果图

使用Python肯定是想将重复的工作交给电脑去处理,在这里给出一个例程如下:

from qspice import SimRunner, SpiceEditor, RawRead, sweep_log, QschEditor

# 数据处理

def processing_data ( raw_file , log_file ):

# 打印当前正在处理的原始文件和对应的日志文件的信息,让用户清楚地知道正在操作的文件。

print ( "Handling the simulation data of %s , log file %s " % ( raw_file , log_file ))

# 创建一个 RawRead 类的实例,传入原始文件路径 raw_file,用于读取该原始文件中的数据。

raw_data = RawRead( raw_file )

# 通过 raw_data 对象的 get_wave 方法获取名为'V(out)'的波形数据。假设 RawRead 类内部实现了根据波形名称获取特定波形数据的逻辑。

vout = raw_data .get_wave( 'V(OUT)' )

# 返回原始文件路径和该波形数据的最大值。这样可以在外部调用这个函数时,得到原始文件路径以及该文件中特定波形的最大值。

return raw_file , vout .max()

# 将FilePath替换为你自己的地址

FilePath = "C:/Users/xuyun/Desktop/Qspice9/Python.qsch"

# 创建一个QschEditor实例,传入电路设计文件路径

Python = QschEditor( FilePath )

# 仿真输出文件夹

runner = SimRunner( output_folder = 'C:/Users/xuyun/Desktop/Qspice9' )

# 打印所有元件

print ( "All Components" , Python .get_components())

# 打印所有电容元件

print ( "Capacitors" , Python .get_components( 'C' ))

# 打印名为R1的元件信息

print ( "R1 info:" , Python .get_component_info( 'R1' ))

# 打印名为C1的元件值

print ( "C1 value:" , Python .get_component_value( 'C1' ))

# 设定R1和C1的参数

Python .set_component_value( 'R1','123K' )

Python .set_component_value( 'C1','15n' )

# 遍历V2的Ton时间

for i in range ( 1,10 ):

V2_Param = f "PULSE 0 5 1m 1n 1n { i } u 10u"

# 修改V2的模型

Python .set_element_model( 'V2' , V2_Param )

# 保存修改后的电路设计文件为另一个.qsch文件

Python .save_as( f "C:/Users/xuyun/Desktop/Qspice9/Python { i } .qsch" )

# 保存为网表文件

Python .save_netlist( f "C:/Users/xuyun/Desktop/Qspice9/Python { i } .net" )

# 创建SpiceEditor实例,传入网表文件路径

netlist = SpiceEditor( f "C:/Users/xuyun/Desktop/Qspice9/Python { i } .net" )

# 运行仿真,并将结果传递给数据处理函数进行处理

runner .run( netlist , callback = processing_data , run_filename = f 'testfile_qspice_ { i } .net' )

仿真结果如图7所示:

图7:左Ton=1u 右Ton=9u

好了,今天的Qspice教程就到这里了,周末愉快!

展开↓