SPICE 电路仿真原理

(转)概述
本文主要描述了基本的 SPICE 模拟仿真原理,事实上所有的基于直接矩阵算法的模拟仿真器都采用相同的方法。本文是基于基本的核心算法,而不是仿真器内部真实发生的时序。
电路仿真的三个复杂层次
解决电路仿真的问题可分为以下 3 个层次:
1. 怎样分析一个只有固定的电流源和线性电阻的电路
2. 已经解决第一个问题后,怎样处理非线性元件,如二极管、晶体管
3. 已经解决以上两个问题后,怎样处理电抗元件,如电容
第一个问题相对来说比较简单,一个完全线性、并且没有电抗元件存在的电路,你可以应用基尔霍夫和欧姆定律导出它的方程式,从而计算所有的节点电压和器件中的电流,由此衍生的两种分析是节点分析法和网孔分析法。下文将以节点分析法来做介绍。
第二个问题相对难解决一些,因为一些非线性元件不好用数学解析的方法来计算,如以下一个简单的二极管电路:
没有可以直接计算二极管和电阻间的节点电压的表达式,尽管你可以导出一个简单的表达式来计算这个电压,但是没有方法去解这个方程。我们能做的是先猜测一个电压值,再去测试它是否正确,判断的结果是太大或太小,而不是一个具体的值,并在增大或减小这个猜测值后再次尝试。这种方法是相当随意的,因此产生了一种更系统的方法——牛顿迭代法,这种方法可以在每次迭代后简单有效地估算新的猜测值,并且精度常常可以达到 0.1% 左右,因此SPICE 类软件基本都采用此方法。
第三个问题最难解决,直到目前也只解决了 DC 值,观察时域仿真结果,此文没有论及 AC 分析,下文会以电容为例。
节点分析法
要计算 V1 和 V2,根据基尔霍夫电流定
律:I¬1+(V2-V1)/R1=0 I2+(V1-V2)/R1+(0-V2)/R2=0
解此方程组可得:V1=1.2,V2=0.2
尽管这只是个简单的例子,过程大致都是、以上面的二极管电路为例,25℃下二极管的动态电阻近似等于 25.8/id,id 是二极管电流(单位 mA),这里用一个电阻作为二极管的小信号模型,再考虑 DC 偏置,这里再添加一个固定的电流源,并联在电阻两端:一样的,可以应用于任何电流源和电阻的电路。
仿真软件建立以上等式而采用的程序稍微有点不同,但最后的方程
是一样的,只是表达上有所区别。
如何处理非线性元件
上文提到采用牛顿迭代法来解决包含非线性元件的电路,非线性元件在一个小的范围内可以当作是线性的,相当于半导体器件的小信号模型的处理。例如一个双极型晶体管的小信号模型:但是这种模型没有偏置条件,不能用于 DC 分析,这里添加一个 DC 电流源并联在 rpi 两端,一个 DC 电流项到集电极,作为偏置条件:这个模型是线性的,用节点分析法就可以计算,但是这种线性只在很小的范围内才成立,因此不能直接给出正确的结果,尽管如此这种模型可以提供一个比初始的猜测值更好的结果,具体的
步骤:
1. 先给非线性元件的端电压指定一个初始的猜测值 ;
2. 根据端电压计算每个非线性元件修正后的小信号模型,例如上面的 BJT,先根据集电极电流和增益计算 rpi 和 gm,进而计算 Ib 和 Ic 的值 ;
3. 由节点分析法构建算式方程组 ;
4. 由此方程组计算出新的端电压值,从第 2 步开始重新计算 ;
5. 重复计算此过程,直到得到一个足够精确的结果(通过连续的迭代对比结果来测量精度),每个返回的节点电压的值越来越接近之前一次迭代的值,说明已收敛。当连续迭代的值之差小于一个确定的公差,认为此过程完成。
以上面的二极管电路为例,25℃下二极管的动态电阻近似等于 25.8/id,id 是二极管电流(单位 mA),这里用一个电阻作为二极管的小信号模型,再考虑 DC 偏置,这里再添加一个固定的电流源,并联在电阻两端现在这个电路就可以用节点分析法来计算了,我们会得到一个新的二 极 管 电 压 ,虽 然 未 必 是 正 确 的 结 果 ,但 比 初 始 的 猜 测 值 要 更 接 近 了 ,
重复此步骤最后就会在需要的地方收敛。
二 极 管 电 压 Vd 的 初 始 猜 测 值 是 0 . 7 , I d 是 由 Vd 计 算 得 到 的 电 流值,ieq 是等效电流,也就是并联于 Rd 两端的电流源的值,用于维持二极管最初的电压降和电流的,ieq=Id-Vd/Rd,最后一列是新的电压值,并作为下次迭代计算的起始值,最后在 10 次迭代后得到的最终结果 0.75021 已精确到 5 个有效数字。
怎样计算二极管的电流
Id=Is×[e(Vd/V T)-1],V T=q/KT=25.8mV@25℃,Is 是一个模型参数,典型值为 1e-15。
一般来说,所有的 SPICE 器件模型都需要能根据其端电压计算 pin脚电流和动态电阻的方法。
电抗元件
接下来我们来看下 SPICE 怎样处理电容的,电感等其他器件的处理基本是相同的。
注意:这里描述的是在时域分析时 SPICE 怎样处理电容等,AC 分析时电容是被当做电阻的(但是有一个复杂的值),在时域分析里如何处理电容是更为困难的问题。
以下图为例:
已知 t=0 时 C1:
1. 电容大小 =C
2. 电容电流 =i0
3. 电容电压 =v0
假设 t=0 时电流是恒定的:
i0 ≈ C(v1-v0)/Δt → v1 ≈ v0+i0*Δt/C
v1 是 t=Δt 时的电压值。
用一个大小等于 v1 的电压源替代电容后:在每个时间步长后重新计算电压源,只要 Δt 足够小,此方法的 精 度 就是足够的,但是有一个本质的缺陷使其在电路仿真中几 乎 毫 无 用 处 , 要 理 解 这 个缺陷,先考虑当电容电压为 4.999V 时的情况,此时电容已完全充满,不再需要小的时间步长来仿真,如果此时我
们设定仿真步长 timestep 为 1ms:v1=4.999+i0x1e-3/1e-9。i0=5-4.999/1000=1e-6
v1=5.999
显然结果并不是一个有用的值,我们这里假定电流在 1ms 的时间内保持为 1uA,但事实并不是这样的,实际上在此期间电容的电流会呈指数形式的衰减至接近为 0。这就意味着尽管电容事实上已经稳定了,仿真器仍然需要小的时间步长来保持它的电压稳定,在数学术语里就是指此方法没有刚性稳定,这种方法称为前向欧拉积分法。SPICE 并没有采用此方法,这里简单介绍一下它可以帮助理解为何 SPICE 采用其他更复杂的方法来处理,其中最简单的就是后向欧拉积分法。
我们知道 i0 ≈ C(v1-v0)/Δt, i1 ≈ C(v1-v0)/Δti1 并不是已知的,不能直接得到 v1 的表达式,意味着不能将电容。当作一个固定的电压源来处理,而用一个电流源并联一个电阻来替代电容:Δt 时 :i1=v1/req+ieq
i1 ≈ v1xC/Δt-v0*C/Δt 当 1/req=C/Δt,ieq= ﹣ v0*C/Δt 时,两个方程等效。
因此我们可以用阻值为 Δt/C 的电阻并联电流为﹣ v0*C/Δt 的电流源来替代电容。
这就是后向欧拉法,再对比之前提到的当电容电压为 4.999V,time step 为1ms 时的情况:req=Δt/C=1e-3/1e-9=1e6。ieq= ﹣ v0*C/Δt= ﹣ 4.999x1e-9/1e-3= ﹣ 4.999e-6
因此计算的 v1 值为 4.999999001,精度很高,是刚性稳定的。SPICE 一般是在第一个时间点和之后的每个断点时使用此方法处理,发生在波形的转折点处,如脉冲的起始处。默认设置下,SPICE 通常采用另一种方法:梯形法则,也是刚性稳定的,同时具有更高的精度。
TRAPEZOIDAL RULE
i0 ≈ C(v1-v0)/Δt
i1 ≈ C(v1-v0)/Δt
等式里 t0 和 t1 时刻的电流是用 t0 和 t1 时刻的电压来近似计算的,如果用 t0 和 t1 时刻的电流平均值来计算表达式 C(v1-v0)/Δt 会得到一个更为精确的值:
(i0+i1)/2=C(v1-v0)/Δt
i1=2Cv1/Δt-2Cv0/Δt-i0
因此:
req=Δt/2C
ieq=-2Cv0/Δt-i0
这就是梯形法则或梯形积分法,SPICE 大部分情况下都是采用此方法。
结果对比
下图是分别采用这两种方法得到的结果对比,另一条是理论计算结果,时间步长设为固定的 500ns。由此可以看出梯形法则比后向欧拉法更为精确。

工程师必备
- 项目客服
- 培训客服
- 平台客服
TOP
