电路模拟器实际上是如何工作的?

电器工程 电路分析 模拟
2022-01-14 09:45:22

我最近有机会玩弄LiveWire,这是一个电路模拟器,并开始想知道他们如何准确计算每个组件上的电压以及通过每条导线的电流。

到目前为止,我只学过基本的电路分析技能(例如网格分析和节点分析),我不完全确定它们是否足够通用,可以在电路模拟器中以“万能”的方式实现。

作为一名程序员,这让我很感兴趣,我很想看看在构建像这样的电路模拟器时通常采用哪些技术。

如果这不属于这里,我很抱歉,这是在这里和 StackOverflow 之间的选择,我觉得虽然它是一个面向软件开发的问题,但这个问题更适用于这个站点及其用户群。

3个回答

我已经详细检查了 Falstad 模拟器的代码。对于仅由电阻器、开关和电压源等线性组件组成的电路(出于模拟目的,逻辑门输出等东西被视为接地电压源),模拟器会考虑每个电路节点、电压源(连接两个节点) , 或线(同样)定义一个线性方程和一个变量,这样方程的数量和变量的数量总是相等的。对于电路节点,变量是节点的电压,该等式计算流过它的总电流等于任何电流源注入的总电流。对于电压源或电线(作为电压源处理的电线,电位差为零),

电流源和电阻器之类的东西与电阻器或变量无关。相反,电流源会增加一个电路节点所需的总电流(请记住,每个电路节点都有一个计算流入和流出总电流的方程式)并减少另一个电路节点所需的总电流。电阻器有点棘手:对于每个端点的方程,电阻器添加了每个端点的节点电压项。

例如,连接节点 1 和 2 的 100 欧姆电阻器会表示,节点 1 上每增加一伏电压,流入节点 1 的电流就会减少 0.01 安培,流入节点 2 的电流也会增加相同的量。同样,节点 2 上的每伏特增加将使流入节点 1 的电流增加 0.01 安培,并使流入节点 2 的电流减少类似的量。

考虑一个电路,其连接节点 1 和 5 的 10 伏电源,以及连接节点 1 和 2、2 和 3、2 和 4、3 和 4 的 100 欧姆电阻器。进一步假设节点 1 上有一个接地图标。因此:

neg ---+-1---R100---2---R100---3---100---4---pos
      gnd           |                    |
                    +---------100--------+

将有两个“电压源”:接地线和 10 伏电源(分别被视为方程/变量 5 和 6)。因此,方程式将是:

-X1*0.01                             +X5 -X6 = 0  Node 1
+X1*0.01 -X2*0.01          +X4*0.01          = 0  Node 2
         +X2*0.01 -X3*0.01 +X4*0.01          = 0  Node 3
         +X2*0.01          -X4*0.01      +X6 = 0  Node 4
-X1*1                                        = 0  Volts 5 (voltage between 1 and gnd)
-X1*1                      +X4*1             = 10 Volts 6 (voltage between 1 and 4)

这个方程组可以表示为一个 NxN 矩阵加上一个 N 项数组。每个方程由矩阵中的一行表示,每行上的值表示每个变量的系数。每个等式的右侧存储在单独的数组中。在求解方程之前,我们将知道流入每个节点的净电流(在这种情况下为零),以及由电压源连接的节点对之间的电压差。求解方程将得出每个节点的电压和流过每个电压源的电流。

如果电路包含电容器,则每个电容器都将被视为与低阻值电阻串联的电压源;在每个模拟步骤之后,电压源将根据流过它的电流量进行调整。电感器将被视为高值电阻器,它将电流馈入一个并从另一个中取出(电流量根据电阻两端的电压进行调整)。对于电容器和电感器,电阻值将由模拟步骤所代表的时间量控制。

更复杂的电路元件(如晶体管)被视为电压源、电流源和电阻器的组合。与让每个仿真时间步处理一次所有内容的简单电路元件不同,晶体管等元件根据它们所看到的电压和电流计算它们的有效电阻等,评估所有得到的方程,并重新评估它们的电阻基于新的电压和电流,重新评估方程等,以达到平衡,其中它们的有效电阻应该是晶体管所看到的电压和电流。

对于完全由“线性”元件组成的中等大小的电路,Falstad 模拟器可以相当快。如果唯一改变的是右侧系数,那么重复求解方程组的时间是非常合理的。如果左侧发生变化(例如,因为晶体管的有效电阻上升或下降),时间会变得更慢,因为系统必须“重构”方程。每个模拟步骤都必须多次重构方程(晶体管可能需要),这会使事情变得更慢。

