1. 为什么模拟PID到现在还有市场:一个真实项目带来的启发
前年帮实验室搭一台小型温度箱,我本来笃定要上STM32做数字PID。采样周期从2ms一路调上去,积分限幅、微分滤波、前馈补偿全试了一遍,还是被那个两分钟的滞后环节折磨得够呛。后来一位前辈看不过眼,从抽屉里翻出几颗NE5532和一堆电阻电容,一个下午焊了一块模拟PID板子,接上铂电阻桥和功率管,反而干净利落地把温度稳在了正负0.1度以内。从那以后我对“运放搭PID控制器”这件事彻底改观了。
这篇文章不是考古,是实打实的手把手教程。我从最基础的反相比例放大电路、同相比例放大电路讲起,一点点引出积分支路和微分支路,最后拼成完整的模拟PID控制器。全程会讲清楚运放虚短虚断的用法、GBW和压摆率这些选型指标如何影响电路,也会附上电容电阻取值的计算过程,以及我在CircuitJS仿真和实物调试里踩过的坑。
这套知识适合谁?正在做电子竞赛、自动化仪表、电机伺服或电源闭环的人,都值得看一眼。你可能最后还是会用单片机,但模拟PID能让你对比例、积分、微分的物理含义有非常直观的感觉——那种“眼见为实”的理解,是调参界面给不了的。
2. 一切的基础:运放的虚短、虚断和真实运放给理论挖的坑
2.1 两个“虚”,抓住之后所有放大电路都能画成简单数学式子
想搭运放PID,先过虚短虚断这一关。虚短是运放工作在深度负反馈时,两个输入端的电压几乎相等:V+约等于V-。理论计算里我会直接当它相等。虚断则是运放输入端几乎不取电流,输入阻抗极高,计算时当作开路。
这两个“虚”有多好用?拿反相比例放大器举例:反相输入端因为虚短被“钉”在地电位附近,这叫虚地。输入电流就是Vin/R1,又因为虚断,这个电流不能进运放内部,只能流过反馈电阻Rf,于是Vout直接就等于负的Vin乘以Rf/R1。一个签名就完成了放大倍数的推导。整个过程不需要背任何复杂公式,只要抓住“电流从电阻网络里走,不往运放里漏”这一条逻辑。
PID控制器到了后面会更复杂,误差放大器、积分电容、微分电容混在一起,但只要每个运放节点能套用虚短虚断,整个电路就能拆成若干条简单的一次方程联立。我在文章后面推导积分器和微分器时还会反复用到这套规则,现在务必把这两个概念焊进脑子里。
2.2 GBW、压摆率和失调电压:理论之外的三个刺客
如果只看虚短虚断,你会以为运放只要一接反馈就永远正确。实际项目里三件事会跳出来打脸:GBW不足导致高频增益坍塌,压摆率不够导致输出波形变梯形,失调电压导致积分器本身偷偷漂移。
GBW是增益带宽积,单位是Hz。它意味着运放开环增益和可用带宽的乘积是个定值。比如一颗GBW为10MHz的运放,闭环放大10倍时,理论带宽就降到了1MHz左右。在PID控制器里,比例级和微分级往往需要中高增益,如果被控对象的误差信号还叠着几kHz的噪声分量,普通运放可能在到达有用频率前就先掉了增益,控制器实际表现就会大打折扣。
失调电压Vos的影响更隐蔽。它相当于在运放输入端串联了一个微小电池。做比例放大时,输出端也会多出一点偏置电压,你加大反馈电阻后甚至能把几十毫伏的误差放大成明显的直流偏移。在积分器里它更致命,因为积分器是对时间累积的,哪怕只有1mV失调,积分电容也会被这1mV持续充电,导致输出不断往电源轨上漂。
所以,这部分我会在后面各节反复强调同一件事:理论推导用理想运放,选型号、定电阻时必须给GBW、SR和失调电压留出余量。这不是洁癖,是实物能不能用的分界线。
3. 先从“比例”下手:反相与同相比例放大电路从推导到元件值
3.1 反相比例电路推导与阻抗问题
先搭P这一路。反相比例放大电路是最常见的一种比例电路,结构很简单:输入信号经R1接到反相输入端,反馈电阻Rf从输出接回反相输入端,同相输入端接地或者接参考电位。利用虚短,反相输入端的电位就是0V,这地方叫虚地。利用虚断,R1电流就等于Rf电流。
电流方程是Vin除以R1,等于负的Vout除以Rf,整理得到Vout等于负的Rf除以R1再乘Vin。这里的负号表示反相,输入为正时输出为负。放大倍数只用电阻比决定,跟运放本身的开环参数无关,这是深度负反馈的威力。
但反相电路有个实际缺点,输入阻抗约等于R1。如果你前级是一个高阻抗的传感器或者上一个运放的输出,问题不大。可如果Vin直接来自一个内阻很大的铂电阻桥,等于你的R1串上了一个不确定的源内阻,增益就会出现偏差。这种情况下我会优先考虑同相结构,或者先在前面加一个缓冲器。
3.2 同相比例放大电路和控制器配合的“主选身份”
同相比例放大电路在PID里我更常用。它的输入接到运放同相端,反馈电阻Rf从输出接回反相端,反相端再经过电阻R1接地。因为虚短,反相端电位等于输入信号Vin。又因为Rf和R1串联分压,反相端电压等于Vout乘以R1除以(R1加Rf),于是Vout等于Vin乘以(1加Rf除以R1)。
关键好处是输入阻抗极高,对前级基本不会造成负载影响。在PID系统中,我通常先用差分放大电路把设定值和反馈值做差,得到误差信号Verr,然后这个误差信号直接送给同相比例放大电路作为P支路。同相电路不会把信号翻转,误差极性和控制量极性容易保持直观,这在调试阶段能省下很多判断符号的时间。
同相放大倍数永远是大于1的。如果你需要小于1的P增益,就在输入前加一个可调电阻的分压网络,或者改用反相结构。我习惯在同相输入端前面接一个10k电位器加20k电阻的分压结构,这样Kp可以从零点几连续调到几十倍,非常方便现场调试。
3.3 比例级实操参数怎么定
比例级的电阻取值,我一般让输入电阻选在10k到100k之间。太小了,前级驱动电流会比较大;太大了,运放偏置电流在电阻上产生的压降会被放大,造成额外漂移。
比如我要一个同相比例放大电路,目标增益Kp等于5,可以直接取R1等于10k,Rf等于40k。验算一下,1加40k除以10k等于5。如果目标是Kp等于3.5,就取R1等于10k,Rf等于25k,再用电位器微调。输出接近满幅时,还要核对一下增益带宽积GBW。假设系统误差信号里需要处理到10kHz的分量,Kp为10,那么这颗运放的GBW最好不低于1MHz,留下10倍余量就是10MHz。NE5532在这里就很合适。
还要提醒一句,同相和反相电路的放大倍数推导过程虽然简单,但很多人实际焊板时容易把反馈电阻和接地电阻的位置搞反,接完发现增益不对。用万用表顺着反馈环路走一遍,确认是从输出端到反相输入端的那个电阻,就不会错。
4. 积分这一路:积分器、积分漂移和泄放电阻的取舍
4.1 从反相放大器变成积分器只要一个电容
积分项的作用是消除静差。单靠比例放大,系统总会有稳态误差,因为必须误差存在才能维持输出。积分器则把误差随时间累积起来,只要误差不消失,积分输出就一直变化,最终把误差压到零。
积分电路本质上就是从反相放大器演化来的,把反馈电阻Rf换成电容C。仍然是虚短虚断,反相输入端虚地,输入电流为Vin除以R,这个电流流向反馈电容,给电容充电。电容上电压变化率等于电流除以电容,于是Vout对时间的导数等于负的Vin除以R再除以C。两边积分后得到Vout等于负的1除以(R乘C),再对Vin做定积分。
这里的R乘C就是积分时间常数,单位是秒。数值越大,积分越慢,输出变化越温和。数值越小,积分作用越强,系统越容易超调甚至震荡。比如R等于100k,C等于1微法,时间常数就是0.1秒,当输入误差为1V时,积分输出斜率为每秒10V。这个换算关系在调参时非常有用。
4.2 零漂问题跟失调电压的关系
所有第一次实际搭建积分器的人都会被同一种现象惊吓:输入接地,输出却慢慢往正轨或负轨上爬。这不是幻觉,是失调电压在给积分电容“偷偷充电”。根据公式,漂移速率大约是失调电压除以输入电阻再除以电容。一颗失调电压为1mV的运放配合100k输入电阻和1微法电容,漂移率算出来是0.01V每秒,看起来不大,但一分钟后就漂了0.6V,足够让后级电路饱和了。
解决办法有几个方向。第一是选择低失调运放,比如OP07这类低失调型号,在积分级使用就非常合适。第二是给反馈电容并联一个大阻值的泄放电阻,比如10兆欧到几十兆欧。这个电阻把积分器从理想积分变成了低频惯性环节,直流增益从无穷大降为有限的负的RF除以R,但这个增益通常还有几千倍,不会明显影响静差消除能力。第三是加入手动复位开关,比如用模拟开关并联在积分电容两端,上电初期或者系统启动时把积分器清零。
务必注意,泄放电阻不能取得太小,否则积分器在低频段的相位特性会提前被扭弯。我给出的经验是泄放电阻至少要比输入电阻大100倍甚至更多。这样对正常工作频率的积分行为影响几乎可以忽略,但又能把失调电压引起的漂移抑制在可接受范围。
4.3 积分支路的实际布局
搭建积分支路时,我会在输入电阻前再加一个20k左右的平衡电阻到同相输入端。这个电阻的作用是补偿偏置电流的影响:如果同相端直接接地,偏置电流会单独从反相端流过输入电阻,产生额外误差;在同相端串一个等效电阻,可以让两条输入臂对偏置电流的阻抗对称,把偏置电流误差压下去。虽然低失调运放对偏置电流本身已经处理得不错,这个习惯仍然值得保留。
积分支路的电容也很讲究。普通电解电容漏电大而且误差大,不适合当积分电容。我一般选CBB电容或者聚丙烯薄膜电容,温漂小,绝缘电阻高,积分稳定性好得多。容值在微法级就足够满足大多数PID应用,不必追求大容量。
5. 微分这一路:理想微分器的噪声、稳定性及限带处理
5.1 理想微分器的增益曲线为什么不能直接用
理想微分电路的公式很简单,把比例电路中的输入电阻换成电容,反馈电阻保留,输出就等于负的Rf乘C再对输入电压求导。频域上看,它的增益随频率线性上升,每一倍频程增加6dB。这个特性听起来正好能预测变化趋势、提供阻尼,但实际应用时往往是最让人头痛的一路。
问题在于,增益随频率无限上升意味着高频噪声被无限放大。测温热电偶、电位器电刷噪声、运放自身噪声,这些高频分量在微分器输出端会盖过真正的误差变化信号。很多PID实物板子一接上微分支路就开始高频振荡、啸叫,大概率就是这个原因。
频率升高后微分器增益会越来越大,同时运放的GBW又限制不了这个开环通道,最后可能会让运放在比较高的频率上发生不稳定。所以理想微分器基本只能存在于教科书里,实物电路必须给它加限带。
5.2 串联电阻改变的一切
最常见的限带办法,是在输入电容前面串联一个电阻R1。这样输入通道不再是纯电容,而是电阻和电容串联。低频时电容阻抗远大于R1,微分作用基本保留;高频时R1成为主导,通道增益被限制在负的RF除以R1这个有限值,不再无限上升。
这个串联电阻同时引入了零点,等于给微分支路加了一个低通上限。上限频率大约是1除以(2π乘R1乘C)。当实际信号频率低于这个上限时,电路表现接近理想微分器;高于这个上限后,电路退化为一个固定增益放大级。噪声经固定增益放大,不再是无限放大,振荡问题基本就解决了。
如果还想进一步压制残余噪声,可以在反馈电阻Rf上并联一个小电容Cf,构成一个再高一些的低通极点。但这个电容要选得很小,否则它会把微分作用本身也滤掉。我一般先不加Cf,若输出还有轻微高频毛刺,再从几皮法到几十皮法慢慢试。
5.3 微分支路参数选择公式
微分时间常数由Rf乘C决定。假设我们需要Kd等于0.05秒,取Rf等于100k,那么C应为0.5微法。限带频率由R1乘C决定。若希望微分作用可靠覆盖到1kHz的信号,那就让R1乘C远小于1除以(2π乘1000),取R1等于1k,C等于0.5微法时,R1乘C等于0.5毫秒,对应限带频率约为318Hz,这个值略低,可以再调小R1到510欧。
一个更顺手的经验是:先定微分时间常数,再定R1。R1取Rf的百分之一到十分之一之间,就能保证噪声增益不超过几十倍到几百倍。以Rf等于100k为例,R1取1k到10k,记下这个范围后面的调试表里还会用到。
还有一个容易被忽略的常识,微分器对开关电源的纹波和地弹噪声相当敏感。给微分运放电源脚加上100nF和10微法两级去耦电容,并把电阻电容引脚尽量缩短,比任何额外滤波都有效。按照拓朴来看,D支路永远是第一个被噪声打穿的通道。
6. 把P、I、D三兄弟焊到一张板上:完整拓扑与参数映射
6.1 误差检测、三路并行与求和级
完整模拟PID需要先有一级误差检测。最简单做法是直接用差分放大电路,把设定值Vset接到同相输入,把反馈量Vfb接到反相输入,四个电阻都取相同值比如10k,输出就是Vset减去Vfb。注意这种经典差分电路的输入阻抗不算太高,如果前级信号源较弱,先加电压跟随器缓冲一下。
差分放大电路输出Verr后,分成三路并行。P路用同相比例放大电路得到Vp等于Kp乘Vin。I路用反相积分器得到Vi等于负的Ki对Vin积分。D路用限带微分器得到Vd等于负的Kd乘Vin的导数。这三路信号需要合成一路控制量,这就轮到运放加法器出场了。
运放加法器本质上是一只反相放大器,有多个输入电阻并联在反相端。第一路输入经过Ra,第二路经过Rb,第三路经过Rc,反馈电阻为RF,输出就等于负的RF除以Ra乘Va,负的RF除以Rb乘Vb,负的RF除以Rc乘Vc加和。如果让Ra、Rb、Rc都取相同值,那么加法器就是对三路信号做等权相加并反相。
由于P路是同相输出,I路和D路是反相输出,加法器合成后再加一个反相缓冲器,就把整体极性整理成正向控制。整个链条是:误差信号经差分级生成,P路不加符号翻转,I、D路先翻转,最后加法器与输出缓冲两次翻转,最终控制量和误差方向一致。若你的执行器需要反向极性,直接把末尾缓冲器去掉或把差分级的两个输入交换即可。
6.2 电路元件值到PID参数的换算
建议先把每一路的独立参数定清楚,再考虑求和级的公共缩放。P路的Kp由同相放大电路决定;I路的Ki等于1除以输入电阻再乘积分电容;D路的Kd等于反馈电阻乘输入电容。求和级的公共电阻比例会对三路信号同时缩放,相当于整体控制器增益,一般我放在最后调整。
举一个具体的电机转速控制例子。设定转速对应的电压和测速反馈电压范围都是0到5V,先期望Kp约3.5。P路取R1等于10k,Rf等于25k,在同相输入端前加一个分压电位器备用,Kp约为3.5。期望Ki约到1.2每秒,取积分电容为10微法,那么输入电阻R应该等于1除以(1.2乘10e-6)约83k,取标称82k后Ki约1.22每秒。期望Kd约0.04秒,取反馈电阻Rf等于100k,输入电容C为0.4微法,可用标称0.39微法。限带电阻R1取1k,限带频率约408Hz,够了。
最后把Vp、Vi、Vd接到加法器,三路输入电阻都取10k,反馈电阻也取10k,再进行一次输出反相。这样接线时每路增益都没被额外改变,参数换算完全清晰。以后想微调整机增益,单独调整加法器反馈电阻即可。
7. 上电之前先仿真:CircuitJS摸拟过程与增益设置
7.1 CircuitJS中把运放增益“拉成无穷大”
建议任何人在焊板前先在电路仿真软件里把整个PID链路跑通,我用得最多的是网页版CircuitJS。它加载快,拖拽方便,非常适合验证拓扑和粗调参数。
很多人第一次在CircuitJS里放运放时会发现,仿真结果和课本上的理想运放差距不小,原因是这个软件里的运放默认增益不是无穷大,而是一个有限数值,通常在100000左右。虽然是很大,但对某些闭环增益极高、环路敏感的场景,依然会产生可见误差,尤其积分器长时间仿真时。想要更接近理想运放,双击运放元件本体,把增益设置里的值改成1e9之类的极大数就行。它不会真的“无穷大”,但效果上已经完全可以视作理想运放。
同时留意运放的输出范围和电源电压。双电源仿真就设正负15V,单电源仿真就设正5V或12V,输出范围会自然限制在电源轨之间。积分器输出撞轨这种经典问题,在仿真里反而能提前暴露,比实物烧完再查要省心太多。
7.2 用临界比例法标定PID参数
仿真搭好后,只靠拍脑袋调参效率极低。我习惯用经典的临界比例法。先把积分支路断开、微分支路短路掉,只保留P路。然后从很小的Kp开始增大增益,观察输出波形,直到系统出现等幅振荡。这时的增益叫临界增益Ku,振荡周期记为Tu。
根据齐格勒-尼克尔斯经验表,P控制器取Kp等于0.5Ku;PI控制器取Kp等于0.45Ku,积分时间Ti等于Tu除以1.2;PID控制器取Kp等于0.6Ku,Ti等于Tu除以2,微分时间Td等于Tu除以8。注意Ti和Td还需要再换算成电路参数:Ki等于Kp除以Ti,Kd等于Kp乘以Td。再结合第6节的公式反推电阻电容值,就能得到一组有依据的初始参数。
这个表给出的参数偏激进,实际系统如果执行器饱和或者存在较大死区,还需要手动把积分系数略微调低。但作为起点,它确实比我以前从头盲调到半夜高效得多。
7.3 调参时看哪些波形
在CircuitJS里调试时,我习惯同时挂几个虚拟示波器:一个是系统输出,一个是误差信号,一个是三个支路的独立输出。这样能很直观地看出系统处于欠阻尼还是过阻尼,也能分辨当前的振荡到底来自D支路的噪声放大还是真实环路的临界振荡。
如果系统响应慢吞吞、稳态误差迟迟不消除,基本是比例增益太低或者积分太弱,对应波形是误差曲线拖着长尾巴。如果超调大、来回摆动,则要把比例增益降下来或者增大积分时间常数。如果输出出现密密麻麻的高频毛刺,多半是微分支路在处理噪声,先把R1调大,或者减小Rf乘C这个微分时间常数。别迷信数据,先看波形,再动手改元件,这样才谈得上手把手。
8. 上真实硬件前必须检查的细节:GBW、压摆率、布线与寄生
8.1 GBW与SR的提前预留
光在仿真里跑通还不够,实物选型必须验证两颗硬指标的余量。第一颗是GBW,闭环增益越大可用带宽越小,要求GBW至少等于最高信号频率乘以闭环增益,再留5到10倍余量。拿前面的P路为例,Kp为10,信号里有10kHz的分量,那么GBW至少要有10乘10k乘5,约500kHz,NE5532这种10MHz级别绰绰有余,LM358这种1.1MHz也够用,但如果换成把Kp做到100倍,LM358就明显偏紧了。
第二颗是压摆率SR。输出信号斜率不能超过运放SR,否则输出会变成梯形波,控住了幅值却控不住相位。估算公式为SR约等于2π乘以最高频率再乘以输出峰值。若最高频率为10kHz,输出峰值为5V,算出来约0.31V每微秒,看起来很低,但若把频率提高到100kHz,就变成3.14V每微秒,再留3倍余量,要求约9.4V每微秒,这时NE5532的9V每微秒就很紧张,TL072的13V每微秒反而更稳。选型前花两分钟算这笔账,能避免板子焊完发现输出波形发圆。
我习惯把积分级用低失调精密运放,比如OP07。比例级和微分级追求带宽和SR,选NE5532或TL072。为什么微分级特别挑SR?因为微分器输出本身就含着输入信号的斜率,斜率越大输出摆幅越大,SR不够时先饱和的原件一定是它。
8.2 失调电压计算与偏置电阻补偿
做实物前务必估算整条链路的失调电压。反相放大器的输出失调大约是1加Rf除R1再乘Vos,再加上偏置电流在电阻上造成的误差。假如放大倍数为51倍,运放Vos为2mV,仅失调电压就会在输出带来约102mV的直流偏移。PID环如果对静态精度要求高,这个偏移会被积分器当成真实误差继续累积,结果是控制量和设定点之间始终隐藏着一个直流偏差。
补偿手段有两个。一个是在同相输入端串入阻值等于R1和Rf并联值的电阻,让两个输入端的偏置电流压降对称抵消。另一个是在积分器输入级前加入调零电位器,但温漂还是存在,所以核心还是选低失调运放。失调电压计算公式并不复杂,却是我见过最多人跳过的一步,结果就是“模拟PID上电后输出飘得离谱”,最后只能靠积分器硬抗。
8.3 双电源单电源的处理与布线心得
运放PID控制器里,积分器必须处理正负两个方向的误差,所以最好用双电源供电,正负12V或正负15V都很合理。单电源下想实现真正的双向积分,必须把参考点抬到电源电压一半,比如做成单电源5V时把“地”变成2.5V虚地,然后所有输入输出都相对这个虚地工作。这个做法可行但很麻烦,给整套电路加一个2.5V虚地发生器后,还要重新整理所有参考电平,不如直接上一组双电源稳压来得干净。
布线方面,运放电路最怕电源内阻和长引线引入的高频寄生。每颗运放电源脚旁都要就近放100nF陶瓷电容,再在电路板电源入口放一个10到100微法的电解电容做低频退耦。积分电容和微分电容远离发热元件,因为电容温漂也会直接影响时间常数。电位器最好用多圈型的,PID调试时单圈电位器旋转一点就让增益翻倍,很容易跳过临界点。
我在实际调试中最常重蹈的覆辙是微分支路一接上就振荡,最后发现不是参数问题,而是示波器探头地线夹得过长,等效于给微分器额外注入了一个大噪声源。把探头改成弹簧接地针后,波形立刻干净。做模拟PID就是不断跟这些藏在电路细节里的“实际”打交道,多绕几次,你自然就会在画板之初给运放留出该有的退耦和屏蔽位。