为什么模拟世界由反馈说了算
先说一个关于模拟器件的难堪真相:它们糟透了。一个裸的共源级,今天增益可能是 40,明天就变成 80,会随温度、电源电压、以及硅片出 fab 时那场随机抽奖而漂移。单个晶体管的本征增益 gm*ro 很大,却极不精确。如果你只想着挑一个'增益差不多对'的晶体管来搭精密放大器,必败无疑——你实际拿到的增益会上下浮动到两倍之多。
负反馈就是那条逃生通道。一句话概括它的思路:测量自己的输出,拿它跟你想要的值比一比,再把误差反馈回去自我纠正。把晶体管的裸增益拉到要多高有多高——松垮也好、漂移也罢、随它去——然后在它外面套一个环路,这个环路不停地说'你有点偏高,退一点'或'你有点偏低,再使劲'。令人惊叹的回报是:闭环行为不再依赖那个糟糕的晶体管,而几乎完全取决于两个电阻的比值(或电容比值)——这些器件你*能够*在片上匹配到零点几个百分点的精度。
可以把它想成开车。发动机(裸增益)动力强劲却很粗糙——你绝不会把油门固定在某个精确位置,然后就信任汽车自己保持在车道里。相反,你会*盯着车道*,不停地微调方向盘。你的眼睛就是反馈。汽车的精准不是来自一台完美的发动机,而是来自套在一台不完美发动机外面的纠正环路。负反馈对电压和电流做的正是这件事。
负反馈与环路增益
我们给各个部件起个名字。把放大器裸的开环增益叫做 A(很大——也许 10,000 或 100,000)。输出的一部分 beta 被反馈回去,并从输入中减掉。乘积 **T = A*beta 是整个环路里最重要的一个数字;我们称之为环路增益**。直观地说,它就是*环路自我纠正的力道有多猛*——那句'你跑偏了,快修正'的喊话,比起引发它的误差,到底响了多少倍。
A_closed = A / (1 + A*beta) ; when loop gain T = A*beta >> 1: A_closed ~= 1 / beta
盯着这个结果多看几眼,因为它就是全部的要害。当 **T = A*beta 很大时,闭环增益就简单地变成 1/beta。那个反复无常的 A 消失了。如果 beta 是由两个匹配电阻构成的分压器,那么你放大器的增益此刻就是一个电阻比值——稳定到零点几个百分点,A 翻倍还是减半都无所谓。我们没有把 A 做好;我们是让电路不在乎** A。
环路增益还告诉你这个近似到底*有多准*。闭环增益并不正好等于 1/beta——它会差出大约 1/T 的相对误差。所以环路增益为 1,000(60 dB)时,大致能给你 0.1% 的增益精度;环路增益为 100 时,约为 1%。环路增益越大,意味着精度越高、线性越好、对各种扰动的抑制也越强。这就是为什么模拟设计师对增益永远饥渴:每一分贝环路增益,都是存进银行的精度。
代价:稳定性
假如反馈是免费的,那每个放大器都能有无穷大的环路增益,咱们就可以收工回家了。问题出在时间上。'把输出反馈回输入'这句话,悄悄假设了输出会*瞬间*响应。可它并不会。每一级都有需要时间去充电的电容,所以反馈回来的信号总会晚到一点——既有延迟,相位也被移动了。
一点小延迟没什么害处。但接下来是噩梦场景。负反馈之所以管用,是因为反馈回来的信号反相 180 度——它做减法、它对抗、它纠正。现在假设在某个频率上,电路自身的种种延迟又额外攒出了 180 度相移。把这一份加到原本有意为之的 180 度上,就得到 360 度——而 360 度跟 0 度是一回事。你的负反馈悄无声息地变成了正反馈。此刻那个'纠正'不再对抗误差,反而在助长误差。
所以反馈的代价,是不稳定这把始终悬着的剑。你为了精度而堆上去的环路增益越多、为了那份增益而级联的级数越多,累积的相移就越大——你也就越靠近那道 360 度的悬崖。接下来要讲的补偿之道,正是在尽量保住更多环路增益的同时,让自己稳稳退在悬崖边之外的艺术。精度与稳定性彼此向相反方向拉扯;设计,就是在二者之间谈成的那纸停战协议。
极点与相位裕度
要管好稳定性,我们得把'在哪个频率、有多少相移'这件事说具体。信号路径里每一个 RC 时间常数都会产生一个极点:在这个频率以上,增益以每十倍频程 20 dB 的速率滚降,信号也开始累积相位滞后,每个极点渐近地贡献 90 度。单独一个极点最多只能让你损失 90 度——它自己是安全的。麻烦从*第二个*极点的相位滞后叠加到第一个之上时开始,把总相移一步步推向那致命的额外 180 度。
衡量你这道安全缓冲的干净办法,是 [[phase-margin|相位裕度]]。先找到环路增益 |T| 正好掉到 1(0 dB) 的那个频率——这就是交越频率或单位增益频率,是环路还能维持信号的最后一个频率。然后读出环路在这个频率上有多少相移。相位裕度就是你在撞上 180 度之前还剩多少度相位:
phase_margin = 180 deg + angle(T) evaluated at the frequency where |T| = 1 ; PM >= 60 deg -> smooth, well-damped, no ringing (the design target) ; PM ~ 45 deg -> acceptable, mild overshoot/ringing ; PM -> 0 deg -> on the verge of oscillation
对这个数字的直觉:相位裕度就是你这个反馈环路的阻尼,跟汽车的减震器一模一样。相位裕度大(60 度及以上)就是阻尼充足——拿一个阶跃去打它,输出会干净利落地升到目标值。相位裕度寒酸(低于 45 度)就是欠阻尼——输出会过冲并振铃,在目标值上下来回弹跳几下才安定下来,就像减震器磨坏了的车压过一个坎。零相位裕度意味着完全没有阻尼:它会永远振铃下去。那就是一台振荡器。
频率补偿
于是你测了自己的环路,相位裕度是吓人的 20 度——它振铃,甚至直接振荡。解药是 [[frequency-compensation|频率补偿]]:刻意重新塑造环路的增益-频率曲线,让 |T| *在你还剩有舒服的相位余量时*就穿过 1。你并没有在增加正确性;你是在赎回稳定性,而且通常要拿一些带宽去换。
最常用的主力技术是主极点补偿(dominant-pole compensation)。诀窍在于:挑出一个极点,故意把它的频率推得*很低*——低到光靠这一个极点,增益就已经一路滚降到 1,赶在其他那些更快的极点有机会添上各自的相位滞后*之前*。如果在交越频率处只有一个极点在起作用,那么最坏情况的相位滞后也不过 90 度,留给你一份阔气的约 90 度相位裕度。你拿带宽(环路如今变慢了)换来了坚如磐石的稳定性。
在片上,制造那个主极点的优雅办法是米勒效应(Miller effect)。把一个小小的补偿电容 Cc 跨接在一个高增益反相级两端,从输入端看过去,这一级自身的增益会把电容的等效大小*放大*约 (1 + 增益) 倍。一个区区 2 pF 的电容就能表现得像几百 pF,把主极点大幅往下拽,却几乎不占芯片面积。额外的好处是,米勒补偿还会劈开极点(splits the poles)——它把主极点往下拉的*同时*,把次极点往上推,拓宽了二者之间的安全间隔。这就是为什么你日后碰到的几乎每一个两级 op-amp 里头,都藏着一个米勒电容。
.ac dec 100 1 1G ; sweep frequency, plot loop gain & phase ; read GBW (where |T| crosses 0 dB) and the phase there: GBW ~= gm1 / (2*pi*Cc) ; bigger Cc -> lower GBW, more phase margin
压摆率:大信号下的极限
到目前为止的一切——极点、相位裕度、GBW——都活在小信号的世界里,在那里我们假设放大器表现得是线性的,摆动幅度很小。但只要你让一个 op-amp 去做一次*大幅度*的快速跳变,一个截然不同、毫不留情的极限就会接管:[[slew-rate|压摆率]],也就是输出电压所能变化的最大速率,单位是伏每微秒。
它的成因简单得让人愉快,而且很物理。要让输出动起来,放大器必须给那个补偿电容 Cc 充电或放电,而它能用来干这件事的,只有输入级所能提供的那点有限的尾电流。当输入阶跃很大时,输入差分对会把它全部的尾电流一股脑灌进 Cc——它满负荷、完全偏向一侧、再也不待在自己那温柔的线性区里了。于是输出以一个恒定速率爬升,这个速率由'可用电流除以电容'决定:
slew_rate = I_tail / Cc ; volts per second, large-signal limit ; small-signal speed (different beast): GBW = gm / (2*pi*Cc), gm = 2*I_d / V_ov ; -> SR = (I_tail / Cc) is set by CURRENT; ; GBW is set by gm. You can have great GBW and lousy slew rate.
这里有个能让人少踩坑的心智模型:带宽是你对一句耳语能反应多快;压摆率是你对一声大喊能反应多快。一只扩音喇叭也许能忠实重现一段轻声细语(小信号带宽很好),却会把一声突如其来的大喊彻底搞糊,因为它没法那么快地推动空气(受压摆率限制)。在压摆过程中,放大器*根本不是*一个线性系统——反馈实际上变成了开环,直到输出追上为止,而你精心设计的那条干净的指数建立曲线,会退化成一条难看的直线斜坡。