对所有事情都使用一个大矩阵并不是大型模拟的好方法。即使矩阵相当稀疏,它所占用的空间也与节点数加上电压源的平方成正比。如果不需要重构,则在每个模拟步骤中求解矩阵所需的时间将与矩阵大小的平方成正比,如果需要重构,则与矩阵大小的立方成正比。尽管如此,在显示电路和线性方程组之间的关系时,该方法确实具有一定的优雅性。

LiveWire 是众多电路模拟器中的一种,具有不同的能力。

例如,Falstad Circuit Simulator似乎与 LiveWire 具有相似的功能级别 - 并且在该链接上提供了源代码。这应该是一个好的开始。

对于更复杂的电路仿真,许多工具可以追溯到加州大学伯克利分校的 SPICESPICE 源代码可根据 BSD 许可向 UCB 索取。

制造商特定的 SPICE 版本通常将他们自己产品的非常详细的半导体仿真模型集成到他们的仿真器中。例如,Linear Technologies的LTSpice IV或德州仪器的TINA-TI在下面,通常都是 SPICE。

引用关于 SPICE 的 WikiPedia 页面:

电路仿真程序(其中 SPICE 及其衍生产品最为突出)采用文本网表描述电路元件(晶体管、电阻器、电容器等)及其连接,并将此描述转换为要求解的方程。产生的一般方程是非线性微分代数方程,使用隐式积分法、牛顿法和稀疏矩阵技术求解。

在更高的复杂度上,Proteus 虚拟系统建模(Proteus 设计套件的一部分)等一些商业产品使用混合模式 SPICE 电路仿真的专有增强功能 - 这些工具可以仿真模拟电路行为和数字微控制器代码,它们之间的相互作用完全建模。

在更有限的层面上,一些原理图编辑器,例如集成到该站点中的电路实验室工具,提供了小范围的仿真功能。虽然这在实际的重要电子设计中可能不是那么有用,但研究它们的功能和实现可以让软件开发人员深入了解哪些对用户有效,哪些对用户无效。

类似 SPICE 的电路仿真器完成了三个主要分析:

  • 直流工作点
  • 交流分析
  • 瞬态分析

线性电路(由直流源、线性电阻器和线性受控源组成)直流工作点分析是使用改进的节点分析 (MNA) 完成的。也可以使用网格分析,但很容易建立节点分析的方程。

对于非线性电路(包括晶体管之类的器件,它们基本上可以建模为非线性受控源),必须使用一些额外的技巧。一种概念上简单的方法是对多个方程使用牛顿法的扩展。

牛顿的方法涉及猜测解决方案,然后制作仅准确“接近”猜测解决方案的电路线性模型。线性化电路的解决方案被用作对解决方案的新猜测,并且该过程被迭代,直到连续迭代“收敛”在非线性电路的(希望)正确的解决方案上。在现实世界中,使用更复杂的非线性求解器能够更快地完成求解,并且由于收敛失败而产生的错误更少。

交流分析是通过首先进行直流分析以找到工作点来完成的然后研究工作点周围小扰动的影响。根据定义,“小”意味着足够小以至于非线性效应不重要。这意味着电路元件根据工作点转换为线性等效元件。然后可以使用 MNA(用复数表示储能元件的阻抗)来解决电路中交流电源引起的扰动的影响。

正如 Olin 在评论中所说,瞬态分析是通过考虑电路变量如何在非常小的时间步内演变来完成的。再次在每个时间步,电路在其工作点周围线性化,因此可以使用 MNA 来建立方程。解决随时间变化的行为的简单方法是欧拉方法然而,在实践中再次使用更复杂的方法来允许使用更大的时间步长和更小的误差。

您可以看到,这些方法中的一个共同点是对电路行为进行线性近似,并使用 MNA 求解,直到找到非线性电路行为的解决方案。

这三个分析是自 1970 年代以来由类似 SPICE 的模拟器完成的主要分析。较新的模拟器增加了额外的功能,如谐波平衡(交流分析的扩展,以适应非线性元件的混合效应),或电磁模拟来模拟传输线效应。但在使用类似 SPICE 的仿真器时,您应该首先了解 DC、AC 和瞬态仿真。