ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

复杂电路传递函数分析:ABCD矩阵、EET与Bode图三步法

复杂电路传递函数分析:ABCD矩阵、EET与Bode图三步法 十几年前我第一次认认真真做模拟电路仿真时心里想的是怎么会有人愿意把传递函数手推出来SPICE里探针一拉曲线就出来了多痛快。直到后来连续被两件事打脸一是仿真结果对不上手算的零点位置二是项目评审时被问“这地方的极点是哪个元件造成的、怎么调”我盯着电路图完全答不上来。那时候才意识到数值仿真给的是答案但给不了洞察。做电路传递函数分析尤其是带了反馈、寄生参数和复杂级联之后纯粹靠节点电压法硬推十有八九会陷入代数的泥潭。我自己试过最笨的一次为了算一个四阶网络花了三个小时最后还漏了一个负号。后来慢慢磨出一套组合打法先用ABCD矩阵把电路主干捋直再用EET把捣乱的额外元件单独抓出来最后统一交给Bode图做工程验收。整个过程拆成三步逻辑清楚可检查也适合在纸面上快速得到可以用来指导设计的表达式。这篇文章就把这套方法完整讲一遍。适合三类人看正在学模电、控制理论的学生做模拟电路设计的老工程师以及那些被多个级联滤波器加上寄生反馈搞到头大的电源或射频工程师。我不保证你看完能不用仿真但我保证你拿到复杂电路时不会第一反应就是列十阶状态方程。1. 为什么非要把Bode图、ABCD矩阵、EET放在一起用1.1 复杂电路分析真正让人头疼的不是元件多很多人觉得复杂电路难算是因为元件多、节点多。这个直觉对了一半但更本质的问题在于结构。所谓“复杂电路”通常都有一个共同特征主信号路径和反馈/寄生路径混在了一起。举一个很常见的例子一个放大器的输入端有耦合电容、偏置电阻输出端有负载电容同时还有一个反馈电阻从输出绕回输入。如果直接列节点方程很快就会发现反馈电阻把输入和输出节点耦合到一起你再也分不清哪个电容主导低频极点、哪个电阻决定高频零点。表达式中每一项都混着多个元件调试时根本无从下手。更有意思的是这类问题往往会因为某个“额外元件”的存在而急剧变难。这个额外元件可能是一个为了补偿稳定性故意加上去的反馈电容也可能是一个被忽视的寄生电容。没有它时电路分析简单得像单极点系统一加上它整个矩阵都乱了。这时需要的不是更强的计算能力而是更好的拆分逻辑。1.2 三件工具的配合逻辑我的做法是把整个分析过程拆成三个环节每个环节解决一类问题。ABCD矩阵负责解决“结构”问题。当电路能看作若干个二端口网络级联时矩阵乘法天然适合表达这种串联关系。输入端网络、级间耦合、输出端网络这些块状结构用ABCD矩阵一乘就得到了一个完整的整体模型。它就像搭积木时先把每一块积木的形状确定好。EET负责解决“捣乱元件”的问题。所以中间有个“额外元素”很难处理比如跨接在输入输出之间的反馈阻抗EET告诉你先假装它不存在算一个干净的参考传递函数再用一个修正因子把它的影响补回来。这个修正因子由两个局部阻抗决定不需要把整个系统重新推一遍。Bode图负责解决“验证和设计”的问题。表达式推完之后低频增益、极点位置、零点频率、相位裕度这些工程指标最后都要落到频域曲线上。Bode图不是画个漂亮曲线的事它是用来反向检查你推导有没有错的工具幅频曲线斜率、每十倍频程20dB的阶梯变化、相位上下界每一点都可以和你的表达式一一对应。这三者组合起来就是一套完整工作流ABCD把电路拆成块EET把坏块修掉Bode图做最终验收。顺序也很关键先搭主干再补补丁最后画图检查。2. 第一步用ABCD矩阵把电路主干搭出来2.1 ABCD矩阵到底在记录什么先复习一下定义。对二端口网络ABCD矩阵也叫传输矩阵描述的是端口电压电流之间的转移关系。采用最常见的端口定义[ V1 ] [ A B ] [ V2 ] [ I1 ] [ C D ] [ -I2 ]这里的I2方向要特别注意通常定义I2是流出网络的电流。这个方向约定让级联变得极其自然。对于长度为n的级联网络总的ABCD矩阵等于各级矩阵从左到右依次相乘M_total M1 * M2 * M3 * ...矩阵乘法本身就有结合律你甚至可以先算前两级的结果再乘第三级。这一点在程序化计算时非常方便。2.2 三个最常用的基础矩阵块实际电路里最常见的二端口块就那么几个把它们记住就够用电路元素连接方式ABCD矩阵串联阻抗Z串在信号路径上[1 Z; 0 1]并联导纳Y并联在信号路径和地之间[1 0; Y 1]理想增益级简化电压放大倍数A[1/A 0; 0 0]仅作占位参考其中串联阻抗和并联导纳是最核心的。电阻、电容、电感先转成阻抗Z或导纳Y就能统一进矩阵。举一个最简单的例子一个串联电阻R后面接一个到地的电容C。这是一个教科书级的一阶低通。它的ABCD矩阵就是先乘串联电阻块再乘并联电容块M [1 R; 0 1] * [1 0; sC 1] [1 sCR R; sC 1]到这里你还没有接负载。电容本身就是负载所以要继续做下一步。2.3 端接负载之后怎么求传递函数级联矩阵搭完了整个二端口网络的内部关系已经清楚但我们要的是Vout/Vin。这时要把输出端口的负载条件代进去。对于输出端口负载Z_L会限制电压和电流的关系V2 -I2 * Z_L负号来自I2方向约定。代入矩阵方程消去I2得到Vout/Vin 1 / (A B/Z_L)回到刚才那个串阻并联电容的例子。输出节点上的负载就是电容本身的阻抗Z_L 1/(sC)。代入Vout/Vin 1 / ((1 sCR) R * sC)等等这里有个容易错的地方。刚才的并联电容已经包含进了矩阵的C元素和D元素如果你又把电容当作端接负载Z_L就会算重复。正确做法要分清楚并联矩阵里的电容表示这个电容在网络内部“并联在端口上”而端接负载是连接在输出端口的实际负载。为了避免重复我习惯这样处理矩阵里只放确确实实并联在该端口上的元件端接负载则是在最终计算时单独代入Z_L。如果端接负载本身就是那个电容那么矩阵中就不该再单独写一个并联电容块而应该直接用Z_L公式。刚才的例子简化后其实是M [1 R; 0 1] Z_L 1/(sC) H 1/(1 sCR)这才是标准一阶低通。对这个坑我没有记错当年在大学里傻傻分不清画出来的幅频曲线直接翻了倍。2.4 实战带串联电阻和分流电容的输入网络现在看一个实际一点的前端网络。信号源内阻Rs经过耦合电容Cc再经过一个偏置电阻Rg到地然后进入放大器栅极。放大器输入电容Cin也存在先并入节点分析。这个网络可以分成三级串联Rs、串联Cc、并联Rg与Cin的合成导纳。矩阵写成M [1 Rs; 0 1] * [1 1/(sCc); 0 1] * [1 0; 1/Rg sCin 1]输出端接放大器栅极实际是开路但栅极节点对地有Rg和Cin所以输出端口的负载阻抗Z_L就是无穷大也就是I2 0。此时H 1/A。把矩阵乘完取左上角A就能得到经典的带增益衰减和零点的高通网络表达式。这里我要提醒一个几乎所有资料都不会专门写清楚的经验ABCD矩阵里的“串联电容”和“并联电容”位置决定了零点的形态。串联电容会给传递函数带一个位于原点的零点并联电容产生的是极点。很多人在矩阵里腾挪半天最后Bode图画出来发现方向反了基本都是因为这个。3. 第二步用EET把“碍事元件”从系统里剥离出来3.1 EET的工作方式现在到了整个方法里最容易被忽略、但实用价值最高的一步。复杂电路里总有几个元件让人不舒服反馈电阻、跨接电容、某个不知道为什么在那里的电感。它们多管闲事地把两个本应该独立工作的节点扯在一起。这时候就该用额外元素定理。EET的核心想法一句话就能说清楚先假设这个碍事元件不存在算出一个干净的参考传递函数然后看这个元件的引入会对网络产生什么修正最终结果等于参考传递函数乘一个修正因子。标准形式写出来是H(s) H_ref(s) * ( 1 Z_n(s) / Z_x(s) ) / ( 1 Z_d(s) / Z_x(s) )H_ref是把这个额外元件作开路处理后的传递函数。Z_x是这个额外元件的阻抗对于电容就是1/(sC)对电阻就是R。Z_d是在输入源置零时从额外元件两端看进去的驱动点阻抗。Z_n是在传递函数输出被置为零也叫空条件时从额外元件两端看进去的阻抗。补充一句EET公式里的H_ref有多个变体你可以选择让额外元件开路或者短路作为参考对应表达式形式会变。我上面写的是“开路参考”版本对电容、反馈电阻这类并联/串联在节点间的元件非常好用。3.2 Z_d 与 Z_n 的实际判断方法很多人看到Z_d和Z_n觉得头大。我提供一个可以直接操作的判断流程。算Z_d时把输入源置零电压源短路电流源开路。然后在额外元件原来所在的端子之间施加一个测试电压源或电流源测出其对应的端口电流或端口电压它们的比值就是Z_d。这个步骤不关心系统的输出信号只需要局部阻抗。算Z_n时布局类似但要多做一个动作在施加测试信号的同时调整系统输入源的幅度和相位让我们关心的那个输出量强制等于零。换句话说你要让测试信号在输出端产生的响应和输入源产生的响应正好抵消输出为零时再测端口阻抗得到的就是Z_n。我对第一次接触EET的工程师的建议是不要在纸上算Z_n直接在仿真器里做。断开额外元件接一个交流测试源再叠加一个可调的输入源让AC分析中的输出变量为零然后测端口阻抗。这是最不容易出错的做法也最能帮助建立直觉。算几分钟之后你就会发现Z_n里往往包含增益项、跨导项这些“有源”信息Z_d则多半是纯无源网络的局部阻抗。这就是为什么修正因子能反映整个反馈回路的真实影响。3.3 一个典型例子反馈电容与米勒效应拿最常见的共源放大器来举例子。放大器本身用一个理想压控电流源近似跨导gm输出负载R_load。在栅极和漏极之间接一个反馈电容Cf。这个Cf就是那个“碍事元件”。先算参考没有Cf时H_ref -gm * R_load平坦无极点。这是一个理想化但很干净的基础。然后在EET框架下Z_x 1/(sCf)。Z_d是从栅极和漏极两端看进去的驱动点阻抗此时输入源置零。因为栅极被短路到地压控电流源不工作看到的阻抗近似就是R_load。Z_n则记录“输出被置零”时的端口阻抗这时候就复杂了为了保持输出为零栅极必须被驱动到一个特定电压而Cf的电流路径会把栅极信号直接耦合到输出节点等效端口阻抗里会跑出一个和gm相关的项。把这两个量代进EET公式修正因子会分解出一个极点和一个零点。低频段修正因子约等于1说明Cf对低频增益没影响高频端因为Cf短路信号直接从输入走到输出你会看到高频零点和闭合环路形成的极点同时出现。这就是米勒效应更严格的版本不仅仅是把Cf乘个(1A)塞到输入端那么简单它还带来一个高频路径的零点。传统教科书里“米勒电容就是把反馈电容等效到输入”的说法其实只在低频段成立EET把这些细节全出来了。这个过程说明一个重要原则EET不是站在系统外面硬猜它是把“碍事元件”的影响拆成两个可直接测量的阻抗让你能分别讨论局部阻抗和整体增益的交互。3.4 多个碍事元件怎么办一个复杂电路往往不止一个捣乱元件。比如反馈电阻旁边还并联一个电容或者输出级还有一个额外的寄生电感。EET的好处就是每次只处理一个元件。处理完第一个元件后得到的新传递函数就成为下一次修正的参考再处理第二个元件这样逐个修正。这就是所谓的嵌套EET或者叫NEET。数学上仍然成立只是每次都要重新计算对应的Z_d和Z_n。实际操作中我不建议真的做很多次嵌套太繁琐。一般经验是真正的复杂电路里一到两个关键额外元件决定主要误差其余的影响在5%以内。你只需要选出输出阻抗、带宽、稳定性影响最大的那一两个元件用EET修正剩下的可以直接忽略。4. 第三步归一化、画Bode图用响应曲线验收表达式4.1 把传递函数改写成“对Bode友好”的形式ABCD和EET联手之后你会得到一个有理分式分子分母通常是s的多项式。但多项式形式不适合直接读图Bode图最友好的是零极点形式。我习惯把所有因子都写成(1 s/ω)的样子这样每个因子在Bode图上只贡献一个转折频率。例如一个典型二阶低通H(s) H0 / ( (1 s/ω1) * (1 s/ω2) )H0是直流增益ω1和ω2是两个极点频率。看到这张图你立刻知道低频平坦过了ω1开始以-20dB/十倍频程的斜率下降过了ω2斜率变成-40dB/十倍频程。如果分子里有(1 s/ωz)这种因子就在ωz处提供一个向上的转折幅频曲线从-20dB回升到0dB再回升到20dB具体取决于零点位置。这一过程看着简单但极其容易因为表达式没有整理成乘积形式而暴走。每当你看到分子出现s²bsc这种多项式先别急着画图试着做因式分解找实根或共轭根。这才是Bode图前最重要的一步。4.2 一个可以照抄的绘图脚本下面是一个用Python验证信号和系统分析的小脚本把ABCD矩阵搭出来的传递函数直接画成Bode图省去手绘的麻烦。import scipy.signal as signal import numpy as np import matplotlib.pyplot as plt # 用一个最简单的例子Rs R1 分压C1 并联RL 负载 Rs 50 R1 200 C1 100e-9 RL 5e3 # 由ABCD矩阵推导得到的分式 # H(s) RL / ( (RsR1)*RL*C1*s RsR1RL ) num [RL] den [(Rs R1) * RL * C1, Rs R1 RL] sys signal.TransferFunction(num, den) w, mag, phase signal.bode(sys) plt.figure(figsize(9, 5)) plt.subplot(2, 1, 1) plt.semilogx(w, mag) plt.ylabel(幅度 (dB)) plt.grid(True, whichboth, ls--) plt.subplot(2, 1, 2) plt.semilogx(w, phase) plt.ylabel(相位 (deg)) plt.xlabel(频率 (rad/s)) plt.grid(True, whichboth, ls--) plt.tight_layout() plt.show()跑出来你会看到直流增益是RL/(RsR1RL)也就是分压比大约20×log10(5000/5250)≈-0.42dB。极点频率是1/((RsR1)RL/(RsR1RL)*C1)约等于31.8kHz。和Bode图显示的-3dB点一致。把这个脚本当成一个模板替换分子分母系数任何用ABCD算出来的表达式都能直接用。4.3 用Bode图反推细节很多工程师画Bode图只是为了看一眼增益其实Bode图的最大价值是反向验证推导。我每次推导完传递函数都会拿三个基本检查点和图核对。第一个检查点是直流极限。令s趋于0看表达式是否等于电路在直流下的直观结果。放大器直流增益、滤波器直流衰减这些一眼能看出来的东西都不对说明ABCD矩阵或者EET修正里肯定有错。第二个检查点是斜率变化。低通滤波器的幅频曲线在每经过一个极点后斜率下降20dB/十倍频程每经过一个零点上升20dB/十倍频程。Bode图上如果出现与表达式不一致的斜率变化通常说明丢了某个因子或者用了错误的矩阵乘法顺序。第三个检查点是相位初末值。一个最小相位系统在极低频时相位趋于0在极高频时相位变化量等于(零点数-极点数)×90°。这个检查几乎可以在心里完成能帮你快速过滤出符号错误。这三步检查不需要仿真软件铅笔和计算器就能完成。等这些都通过再上SPICE或者更精确的仿真对比你的表达式基本就靠得住了。5. 我踩过的坑符号、顺序、量纲5.1 ABCD符号约定不一致ABCD矩阵最大的坑就是符号约定。市面上有的教材用的是I2流入网络的方向有的用流出方向有的矩阵写的是[V1;I1]M[V2;I2]有的写[V2;I2]M[V1;I1]。我自己就吃过一次大亏参考一本滤波器设计手册的ABCD组合矩阵结果怎么算都不对后来发现手册用的I2方向和我推导时相反。解决办法是每一步都固定一套约定并且只使用串联阻抗、并联导纳这些容易验证的基础矩阵。每次搭完矩阵先用一个一阶RC电路验证一遍再往前走。这个验证成本极低能省掉后面所有的返工。5.2 EET空阻抗不是短路阻抗这是EET里最容易误解的点。Z_n的全称是“空阻抗”这个“空”不是“短路”而是“输出为零”。很多初学者把Z_n理解成输出短路时看到的阻抗然后代进公式发现结果怎么都不对。区别很微妙。输出短路是简单地让输出电压等于零不考虑输入源是否参与空条件则要求你调整输入源让输出传递函数本身的增益为零这个状态和短路完全不同。判断方法我再强调一遍Z_n计算时输出必须处于“空状态”也就是输入信号被调整到让输出响应为零。这时候额外元件两端看到的阻抗才是正确的Z_n。5.3 Bode图相位展开和低频方向用工具画Bode图的时候相位曲线经常因为反正切函数的周期性问题发生180°跳变。这是求相位时的unwrap没做对不是电路本身的问题。画图前确认一下相位是否做了连续展开。另外很多高阶网络在低频端相位不是从0°开始而是从±180°开始这通常意味着有一个直流增益为负的路径。看到这种情况别慌回到增益表达式里去核直流符号。如果分子分母在s0处同号相位就该从0°开始反号则是180°都很正常。5.4 量纲与极值检查最后一条经验也是我每次都会做的事在表达式里把所有时间常数(τRC)的量纲写清楚确认每个转折频率的单位是rad/s还是Hz。Bode图的横轴如果是Hz那么ω1/RC要除以2π才能对上。还有量级检查。如果你算出一个极点频率是10^15 rad/s基本可以肯定是把皮法写成了法拉或者把千欧写成欧姆。手推传递函数的时候随手做数量级估算比很多复杂验证都有效。5.5 常见问题速查表现象最可能原因排查思路直流增益偏大或偏小并联负载被重复计入检查矩阵里是否已有该负载同时又在Z_L里代了一次极点频率差2π倍rad/s与Hz混淆统一用脉冲频率或统一用角频率检查Bode图高频斜率不对ABCD级联顺序反了从输入端到输出端依次相乘不能反着乘相位曲线出现180°跳变相位展开问题使用unwrap处理或手动补上±2π跳变EET修正因子结果匪夷所思Z_n用了短路而非空状态重新确认输出是否处于空条件高频出现多余零点跨接电容路径未考虑查看反馈/寄生电容是否正确建模为额外元件6. 写在最后的一点个人体会这套三步法真正帮我打开局面是在一次电源补偿网络的调试中。当时一个跨接电容让系统多出一个零点SPICE仿真怎么调参数也看不清它的来源。我用ABCD把前向通路整理清楚再拿EET单独处理那个跨接电容很快就写出零点和极点表达式Bode图一画哪个元件负责提相位、哪个元件负责砍带宽一目了然后续调试只花了半天。我的体会是无论工具怎么组合传递函数分析的核心始终是“结构性思考”。先拆结构再定位关键变量最后用频域响应验证。这个顺序倒过来就会变成瞎调参数、永远看不到全局。ABCD、EET和Bode图恰好对应了这个思考过程的三步少哪一步都不完整。哪天你被一个复杂网络卡住不妨先停下来别急着开仿真软件把矩阵写出来把碍事的元件挑出来再想一下Bode图该长什么样。你会发现答案其实早就在电路结构里等着你了。
返回列表